Как разделить один сегмент флэш-памяти между двумя программами на микроконтроллере STM32

#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;  

это плохо по многим разным причинам:

  1. Он использует фиксированный (жестко закодированный) адрес, что не очень хорошо.
  2. Он объявляет данные как volatile , что в данном контексте не имеет смысла.
  3. Он не объявляет данные постоянными.

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

 const unsigned char * const Terminal6x8 = (const unsigned char * const) 0x08011298;  

Я также буду рад поделиться некоторыми функциями, но не знаю, как их объявлять в синтаксисе ld и C.

Правильный способ сделать это-объявить векторную таблицу (т. Е. таблицу указателей), содержащую указатели на данные и функции, которыми вы хотите поделиться между сегментами flash.

Комментарии:

1. Вы правы, я забыл убрать слово «изменчивый». Спасибо за предложения.