存储过程定义时间变量_如何将函数或变量存储到特定区域?一分钟从菜鸟到大师...

3de3f8d605af997839e412413c143136.gif

芯片封装

在嵌入式系统开发过程中,经常需要把一些变量、函数放到特定地址或代码区域。比如,写bootloader固件时,就需要把Flash的读写函数放到RAM中,这样才有可能对Bootloader本身固件进行更新。再比如,有些单片机内部有多块RAM,分布在不同地址段,这种情况下,我们可以将部分程序或数据放置在特定RAM,在单片机不断电复位之后,这些数据仍然保持,这种情况我以后再细讲。

下面我介绍几种常用的指定变量或函数到特定存储位置的方法。

1.使用section域

要用section,需要按下面的方法定义变量和函数,并且使用自定义存储分布文件scatter file.其实不需要自己重新写,在默认的文件上改动即可。以Keil及STM303VTX芯片为例(因为我手头有这个开发板,方便测试~~)。

借助CubeMAX建立一个基于STM303VTX的工程,用Keil打开。定义一个函数和变量到特自定义区域mySection。

int func(void) __attribute__((section("mySection")));int var __attribute__((section("mySection")));

点开配置工具。这个片子有两块内存区,默认只选中了一块。在Linker页面下,取消勾选Use Memory Layout from Target Dialog,就可以打开默认的分布文件了。

4e4a670b77b3fd085ea6ecf31b4f0058.png

打开默认scatter file

按图操作后,打开的默认的分布文件如下:

;只读存储区域LR_IROM1 0x08000000 0x00040000 {  ER_IROM1 0x08000000 0x00040000 {  *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO);所有的只读代码 };RAM区域 RW_IRAM1 0x20000000 0x0000A000 { .ANY (+RW +ZI) *(mySection);自定义代码区域 }}

把mySection区域加到RAM地址空间后,经过编译后我们定义的var、func函数就会在内存之中。

2.使用at来指定具体位置

(1)变量放到指定位置,可如下定义(这个不需要使用自定义scatter file)

int var __attribute__((at(0x0x20009000)));

(2)函数放到特定位置,要稍微复杂一点,需要使用自定义scatter file。首先定义函数,并指定一区域名。

__attribute__((section("MyFunc")))void MyCode(void) {SystemClock_Config();}

假如让函数MyCode()的起始地址位于0x20009000的RAM区域,需要修改分布文件如下:

;只读存储区域LR_IROM1 0x08000000 0x00040000 {  ER_IROM1 0x08000000 0x00040000 {  *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO);所有的只读代码 };RAM区域1 RW_IRAM1 0x20000000 0x00009000 { .ANY (+RW +ZI) };分割出来的区域要不同名称 RW_IRAM2 0x20009000 0x0000A000 { *(MyFunc);自定义代码区域 }}

正因为要分割区域,为了简化设置过程,一般把自定义区域放到RAM的最后位置。

3.设置文件到特定存储区域

这个方法最简单!把所以要放到RAM中的变量函数全部放在同一个c文件中,在该文件上点右键。选择第一个Options for xxx.c,在弹出的对话框里,选择目标区域即可。

126acb61969af8b6e5a326b1251744a0.png

存放文件代码到特定区域

关于Scatter file的详细说明,请参考 《如何将函数或变量存储到特定区域?大师前传--细说Scatter file

一些文件的收藏量达到了500以上,说明对大家有些帮助,花这么多时间整理写作也值了!!

所有文章都是自己实践经验的总结,欢迎批评指正,谢谢关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值