Как ссылаться на начало и размер сегмента из кода 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)
Другие вопросы по тегам