stm32指定在ram和flash中指定绝对地址存放变量或函数
一.在ram中指定地址存放
方法1.使用__attribute__((section(".ARM.__at_0xaddress")))
在ac5中,可以通过__attribute__(at(绝对地址))来对变量或者函数进行分配,而在ac6中不支持at,可以使用__attribute__((section(".ARM.__at_0xaddress")))来进行分配.同时,此关键词不仅可以定义变量,还可以定义函数.
/************* ac5 **********/
int xx[512] __attribute__((at(address))) = {0x1111};
//等同于以下形式
__attribute__((at(address))) int xx[512]= {0x1111};
/************* ac6 **********/
__attribute__((section(".ARM.__at_0xaddress"))) int xx[512]= {0x1111};
//函数也可以定义,例如
__attribute__((section(".ARM.__at_0x20000000"))) void myfun(void)
但是,使用过程中需要注意,分配的地址不能和默认分配的函数或变量冲突,不然编译会报错.其次,变量可以被定义在ram区域并对其进行修改,如下图所示
变量保存在指定位置,并可以被修改
而对函数进行指定的时候,空函数可以被存放在指定位置,也可以成功烧录.然而函数里面加入变量后程序编译可以通过,但无法烧录
空函数可以正常运行
一旦加入变量就无法烧录
所以,当想要指定.c文件或者函数存放在ram的绝对地址中,可以使用修改.sct文件的方法,修改.sct文件同时也可以指定变量存放地址,适用范围更广.
方法2.修改.sct分散加载文件
步骤1
打开option for target里的linker选项,keil5在编译工程的时候会在MDK_ARM下工程同名文件夹里生成一个.sct文件,类似于其他资料中的.ld文件.首先要取消use Memory Layout的勾,不然会target选项中的默认布局.
步骤2
点开edit,就会打开sct文件,接下来就是要在sct文件中添加自己的段
其中的红圈部分即为要自己添加的段,关于sct格式可以在下面推荐的文章链接了解,这里,MY_RAM可以随便起名,目的是在map文件中生成一段信息,0x20004000代表起始地址,0x0000100代表段大小.FW_VERSION就是代码中要使用的段,.any代表这里可以存放任何文件.
sct文件
如图,在加入变量后依然可以烧录,并且函数地址也是分配的地址.
可以成功烧录
同时.c文件也可以分配某一段中,方法见第二个链接.
【原创】【STM32F429开发日志】通过修改.sct文件自动分配SDRAM变量 第一步,打开SDRAM例程,SDRAM的起始地址为: 0xD000000, 分配RAM1大小为4M字节。编译SDRAM例程,会生成一个.sct文件。 图1 使用Keil存储器分配图设置SDRAM的起始位 … 【原创】【STM32F429开发日志】通过修改.sct文件自动分配SDRAM变量 https://shequ.stmicroelectronics.cn/thread-589933-1-1.htmlhttps://shequ.stmicroelectronics.cn/thread-589933-1-1.html
【STM32】sct 分散加载文件的格式与应用_.sct文件-CSDN博客文章浏览阅读6.1k次,点赞30次,收藏144次。在 MDK 的“Options for Target->Linker->Use Memory Layout from Target Dialog”选项可配置该选择。1.勾选时,_.sct文件https://blog.csdn.net/apythonlearner/article/details/133034055https://blog.csdn.net/apythonlearner/article/details/133034055
二.在flash中指定地址存放
与ram中不同的是,flash中存放不能使用sct文件分配的方法,具体表现是即使初始化变量后在memory窗口查看还是没有被更改,全部都是0xff.所以,要想把变量或函数存放在flash中指定地址只能使用__attribute__((section(".ARM.__at_0xaddress"))).要注意的是,当变量分配到flash中后,无法对其更改.
这里我把fw_version放在0x08007000地址,内容是一个字符串,然而在watch窗口中查看全是0xff
变量并没有按设定值,全部都是0xff
而使用__attribute__((section(".ARM.__at_0xaddress")))在flash不仅可以定义变量,还可以定义函数.同时函数可以不为空,不过里面的变量会存放在ram中(0x20002050)而不是指定的flash(0x08007000)附近
在flash中函数或变量可以指定绝对地址,函数里变量地址存放在ram而不是指定的flash附近
欢迎评论指正
作者:蛋姆蟹不肉