Как ссылаться на начало и размер сегмента из кода C
Я портирую программу для микросхемы ARM с компилятора IAR на gcc.
В исходном коде IAR специфические операторы, такие как __segment_begin
а также __segment_size
используются для получения начала и размера соответственно определенных сегментов памяти.
Есть ли способ сделать то же самое с GCC? Я искал руководство GCC, но не смог найти что-нибудь подходящее.
Больше деталей:
Рассматриваемые сегменты памяти должны находиться в фиксированных местах, чтобы программа могла правильно взаимодействовать с определенными периферийными устройствами в чипе. Оригинальный код использует __segment_begin
оператор, чтобы получить адрес этой памяти и тому __segment_size
чтобы убедиться, что он не переполняет эту память.
Я могу достигнуть той же функциональности, добавив переменные, чтобы указать начало и конец этих сегментов памяти, но если бы у GCC были подобные операторы, которые помогли бы минимизировать количество кода, зависящего от компилятора, мне пришлось бы писать и поддерживать.
2 ответа
А как насчет флага компоновщика --section-start
? То, что я прочитал, поддерживается здесь.
Пример того, как его использовать, можно найти на форуме AVR Freaks:
const char __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1";
Затем вам нужно добавить к параметрам компоновщика: -Wl,--section-start=.honk=address
,
Современные версии GCC объявляют две переменные для каждого сегмента, а именно __start_MY_SEGMENT и __stop_MY_SEGMENT. Чтобы использовать эти переменные, вам нужно объявить их как внешние с нужным типом. После этого вы и затем используете оператор "&", чтобы получить адрес начала и конца этого сегмента.
extern uint8_t __start_MY_SEGMENT;
extern uint8_t __stop_MY_SEGMENT;
#define MY_SEGMENT_LEN (&__stop_MY_SEGMENT - &__start_MY_SEGMENT)