分散加载(4)---变量放在指定内存位置

  通过连接器,把一个全局变量放在指定存储器期望的位置,大体有两种方法。第一种:可以指定全局变量放到绝对物理地址位置。使用__at放置符号,可以使用/不使用配置分散加载文件(这里会衍生2种方法)。第二种,指定全局变量在某一个范围,使用name section,配合分散加载文件使用。我这里就归纳为总共3种方法吧。

  name section是啥? 我也不知道准确的翻译,大概意识就是定义一个段section,给这个段取一个name,合起来就是name section。

  注意:下面都是针对ARM编译器5(AC5)描述,AC6可能有区别。

1)方法一:使用放置符号__at把变量放在指定存储器位置,不用分散加载文件

①在main.c中增加如下代码:

int gValue __attribute__((section(".ARM.__at_0x20004000"))) = 3; // Place at 0x20004000

或者:

int gValue __attribute__((at(0x20004000))) = 3; // Place at 0x20002000

②我们在map文件中可以看到:

 

2)方法二:使用放置符号__at把变量放在指定存储器位置,配合使用分散加载文件

     这种情况,一定要注意,在分散加载文件中,放置".ARM.__at_0x20004000"所在执行域的地址范围包含了0x20004000地址。

①在main.c中增加如下代码:

int gValue __attribute__((section(".ARM.__at_0x20004000"))) = 3; // Place at 0x20004000

或者:

int gValue __attribute__((at(0x20004000))) = 3; // Place at 0x20002000

②修改分散加载文件

 

 

③我们在map文件中可以看到:

 

 

 

感觉这种方法,没有必要,方法二不修改分散加载文件,也能实现目的,何必还使用方法三修改分散加载文件呢。

3)方法三:使用name section把变量放在指定存储器位置,配合分散加载文件

  这种方式可以指定变量在一个执行域的地址范围内,而不是指定在绝对物理地址。

  ①在main.c中增加代码:

int gSquared __attribute__((section("foo")));  // Place in section foo

 

 

  ②在分散加载文件中增加内容:

 

 

③查看map文件:

 

 

 

 

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值