社区导航

 

搜索
查看: 1410|回复: 2

[原创] volatile关键字作用

[复制链接]

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-5 20:35 | 显示全部楼层 |阅读模式

此内容由EEWORLD论坛网友闵丨大原创,如需转载或用于商业用途需征得作者同意并注明出处
 

首先来看一段代码:

//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)任何操作都不可以被优化过程删除且希望软件延时函数能正常工作。



回复

使用道具 举报

2262

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2019-9-6 15:22 | 显示全部楼层

不错的分享,谢谢。



回复

使用道具 举报

1246

TA的帖子

3

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2020-1-22 19:33 | 显示全部楼层

请再深入一些吧

RTEMS



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-4 21:52 , Processed in 0.141446 second(s), 22 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表