单片机 德州仪器 MSP430 变量

德州仪器MSP430单片机程序:#include<msp430x14x.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD;//Stopwatch... 德州仪器MSP430单片机程序:

#include <msp430x14x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction

for (;;)
{
volatile unsigned int i;

P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR

i = 50000; // Delay
do (i--);
while (i != 0);
}
}
其中有一句声明变量的语句:
volatile unsigned int i;
请问为什么要加volatile ?
我记得51单片机是直接unsigned int i;
这样声明的,没有加volatile,求开导,谢绝复制
展开
 我来答
mc_wangbo
2012-02-21 · TA获得超过1368个赞
知道小有建树答主
回答量:825
采纳率:0%
帮助的人:256万
展开全部
在这个程序里,可以不加volatile,不影响程序延时功能。
一个变量定义成volatile,编译器会给它指定一个RAM空间,编译器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
volatile在help/ C/C++ Compiler Reference Guide和百度百科 里有详细介绍。
fishmin2005
2012-02-21 · TA获得超过529个赞
知道小有建树答主
回答量:498
采纳率:0%
帮助的人:425万
展开全部
简单一点说。volatile类型的变量是没有副本的,只有一份,不允许进行缓存或拷贝。
因为有些变量是允许用寄存器进行缓存的,例如在正常函数运行时有一个中断要处理,这时系统会进行压栈,把当前寄存器里的数据进行存储,待中断完成后再出栈继续执行。
这时我们假设有一个变量red被压栈了,是在寄存器r4里的。待出栈后他还会返回到r4里。看似没有问题。但是要注意到,假设我们在中断中对red这个变量进行了修改。那么出栈后r4中的变量就不是red了。没有得到及时更新。
而volatile变量就可以解决这个问题,因为它是即取即用,不允许备份压栈,每次用都要去固定地址取,而不是从寄存器。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hwk612167
2012-02-22 · TA获得超过1322个赞
知道小有建树答主
回答量:281
采纳率:100%
帮助的人:316万
展开全部
不加volatile,可能被编译器优化掉
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式