打印
[AVR单片机]

一个奇怪的问题用volatile来定义,会减少flash存储

[复制链接]
2981|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lionwes|  楼主 | 2007-3-2 12:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
阿发| | 2007-3-2 23:43 | 只看该作者

这个问题比较有意思

两种定义在程序对变量操作上是有一定区别的,但要具体说明为什么少了这么多flash还是看一下生成的代码比较好。

使用特权

评论回复
板凳
hotpower| | 2007-3-3 01:32 | 只看该作者

有时多有时少~~~

使用特权

评论回复
地板
BitFu| | 2007-3-3 14:24 | 只看该作者

通常会变大

使用特权

评论回复
5
gtw| | 2007-3-3 15:24 | 只看该作者

变少是你的运气,看看哪些操作会变小……

使用特权

评论回复
6
lionwes|  楼主 | 2007-3-4 23:10 | 只看该作者

hotpower

hotpower 是否知道原因??

使用特权

评论回复
7
simon21ic| | 2007-3-5 02:07 | 只看该作者

看一下相关的汇编不就知道了

如题

使用特权

评论回复
8
lionwes|  楼主 | 2007-3-5 10:09 | 只看该作者

看了汇编

看了汇编确实是多了一些语句,但是我想问是为什么??
126:        volatile unsigned char i,dot_ID=0;
+00000551:   2422        CLR     R2               Clear Register
+00000552:   822E        STD     Y+6,R2           Store indirect with displacement





145:         unsigned char i,dot_ID=0;
+00000551:   2400        CLR     R0               Clear Register
+00000552:   01FE        MOVW    R30,R28          Copy register pair
+00000553:   5BE3        SUBI    R30,0xB3         Subtract immediate
+00000554:   4FFF        SBCI    R31,0xFF         Subtract immediate with carry
+00000555:   8200        STD     Z+0,R0           Store indirect with displacement


为什么用volatile定义,会出现这种情况?

使用特权

评论回复
9
lionwes|  楼主 | 2007-3-5 10:20 | 只看该作者

volatile的解释

我看了一些volatile的解释,“volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的”
“volatile总是与优化有关”,“但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化”  是不是因为这个原因,所以volatile禁止我的程序优化,也就少了这些汇编:
+00000552:   01FE        MOVW    R30,R28          Copy register pair
+00000553:   5BE3        SUBI    R30,0xB3         Subtract immediate
+00000554:   4FFF        SBCI    R31,0xFF         Subtract immediate with carry

请问大家这样解释是否正确?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

18

帖子

0

粉丝