stm32 MCU 如何将变量定义在rom中固定的位置

    这个需求看起来挺奇怪的,但其实很常用,比如用来记录固件的名称和版本。通常的做法是生成bin文件后通过一些工具将固件信息附加在bin文件的末尾,供下载工具下载时进行比对,防止更新了旧的或者不对应的固件。此种方法需要在固件bin文件生成后再二次加入,存在出错的风险。比如固件内部是版本为A2,但是外部写的是A1。其实在版本号已经存放在固件内部某一个常量或者变量中了,只是这个常量的位置并不固定,每次编译都有可能变化,所以没法直接从固件中读出,如果能将这些信息固定在bin文件中的某一个位置,那么就可以直接将版本等信息从bin文件中读出来,不需要bin文件生成后再二次加入,避免了出错的可能。

对于bin文件生成时各个变量或者常量的位置,是由编译器来决定的,但是用户可以通过脚本来指定不同的section的位置,在定义常量时将常量指定存放到对应的scetion中,这样,就可以从section对应的地址读出来。这种脚本对于不同的编译器是不一样的,我常用的是IAR,IAR对应的脚本是.icf。这里就以icf文件为例。

比如我需要定义一个设备名称存放在固件中,

第一步是在icf中定义一个指定位置的section,如下图所示

stm32 MCU 如何将变量定义在rom中固定的位置_第1张图片

图中可以看到定义了一个readonly的section,名字为DeviceName,存放于地址0x08008210处。这个语句在icf文件中的位置应该没有限制,我是放到了文件的最末尾。要说明的是我这是一个APP程序,因为有IAP的存在,它的起始位置并不是从0x08000000开始的,我是定义在了0x08008000起始。所以这个section的起始位置是从bin文件头偏移0x210的位置。为什么是是0x210,因为bin文件的开始一般是Vector表的位置,这个固件对应的MCU是stm32f373,它的Vector表的大小为0x188,我定义这个scetion的位置就紧跟着vector表。不紧跟的话我觉得其实应该也没有什么关系。

第二步在代码中定义对应的常量,并指定到对应的Section中,如下所示

stm32 MCU 如何将变量定义在rom中固定的位置_第2张图片

其中 DEVICE_NAME是一个宏定义的字符串,指定了设备的名称。

如此就完成了在指定的位置定义常量的过程。在生成的bin文件中,从文件头偏移0x210的位置变是字符串adam-452M。

stm32 MCU 如何将变量定义在rom中固定的位置_第3张图片

 

你可能感兴趣的:(stm32 MCU 如何将变量定义在rom中固定的位置)