首先来看一段代码:
//P1.0口连接LED0,实现LED0闪烁 #include <msp430.h> int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer unsigned int i; P1DIR=0x01; //定义P1.0口为输出引脚。 while(1) { P1OUT=0x01; //P1.0输出高电平 for(i=5000;i>0;i--); P1OUT=0x00; //P1.0输出低电平 for(i=5000;i>0;i--); } } |
测试结果:
LED0一直亮着
为什么会这样呢?
把上述代码变量i的定义语句做出如下修改,再烧写并上电测试
volatile unsigned int i; |
测试结果:
LED0 闪烁
为什么加了volatile关键字就把问题解决了呢,这个关键字作用到底是什么?
Volatile:定义“发挥性”变量,编译器将认定该变量的值会随时改变,对该变量的任何操作都不会被优化过程删除。编者在实际编程的过程中发现,利用变量i递减或递加产生的软件延时函数,会被编译器优化而不会执行,因此若读者遇到这种情况且希望延时函数工作,只能在变量i前加volatile关键字即可
注:上述内容摘自《MSP430单片机原理与应用—MSP430F5xx/6xx系列单片机入门、提高与开发(任保宏、徐科军)》
总结:
volatile关键字作用。从实验1测试结果可以得出,两条for循环语句均被编译器优化过程删除。实际while循环中仅有P1OUT=0x01;P1OUT=0x00;所以输出结果LED0常亮。通过实验2可以得出如下结论:volatile关键字作用是告诉编译器该变量(变量i)任何操作都不可以被优化过程删除且希望软件延时函数能正常工作。