Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Hans_
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 4
#1

__attribute__(section) - C++

11.02.2016, 08:28. Просмотров 530. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Есть интересная идея - объединение разрозненных данных в одну кучку.
Например, в разных местах кода я объявляю переменные с указанием в какой секции они должны расположиться. тем самым я получаю массив данных лежащих рядом дуг с другом.
Вопрос, как получить указатель на начало этой секции и ее размер?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2016, 08:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос __attribute__(section) (C++):

Что такое __attribute__((packed)),и когда это стоит использовать? - C++
Читаю чужие исходники,там встречается __attribute__((packed)) и используется в структурах.Я пробовал приписывать это окончание также к...

Как хранить переменную типа char* в named shared memory section? - C++
Во общем есть код: extern "C" __declspec(dllexport) void SetOptions(char* string); #pragma data_seg("sms") char* viewString =...

Как можно просмотреть все зарегистрированные имена SharedMemory Section в Windows? - C++
Вот есть несколько моих программ, которые общаются через шаред мемори, созданную по средствам CreateFileMapping с определёнными именами (в...

Как убрать вывод компонента catalog.section.list в компоненте catalog.section - 1С Битрикс
Если нажать на первый уровень каталога рис 1 появляется весь товары этого уровня. Но и выводятся ссылки второго уровня рис 2. Как можно...

Ошибка: expected «=», «,», «;», «asm» or «__attribute__» before «*» token - C (СИ)
#include <stdio.h> main() { FILE *in *out; long sym; if (!(in = fopen("text.txt", "r"))) { printf ("can't open the...

Свойство After Section - MS Access
Кто подскажет как сделать следующее Есть таблица "Клиенты" который состоит из ФИО, Дата, Сумма и есть отчёт "Клиенты" где отображается...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15504 / 7002 / 1105
Регистрация: 02.05.2013
Сообщений: 11,436
Завершенные тесты: 1
11.02.2016, 08:49 #2
Цитата Сообщение от Hans_ Посмотреть сообщение
тем самым я получаю массив данных лежащих рядом дуг с другом.
И в чем выгода?
Данные с общими атрибутами, кстати, и так размещаются компоновщиком в одной секции.
Hans_
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 4
11.02.2016, 09:41  [ТС] #3
В таких секциях я планирую хранить описание класса (description). для каждого класса определяется одноименная секция, а внутри этого класса описываются поля в произвольном порядке, description-ы которых автоматически попадают в этот массив.
Порядок размещения description-ов внутри массива мне не важен. данные имеют однотипный формат и легко парсятся какой то вспомогательной функцией, главное узнать начало и конец этого массива.
У меня сейчас есть подобное решение, но мне приходится в конкретном месте прописывать имена полей, которые должны попасть в этот массив, а я хочу, чтобы помеченные поля автоматически попадали в DescriptionList при их объявлении.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
DESCRIPTION_LIST(Diesel); //Макрос объявления секции
struct Diesel {
    constexpr Diesel(const Valve &valve):
        valve(valve)
    {}
private:
    SAVED_FIELD(Frequency, "Обороты двигателя", frequency) = 1800_rpm; //Макрос описания сохраняемого поля, Тип поля, Описание поля, Имя поля
    SAVED_FIELD(Valve, "Актуатор газа", valve);
public:
    DESCRIPTION_PTR(); //Макрос создания массива description-а в кодовой памяти
};
template<const char* CAPTION>
using DieselVariable = Variable<Diesel, VarInfo<CAPTION> >;
В итоге получается умная система, умеющая сохранять и загружать все помеченные параметры, автоматически генерировать меню параметров, протоколы взаимодействия и т.д. и все это генерировать на этапе компиляции и помещать в кодовую память.
При создании сложной системы с тысячами параметров очень легко ошибиться или что нибудь забыть, а при таком подходе компилятор сам все сгенерирует и не даст программисту допустить глупые ошибки.
Убежденный
Системный программист
Эксперт С++
15504 / 7002 / 1105
Регистрация: 02.05.2013
Сообщений: 11,436
Завершенные тесты: 1
11.02.2016, 10:29 #4
Я так и не понял, какую этот подход решает задачу.
Генерировать описание классов и документацию можно банально doxygen-ом.
Можно его вообще сделать частью процесса сборки.

А иметь в exe кучу секций на каждый класс только ради описания -
это мне кажется нерационально. При этом еще и код усложняется и
теряет такое качество, как переносимость.
Hans_
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 4
12.02.2016, 08:02  [ТС] #5
Ну во первых это не exe, а hex для микроконтроллера, объем памяти которого очень ограничен 4к RAM и 128к TEXT, в которую едва влезают сами переменные, а тут еще нужно разместить их описание для возможности сохранения, журналирования, доступа через экран и протоколы связи. для этого и построена такая сложная система генерации описания всех переменных.
Во вторых, что можно сгенерировать doxygen-ом. Система сложная дереровидная, возможно даже с замкнутыми ветвями.
Второй пример для чего это нужно
Если несколько модулей:
- Боард, у которого есть параметры, которые он хочет сохранять (яркость экрана, журналирование включения и выключения устройства и т.п)
- Апликейшин, у которого если свои, важные для него параметры (сетевой адрес, пароли доступа и т.п.)
- Хал, со своими параметрами (Подключенные модули, калибровочные значения и т.п.)
- Система с параметрами (типы датчиков, контролируемые параметры, события и т.п.)
Каждый такой модуль создает свой DescriptionList и помещает указатель на него в общий List путем размещения указателя в заранее известную секцию, а программа при работе видя этот массив знает как с ним взаимодействовать.
Допустим, нужно подключить новый модуль, например протокол общения с сервером или панелью оператора. присоединенный модуль автоматически пропишет свой интерфейс в DescriptionList.
А с учетом вышеописанных ограничений это все должно компактно укладываться в память контроллера, а значит все должен выполнять компилятор (C++11 в это очень помог со своим constexpression и прочими фишками).
Наверное размещение такой сложной системы в маленький контроллер выглядит глупо, но такава судьба.
А самая главная задача - уменьшить вероятность ошибок программиста переложив часть рутины на компилятор.

Добавлено через 4 часа 4 минуты
с помощью ассемблерной вставки смог достать указатель на секцию
C++
1
2
3
4
5
6
7
8
const char data1[] __attribute__((section("MyData"))) __attribute__((used)) = "0000";
const char data2[] __attribute__((section("MyData"))) __attribute__((used)) = "1111";
int main(){
    asm volatile (
        "LDI r24, lo8(MyData) \n"
        "LDI r25, hi8(MyData) \n"
    );
};
Остается вопрос как получить размер?

Добавлено через 16 часов 37 минут
или такой способ
C++
1
extern "C" const void* MyData;
Но здесь также невозможно вычислить размер секции
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
19.02.2016, 07:10 #6
Цитата Сообщение от Hans_ Посмотреть сообщение
Остается вопрос как получить размер?
Вы можете "распарсить" исполняемый файл.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2016, 07:10
Привет! Вот еще темы с ответами:

article и section - HTML, CSS
Допустимо ли такое вложение??? &lt;section&gt; &lt;article&gt; &lt;section&gt; ..... &lt;/section&gt; &lt;section&gt; ...

UITableView Section - Objective-C
Доброго времени суток. Вопрос состоит в следующем. Есть таблица в стиле Grouped. Есть одна секция с тремя ячейками и в footer есть...

QString section - C++ Qt
Здравствуйте. Подскажите, как использовать данную функцию на примере? Вот скажем есть строка (ab.cdef). Как с помощью section получить...

section в место div - HTML, CSS
Как вы считаете, можно это назвать правильной структурой документа? &lt;body&gt; &lt;section id=&quot;wrraper&quot;&gt; &lt;section...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.02.2016, 07:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru