我正在为基于Cortex-M4的系统开发固件更新代码,我的固件需要一种方法来获取单独链接的引导加载程序的版本号,以便我确定是否必须对其进行更新。我继承的makefile当前将构建日期/时间放在代码的末尾,但是如果添加或删除代码,它就会移动。
我试图通过定义一个名为.version的新内存段并修改加载程序脚本以将其放置在现有段调用.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
}
我理解.binfo之后的“> rom”来限制.binfo完全位于rom内,所以我在main.c中省略了bootloaderVersion.h,看起来像这样:
#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
它生成了,但是在0x3FF0(binfo所在的位置)之前,.bin文件中没有任何内容。当我用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,
};
发现问题;这是一个复制/粘贴错误;