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

__attribute__(section) - C++

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

Что такое __attribute__((packed)),и когда это стоит использовать? C++
Как убрать вывод компонента catalog.section.list в компоненте catalog.section 1С Битрикс
Свойство After Section MS Access
HTML, CSS section в место div
HTML, CSS article и section
C (СИ) Ошибка: expected «=», «,», «;», «asm» or «__attribute__» before «*» token
Как можно просмотреть все зарегистрированные имена SharedMemory Section в Windows? C++
QString section C++ Qt
C++ Как хранить переменную типа char* в named shared memory section?
UITableView Section Objective-C
О тегах article, section и т.п
C# Собственная длина Section

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14477 / 6461 / 1020
Регистрация: 02.05.2013
Сообщений: 10,698
Завершенные тесты: 1
11.02.2016, 08:49     __attribute__(section) #2
Цитата Сообщение от Hans_ Посмотреть сообщение
тем самым я получаю массив данных лежащих рядом дуг с другом.
И в чем выгода?
Данные с общими атрибутами, кстати, и так размещаются компоновщиком в одной секции.
Hans_
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 4
11.02.2016, 09:41  [ТС]     __attribute__(section) #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> >;
В итоге получается умная система, умеющая сохранять и загружать все помеченные параметры, автоматически генерировать меню параметров, протоколы взаимодействия и т.д. и все это генерировать на этапе компиляции и помещать в кодовую память.
При создании сложной системы с тысячами параметров очень легко ошибиться или что нибудь забыть, а при таком подходе компилятор сам все сгенерирует и не даст программисту допустить глупые ошибки.
Убежденный
Системный программист
 Аватар для Убежденный
14477 / 6461 / 1020
Регистрация: 02.05.2013
Сообщений: 10,698
Завершенные тесты: 1
11.02.2016, 10:29     __attribute__(section) #4
Я так и не понял, какую этот подход решает задачу.
Генерировать описание классов и документацию можно банально doxygen-ом.
Можно его вообще сделать частью процесса сборки.

А иметь в exe кучу секций на каждый класс только ради описания -
это мне кажется нерационально. При этом еще и код усложняется и
теряет такое качество, как переносимость.
Hans_
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 4
12.02.2016, 08:02  [ТС]     __attribute__(section) #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
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,056
Записей в блоге: 10
Завершенные тесты: 1
19.02.2016, 07:10     __attribute__(section) #6
Цитата Сообщение от Hans_ Посмотреть сообщение
Остается вопрос как получить размер?
Вы можете "распарсить" исполняемый файл.
Yandex
Объявления
19.02.2016, 07:10     __attribute__(section)
Ответ Создать тему
Опции темы

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