我正在使用 STM32CubeIDE(带有 gcc 编译器的基于 Eclipse 的 IDE)为 ARM Cortex-M4 微控制器制作项目,并希望将整个固件的 CRC 嵌入到二进制文件的末尾。我已经修改了链接器脚本以创建一些放置在已编译二进制文件末尾的变量。这是我对链接器脚本的修改:
... linker script ...
/* My section (it is the last section in linker script) */
.end_of_code :
{
. = ALIGN(4);
KEEP (*(.end_of_code.fwSize)) /* Force memory allocation even if variable is unused */
KEPP (*(.end_of_code.fwCrc)) /* Force memory allocation even if variable is unused */
_end_of_code = .; /* Get current address */
_size_of_code = ABSOLUTE (_end_of_code - ORIGIN(FLASH)); /* Subtruct current address from start of image */
} >FLASH
这是C中上述变量的声明:
// Some C file
extern uint32_t _size_of_code; // Linker variable
const __attribute__((section(".end_of_code.fwSize"))) uint32_t fwSize = (uint32_t) &_size_of_code;
const __attribute__((section(".end_of_code.fwCrc"))) uint32_t fwCrc = 0xFFFFFFFF;
使用链接描述文件创建的最后一个变量应该存储整个固件的 CRC32。我想使用 SRecord 脚本来计算 CRC 值,并希望能够像 C 代码中的普通变量一样引用它的值。
我的目标是制作 SRecord 脚本,它将使用-binary
格式打开文件,用 SRecord 计算的 CRC32 替换最后 4 个字节,并用替换的 CRC 值进行输出。但我不明白如何将非绝对地址范围-crop
放入或-exclude
过滤器。我想做这样的事情:
# SRecord script
fw.bin -binary
-CRC32 -maximum-addr fw.bin -binary -4
-o fw_with_CRC.bin -binary
我的问题是:是否有可能以及如何在 SRecord 中使用相对地址?或者是否有可能以及如何用 SRecord 覆盖二进制文件末尾的一些数据?
关于替代解决方案:我知道我可以从链接器中删除fwCrc变量并创建如下内容:
#define FW_CRC_ADDR ( ((uint32_t) &fwSize) + 0x04 )
#define GET_FW_CRC() ( *(uint32_t *) FW_CRC_ADDR )
但这样的解决方案对我来说不可接受。我想要存储 CRC 值的变量。插入一些数据/变量而不是未使用的中断向量元素的解决方案也不可接受。
也许我可以接受fwCrc变量不分配任何内存并使用 SRecord 将 CRC 附加到二进制文件末尾的解决方案,但我不知道如何强制链接器不为 C 代码中使用的变量分配内存。