Как ссылаться на начало и размер сегмента из кода C - PullRequest
6 голосов
/ 07 марта 2011

Я портирую программу для микросхемы ARM с компилятора IAR на gcc.

В исходном коде для определения начала и размера используются специальные операторы IAR, такие как __segment_begin и __segment_size.соответственно определенных сегментов памяти.

Есть ли способ сделать то же самое с GCC?Я искал руководство GCC, но не смог найти ничего подходящего.


Подробнее:
Рассматриваемые сегменты памяти должны находиться в фиксированных местах, чтобы программа могла правильно взаимодействовать с определеннымипериферия на чипе.Исходный код использует оператор __segment_begin для получения адреса этой памяти и __segment_size, чтобы гарантировать, что он не переполняет эту память.

Я могу достичь той же функциональности, добавив переменные, чтобы указатьначало и конец этих сегментов памяти, но если бы у GCC были похожие операторы, которые помогли бы минимизировать объем кода, зависящего от компилятора, мне пришлось бы писать и поддерживать.

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

А как насчет флага компоновщика --section-start? То, что я прочитал, поддерживается здесь .

Пример того, как его использовать, можно найти на форуме AVR Freaks :

const  char  __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1";

Затем вам нужно будет добавить к параметрам компоновщика: -Wl,--section-start=.honk=address.

1 голос
/ 02 июня 2016

Современные версии 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)
...