硬件设备:MSP430 Launch——MSP430G2452单片机
软件程序:
#include<msp430g2452.h>
void delay();
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR=0XFF;
P1OUT |=BIT0;
while(1)
{
delay();
P1OUT<<=1;
}
}
void delay(void)
{
unsigned int i;
i = 50000; // Delay
do (i–);
while (i != 0);
}
用IAR编译下载,LED从左到右依次点亮,实验现象正常
用CCS编译下载,LED没有任何反应。
但CCS使用如下程序,实验现象正常。
#include<msp430g2452.h>
void delay();
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR=0XFF;
P1OUT |=BIT0;
while(1)
{
delay();
P1OUT<<=1;
}
}
void delay(void)
{
volatile unsigned int i;
i = 50000; // Delay
do (i–);
while (i != 0);
}
为什么要使用volatile?
Lichen Wang:
我不會用 c 語言
我猜想 c 編譯 一定非常聰明, 它一定認為 c 程式員又愚蠢又嘍囉。例如:do (i–);while (i != 0);它認為 就 c 語言而言, (除非 i 有揮發性), 簡直是廢話, 應該完全忽略不提。
知行:
回复 kqian0327:
感谢您的回答,函数是在main函数之前,的确是优化等级打高了。
知行:
回复 Lichen Wang:
我只是初学者,尽管不是很懂,感谢你的回答
kqian0327:
回复 知行:
你好,
欢迎加入MSP430大家庭~
多看看别人问的帖子,你会收获很多: )
琉璃酱:
回复 kqian0327:
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止编译器对代码进行优化.