如何使ARM GCC链接器将版本号放在内存段末尾的固定地址



我正在为基于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之前的.bin文件中(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,
};

发现问题;这是一个复制/粘贴错误;

KEEP(*(._version)) ;

应该是:

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

现在它工作得很好。

最新更新