打印
[原创]

volatile关键字作用

[复制链接]
848|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
闵大|  楼主 | 2019-9-5 20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先来看一段代码:
  
//P1.0口连接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)任何操作都不可以被优化过程删除且希望软件延时函数能正常工作

使用特权

评论回复

相关帖子

沙发
airwill| | 2019-9-11 21:28 | 只看该作者
这应该还跟编译器的优化设置有关吧

使用特权

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

本版积分规则

7

主题

23

帖子

0

粉丝