意法半导体公司【简称ST】为STM32用户提供了免费的编译工具软件STM32CubeIDE,时不时有人咨询基于该环境下的指定存储话题,这里专门聊聊该内容,重点介绍如何实现针对变量、函数、文件、常量的指定存储的实现方法,以供参考。
一、指定变量的RAM存放地址
先修改STM32CubeIDE的相关连接文件如下:【后面都会用到下面配置】
sjykolq4mpm64081494338.png
在链接文件中增加section:
wwpmlqscobu64081494438.png
cfsdgpalatb64081494538.png
ac1kvkxgjtl64081494639.png
或者这样也行:
xiv4y25c3fo64081494739.png
w1n1iysfqd464081494839.png
当然,对于变量的指定存储,不调整链接文件,直接给定地址借助指针的方式也是可以的。比方像下面这样,不过要注意你指定使用的内存空间是安全的,别跟其它堆栈区冲突了。
c1wy4opn32n64081494939.png
二、指定函数的存放地址
下面尝试将名为MX_I2C1_INIT()的函数存放在指定位置。
4on4utqbbik64081495040.png
a5vwiu4jpeg64081495140.png
4wcdsfwyam564081495240.png
三、指定文件的存放地址
下面尝试将名为adc.c和gpio.c的目标文件存放在指定位置。
vdy2q5mpif264081495340.png
ol4yiivvqyj64081495440.png
四、指定常量的存放地址
45l50n1su4w64081495541.png
iqf5orabj1564081495641.png
当然,如果在section那里再指定地址的做法也可以:
liv55xpkax064081495741.png
看到这里,有人或许好奇链接脚本中的keep关键字,如果不要会怎么样呢?
这里使用 KEEP 关键字的主要目的是确保特定的段[section]在链接过程中不会被丢弃。即使这些段没有被显式引用,因为KEEP 关键字的存在而被强制保留段定义。换句话说,如果这些段没有在代码中被引用或使用,且在链接脚本中未加 KEEP ,那么相应的段将会在链接过程中被丢弃。
我们不妨验证下。基于上面的配置,将keep拿掉,同时代码中对定义的常量不做任何引用或使用。我们可以发现定义的常量段被丢弃了,即没有在预定的地址为其安排存储空间。
ehnucs20ky464081495841.png
最后提醒下,我们做段定义时有时可能会遇到地址不合适的问题,我们可以适当调整地址数据,不要跟默认栈空间冲突了。还有,自定义段在链接脚本中的位置有时会涉及到有效性问题,具体设计时可以灵活调整段定义在脚本文件中的前后位置。
OK,今天的分享就到这里,下次再聊~!
猜你喜欢:
WiFi6+蓝牙+星闪,三合一开发板,真香!
Github上热门 C 语言项目汇总!
嵌入式,可测试性软件设计!
一些低功耗软件设计的要点!
嵌入式 C 保护结构体的方式
实用 | 10分钟教你通过网页点灯
谈谈嵌入式软件的兼容性!
分享一个嵌入式代码生成器设计思路!
点击阅读原文,查看更多分享。 |