OpenEdv-开源电子网

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

关于const、__attribute__的用法

[复制链接]

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
发表于 2015-6-25 00:30:03 | 显示全部楼层 |阅读模式
5金钱
一下一段语句,看看有点晕乎乎的,谁能帮忙解析一下,寻找一下理解的突破口,3ks...
const uint8 code[128] __attribute__((at(0x0803f800)))={'R',
                               0x00,
                               0x00,
                               0x13,0x00,
                               0x00,
                               0X00,
                               0X00,0X02,
                               0X15,0X11,
                               0X00,
                               0x20,
                               0x03,
                               0x00,
                               0x00,0x00,0x00
                                  } ;

最佳答案

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

const表示修饰code数组的内容为常量,修改常量编译器会报错。 在一般情况下,因为定义的数组的值不会被改变,只用于读取,所有编译器在遇到const修饰的code数组时,会将这个code定义在flash区域而不是RAM中(这样可以节约RAM的使用)。在这样的情况下code数组在flash中的地址是由编译器决定的 如果想把这个常量数组定义在RAM区域,可以加volatile修饰,即volatile const uint8 code[128]={'R',0x00,0x00,.......,0x ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-6-25 00:30:04 | 显示全部楼层
const表示修饰code数组的内容为常量,修改常量编译器会报错。
在一般情况下,因为定义的数组的值不会被改变,只用于读取,所有编译器在遇到const修饰的code数组时,会将这个code定义在flash区域而不是RAM中(这样可以节约RAM的使用)。在这样的情况下code数组在flash中的地址是由编译器决定的
如果想把这个常量数组定义在RAM区域,可以加volatile修饰,即volatile const uint8 code[128]={'R',0x00,0x00,.......,0x00} ;这样编译器会自行决定将code数组放在RAM的某个地址上。写段程序看看code的地址就明白了。

因为编译器自行决定code的再flash/ram中的地址,我们在编译后才能知道具体地址在哪里。在有些场合我们需要指定变量/常量的地址,就要用到__attribute__((at(0xXXXXXXXX)))
__attribute__((at(0x0803f800)))就是指定了code定义的位置为0x0803f800。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2015-6-25 01:05:39 | 显示全部楼层
__attribute__((at(0x0803f800))) 把这个code强制放在FLASH里的0x0803f800开始的地址里
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-6-25 09:53:27 | 显示全部楼层
回复【3楼】ianhom:
---------------------------------
基本上明白了,多谢 ianhom。
回复

使用道具 举报

29

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-10
在线时间
1 小时
 楼主| 发表于 2015-6-25 09:53:46 | 显示全部楼层
回复【2楼】enan:
---------------------------------
嗯 基本明白了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 00:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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