OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5532|回复: 8

stm32cubeide中如何指定变量存放指定内部ram地址

[复制链接]

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2019-3-11
在线时间
31 小时
发表于 2021-12-25 15:35:03 | 显示全部楼层 |阅读模式
10金钱
我想定义一个变量,并使该变量的地址位于指定的内部ram地址
看到网上说需要按照如下方式定义变量
1)__align(8) uint8_t value[20]__attribute__((at(0x20000100))); MDK中定义
2)int value[]__attribute__((section(".ARM.__at_0x20000100"))) = {0x01, 0x02}; GCC中定义

然而我实际操作起来,打印出来的地址却不是我设置的地址,下面是我的代码
int test1[] __attribute__((section(".ARM.__at_0x20000100"))) = {0};
。。。。。
printf("val=%d,addr=%x\r\n",test1[0],test1);
打印出来的地址是2000051c,并且会随代码改动而变化
我的开发环境是stm32cubeide,gcc编译器

最佳答案

查看完整内容[请看2#楼]

最后通过修改链接脚本的方式实现了,在链接脚本的MEMORY中,修改RAM的大小减小1K,算好相应的地址,加入自定义的段LocalMasterAddr (rx) : ORIGIN = 0x2002FC00, LENGTH = 1K 随后在SECTIONS中加入如下代码: .AddrParma_LocalAddr : { . = ALIGN(4); KEEP (*(.AddrParma_LocalAddr)) . = ALIGN(4); }>LocalMasterAddr 最后定义变量的时候,链接到这个段就行了 int test1 __attribute__((section( ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2019-3-11
在线时间
31 小时
 楼主| 发表于 2021-12-25 15:35:04 | 显示全部楼层
本帖最后由 ESFDH 于 2021-12-27 16:22 编辑

最后通过修改链接脚本的方式实现了,在链接脚本的MEMORY中,修改RAM的大小减小1K,算好相应的地址,加入自定义的段LocalMasterAddr (rx)   : ORIGIN = 0x2002FC00,  LENGTH = 1K 0.png
随后在SECTIONS中加入如下代码:
.AddrParma_LocalAddr :
  {
    . = ALIGN(4);
    KEEP (*(.AddrParma_LocalAddr))
    . = ALIGN(4);
  }>LocalMasterAddr

最后定义变量的时候,链接到这个段就行了

int test1 __attribute__((section(".AddrParma_LocalAddr")))=0;
int test2 __attribute__((section(".AddrParma_LocalAddr")))=0;查看map,可以发现变量地址已经是我们设置的地址了
1.png

但是这种方法太麻烦了,不像在keil中可以通过宏定义快速修改地址,不知道各位有没有更好的办法。。。。
参考博客 https://blog.csdn.net/dx5220/article/details/121379426

回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-12-25 15:53:08 | 显示全部楼层
帮顶  
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2019-3-11
在线时间
31 小时
 楼主| 发表于 2021-12-26 08:10:48 来自手机 | 显示全部楼层
自己顶一下
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-12-26 10:21:28 | 显示全部楼层
帮顶         
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1998
金钱
1998
注册时间
2021-4-16
在线时间
509 小时
发表于 2021-12-27 10:50:53 | 显示全部楼层
帮顶。。
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-12-27 14:50:08 | 显示全部楼层
本帖最后由 聚东风 于 2021-12-27 14:52 编辑

KEIL:
U8 test1[256] __attribute__((at(0x20000000+0x600)))=
就差一点点啊
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2019-3-11
在线时间
31 小时
 楼主| 发表于 2021-12-27 15:27:39 | 显示全部楼层
聚东风 发表于 2021-12-27 14:50
KEIL:
U8 test1[256] __attribute__((at(0x20000000+0x600)))=
就差一点点啊

我刚刚尝试了一下,在keil中这样写是可以的,打印出来的地址也是对的
uint8_t value[20]__attribute__((at(0x20000100))); MDK中定义
但是KEIL实在是太难用了,所以我现在都是在stm32cubeide上开发,然而在cubeide中使用上面两种方法都不行。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-12-28 01:15:00 | 显示全部楼层
ESFDH 发表于 2021-12-27 16:20
最后通过修改链接脚本的方式实现了,在链接脚本的MEMORY中,修改RAM的大小减小1K,算好相应的地址,加入自 ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 23:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表