определение блока памяти во flash как переменных в IAR

Я разрабатываю на STM32 mC, используя IAR 7.80. Мне нужно представить определенный блок памяти во flash как переменные разного размера. например, начиная с адреса 0x0800B00, у меня есть следующие данные: 4 байта с плавающей запятой, массив символов размером 4 и затем 4 байта с типом uint32_t. в настоящее время я указываю конкретное местоположение каждой переменной, поэтому для приведенного выше примера я пишу:

_Pragma("location=0x0800B000") const float    first_var = 5.0;
_Pragma("location=0x0800B004") const char[4]  second_var = {1,2,3,4};
_Pragma("location=0x0800B008") const uint32_t third_var = 1000;

на самом деле у меня более 100 таких переменных, и добавление/удаление переменных часто встречается на этом этапе разработки, поэтому каждый раз, когда я удаляю переменную, мне нужно либо переставлять места всех переменных, либо оставлять пробелы! Есть ли лучший способ представить эти переменные? примечание: мне нужно иметь возможность взять блок памяти и проанализировать его в приложении для ПК, поэтому мне нужно, чтобы каждая переменная занимала свой размер точно и не больше!


person Samer.M    schedule 13.04.2017    source источник


Ответы (3)


Наиболее удобный способ решить эту проблему — использовать одну структуру с несколькими отдельными полями, по одному для каждой переменной, вместо набора отдельных переменных. С помощью этого решения вам нужно указать местоположение только один раз, вам гарантируется, что поля будут размещены в том порядке, в котором вы хотите, и, если вы используете упакованную структуру, вы можете смешивать поля разных размеров и по-прежнему гарантировать, что между ними нет заполнения их. Единственная цена, которую вы платите за это, — это префикс, необходимый для преобразования доступа к переменной в доступ к структуре.

person Johan    schedule 13.04.2017

Альтернативный подход заключается в том, чтобы указать ваши переменные в формате файла, который очень легко анализировать. Например, вы можете использовать CSV и определить тип, имя и значение по умолчанию в разных столбцах.

Затем используйте язык сценариев, чтобы прочитать CSV, сгенерировать исходный файл C и автоматически вычислить смещения. Это очень легко сделать с чем-то вроде Python, в стандартной библиотеке которого есть подпрограммы для работы с файлами CSV.

В качестве дополнительного бонуса вы также можете создать новый файл CSV с рассчитанными смещениями, которые может использовать программное обеспечение для ПК. Приложение для ПК будет проще анализировать, и вам не придется модифицировать парсер, если вам нужно изменить встроенный компилятор, который использует другой синтаксис прагмы.

Вы можете использовать другой формат файла или язык сценариев, но основная идея остается прежней. Вы получаете новые требования к инструменту, но получаете большую гибкость.

person user694733    schedule 18.04.2017

Недавняя поддержка заключается в установке переменных в области памяти в области флэш-памяти с помощью следующей директивы pragma:

#pragma default_variable_attributes

Вы можете сделать то же самое для своих функций:

#pragma default_function_attributes

"как сделать размещение группы функций и переменных"

person ecle    schedule 19.07.2017