Я разрабатываю код обновления прошивки для системы на базе 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,
};