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

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

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

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

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

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

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

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

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

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值