单片机 德州仪器 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,求开导,谢绝复制 展开
#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,求开导,谢绝复制 展开
3个回答
展开全部
简单一点说。volatile类型的变量是没有副本的,只有一份,不允许进行缓存或拷贝。
因为有些变量是允许用寄存器进行缓存的,例如在正常函数运行时有一个中断要处理,这时系统会进行压栈,把当前寄存器里的数据进行存储,待中断完成后再出栈继续执行。
这时我们假设有一个变量red被压栈了,是在寄存器r4里的。待出栈后他还会返回到r4里。看似没有问题。但是要注意到,假设我们在中断中对red这个变量进行了修改。那么出栈后r4中的变量就不是red了。没有得到及时更新。
而volatile变量就可以解决这个问题,因为它是即取即用,不允许备份压栈,每次用都要去固定地址取,而不是从寄存器。
因为有些变量是允许用寄存器进行缓存的,例如在正常函数运行时有一个中断要处理,这时系统会进行压栈,把当前寄存器里的数据进行存储,待中断完成后再出栈继续执行。
这时我们假设有一个变量red被压栈了,是在寄存器r4里的。待出栈后他还会返回到r4里。看似没有问题。但是要注意到,假设我们在中断中对red这个变量进行了修改。那么出栈后r4中的变量就不是red了。没有得到及时更新。
而volatile变量就可以解决这个问题,因为它是即取即用,不允许备份压栈,每次用都要去固定地址取,而不是从寄存器。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不加volatile,可能被编译器优化掉
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询