Как заставить компоновщик ARM G CC поставить номер версии по фиксированному адресу в конце раздела памяти? - PullRequest
0 голосов
/ 16 апреля 2020

Я разрабатываю код обновления прошивки для системы на базе Cortex-M4 и мне нужен способ, чтобы моя прошивка получила номер версии отдельно связанного загрузчика, чтобы я мог определить, нужно ли его обновлять. Унаследованный мной в настоящее время make-файл помещает дату / время сборки в конец кода, но он перемещается, если код добавляется или удаляется.

Я попытался сделать это, определив новый раздел памяти с именем .version и изменив его. скрипт загрузчика для помещения его в конец памяти fla sh непосредственно перед вызовом существующего раздела .binfo и включения файла заголовка, содержащего номер версии с атрибутом, который помещает его в этот раздел в main. c. Сценарий загрузчика, с которого я начал, выглядит следующим образом (с посторонними частями, замененными на «...»).

MEMORY
{
  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 16K
  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 192K

...

    . = ALIGN(4);
    _end = . ;

    _binfo_start = 16K - 4 * 4;
    .binfo _binfo_start : {
      KEEP(*(.binfo)) ;
    } > rom
}

Я изменил это на:

MEMORY
  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 16K
  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 192K

...

    . = ALIGN(4);
    _end = . ;

    _version_start = 16K - 4 * 4 - 2;    /* new, intended to reserve 2 bytes for .version before .binfo */
    .version _version_start : {
      KEEP(*(._version)) ;
    } > rom                              /* end new */

    _binfo_start = 16K - 4 * 4;
    .binfo _binfo_start : {
      KEEP(*(.binfo)) ;
    } > rom
}

Я понимаю "> rom "после .binfo ограничивает .binfo значением l ie внутри rom, поэтому я не включил его в файл bootloaderVersion.h, включенный в main. c, и выглядит так:

#ifndef BLVERSION_H
#define BLVERSION_H

#define BLVERSIONMAJOR 0x00
#define BLVERSIONMINOR 0x01
#define BLVERSION (BLVERSIONMAJOR << 8 | BLVERSIONMINOR)

 __attribute__((section(".version"))) __attribute__((__used__)) const uint16_t blVersion = BLVERSION;

#endif

, но я не вижу ничего в файле .bin до 0x3FF0 (где находится binfo). Когда я смотрю на загрузчик с Segger Ozone, я вижу, что bootloaderVersion.h был включен, но не занимал память.

Что я делаю не так?

Кстати, binfo заполняется следующим образом:

__attribute__((section(".binfo"))) __attribute__((__used__)) const UF2_BInfo binfo = {
#if USE_MSC_HANDOVER
    .handoverMSC = handover,
#endif
#if USE_HID_HANDOVER
    .handoverHID = hidHandoverLoop,
#endif
    .info_uf2 = infoUf2File,
};

1 Ответ

0 голосов
/ 16 апреля 2020

Нашел проблему; это была ошибка копирования / вставки;

KEEP(*(._version)) ;

должно быть:

KEEP(*(.version)) ;   /* no backspace before version */

Теперь все работает отлично.

...