OpenEdv-开源电子网

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

const是可以改变的只读变量,原子哥请帮忙

[复制链接]

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
发表于 2018-9-1 21:00:43 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 47933673 于 2018-9-1 21:02 编辑

volatile const int a=7;    int *c = (int *)(&a);
*c = 9;
用stm32运行之后,a等于9


这里有点不太明白,const修饰之后,这个只读量应该是存储在闪存里面,并且还可以更改,所以小弟有几点疑问
1.const修饰之后是否a=7存储在闪存里面?
2.如果是存储在闪存里面,那么修改为什么不需要先擦除然后再编程使能,然后再写入,而是直接就可以更改闪存?
原子哥哥和各位大侠请帮帮小弟,谢谢
3.如果真是这样方便,那我们岂不是可以直接用指针操作来写入闪存了?(如果只写入一个数据,不需要考虑忙的情况下)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-1 21:18:59 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-1 21:21 编辑

这要看你的const在哪儿定义, 如果是全局的, 它是会被放在Flash区, 此时你仍然可以用上面的方式改变其内容, 就算编译通过编译了, 执行时会HardFault

如果说是个局部的const, 那它实际上是放在RAM, 跟你不要const着键字的效果是一样的,只是编译器不让你直接写它, 你通过其它方式写它, 编译器管不着。

const只是给编译器看, 编译器为防止你误操作而对你提出警告或错误。 CPU是不认你什么Const不Const, 只要是放RAM里的都给你改
回复

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2018-9-1 21:24:28 | 显示全部楼层
edmund1234 发表于 2018-9-1 21:18
这要看你的const在哪儿定义, 如果是全局的, 它是会被放在Flash区, 此时你仍然可以用上面的方式改变其内 ...

这要看你的const在哪儿定义, 如果是全局的, 它是会被放在Flash区, 此时你仍然可以用上面的方式改变其内容, 就算编译通过编译了, 执行时会HardFault。
我定义的是全局变量,存储在闪存里面,那么修改为什么不需要先擦除然后再编程使能,然后再写入,而是直接就可以更改闪存?如果真是这样方便,那我们岂不是可以直接用指针操作来写入闪存了?执行时会HardFault是什么意思。
谢谢大神回答
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-1 21:28:51 | 显示全部楼层
47933673 发表于 2018-9-1 21:24
这要看你的const在哪儿定义, 如果是全局的, 它是会被放在Flash区, 此时你仍然可以用上面的方式改变其 ...

HardFault是异常的一种, 是硬件出了问题的意思, 比如, 你直接写数据到Flash区。 它就会产生名为HardFault_Handler的中断去。
实际上就是说不给你写
回复

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2018-9-1 21:36:21 | 显示全部楼层
edmund1234 发表于 2018-9-1 21:28
HardFault是异常的一种, 是硬件出了问题的意思, 比如, 你直接写数据到Flash区。 它就会产生名为HardFa ...

大神,我上面已经说了,已经修改了闪存,上面还有几个问题我都列出来了,怎么感觉回答的和我提问的不是一个方向
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-1 21:44:21 | 显示全部楼层
1.const修饰之后是否a=7存储在闪存里面?
要看你定义的const是全局的还是局部的, 全局的const是放falsh, 局部的是放RAM
2.如果是存储在闪存里面,那么修改为什么不需要先擦除然后再编程使能,然后再写入,而是直接就可以更改闪存?
原子哥哥和各位大侠请帮帮小弟,谢谢
放在RAM的当然可以用指针的方式修改啊, 如果是放Flash的你修改不了, 编译就算通过了, CPU还是不会给你改, 并且会产年异常(即报错)
3.如果真是这样方便,那我们岂不是可以直接用指针操作来写入闪存了?(如果只写入一个数据,不需要考虑忙的情况下)
上面已经回答了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-1 21:46:46 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-1 21:48 编辑
47933673 发表于 2018-9-1 21:36
大神,我上面已经说了,已经修改了闪存,上面还有几个问题我都列出来了,怎么感觉回答的和我提问的不是 ...

你怎样确定你把Flash的内容修改了?你把Debug的图贴出来,const 地址是什么

你是在问PC 上跑的C ?还是MCU的?

回复

使用道具 举报

61

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2012-1-12
在线时间
93 小时
 楼主| 发表于 2018-9-1 21:47:12 | 显示全部楼层
edmund1234 发表于 2018-9-1 21:44
1.const修饰之后是否a=7存储在闪存里面?
要看你定义的const是全局的还是局部的, 全局的const是放falsh, ...

多谢,周一到公司弄个电路板验证一下。谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 06:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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