#c #gcc #embedded #stm32
Вопрос:
Я пишу встроенную программу, которая разделена на две части: загрузчик и приложение. (Я ориентируюсь на STM32 и занимаюсь разработкой на C с помощью среды разработки Eclipse.)
Я использую дисплей, поэтому я написал несколько функций и 3 разных шрифта. Идея состоит в том, чтобы использовать сектор микроконтроллера и поделиться им. Область шрифта определяется с помощью скрипта компоновщика ( ld
) примерно так:
.mySegment start_of_FONT_segm : {KEEP(*(.Courier_New_Bold_20_Section))} .mySegment1 0x8011298 : {KEEP(*(.Terminal6x8_Section))}
Затем я использую массив для записи в:
const unsigned char __attribute__((section (".Terminal6x8_Section"))) Terminal6x8[] = { 0x00, 0x00, ...
Но как мне прочитать его из другой программы (в данном случае из приложения)?
Я пытался с:
unsigned char *Terminal6x8 = (volatile unsigned char*)0x08011298;
но компилятор помещает Terminal6x8
его в оперативную память.
Я также буду рад поделиться некоторыми функциями, но я также не знаю, как объявить их в синтаксисе in ld
и C.
Комментарии:
1. «но компилятор поставил «Terminal6x8″ » Вы имеете в виду указатель или массив, который также вызывается
Terminal6x8
? Почему вы дали им одно и то же имя? Массив, вероятно, необходимо объявить в области действия файла, чтобы он не мог иметь то же имя, что и какой-либо указатель в другом месте.2. Эти два определения находятся в другом проекте. Первая запись во flash (с «разделом …»), другой проект просто прочитан, но смысл тот же, поэтому я вызываю одинаково, Более того, два проекта содержат разные #define, поэтому я могу использовать в коде, не думая, где они находятся.
Ответ №1:
Действительно, указатель *Terminal6x8 помещается в оперативную память. Если вы хотите, чтобы указатель хранился во флэш-памяти, объявите его const.
Хотя данные, на которые указывает *Terminal6x8, хранятся во флэш-памяти по адресу 0x08011298, как вы хотите. Независимо от того, где хранится указатель.
Комментарии:
1. Я не понимаю, относится ли операция к указателю или массиву, поэтому на этот вопрос действительно нельзя ответить без разъяснений. В случае, если это массив, это, скорее всего, связано с еще одним фиаско компоновщика Eclipse, и ответить на него нетривиально.
2. Да. вы правы, возможно, это сам массив, на который ссылается OP. Я не заметил, что он также вызвал массив
Terminal6x8
. Разъяснения от ОП действительно необходимы.
Ответ №2:
Следующая строка кода:
unsigned char *Terminal6x8 = (volatile unsigned char*)0x08011298;
это плохо по многим разным причинам:
- Он использует фиксированный (жестко закодированный) адрес, что не очень хорошо.
- Он объявляет данные как
volatile
, что в данном контексте не имеет смысла. - Он не объявляет данные постоянными.
Если вы хотите, чтобы указатель также был помещен во флэш-память, вам следует записать:
const unsigned char * const Terminal6x8 = (const unsigned char * const) 0x08011298;
Я также буду рад поделиться некоторыми функциями, но не знаю, как их объявлять в синтаксисе ld и C.
Правильный способ сделать это-объявить векторную таблицу (т. Е. таблицу указателей), содержащую указатели на данные и функции, которыми вы хотите поделиться между сегментами flash.
Комментарии:
1. Вы правы, я забыл убрать слово «изменчивый». Спасибо за предложения.