您的位置 首页 硬件

TQ2440之定时器中止0——volatile关键字的重要作用

近日,在学习《ARM处理器裸机开发实战——机制而非策略》一书,在TQ2440开发板上,按照书中实例以及光盘配套程序源代码进行Timer0中断试验…

近来,在学习《ARM处理器裸机开发实战——机制而非战略》一书,在TQ2440开发板上,依照书中实例以及光盘配套程序源代码进行Timer0中止实验,编译成功后烧写到开发板上,没有任何反响,重复查看代码,一向没有找出哪里有问题,便是到开发板上没有预期效果。(让人纠结的很)

终究参阅了TQ2440之定时器中止0的程序代码,编译成功后,烧写到板子上,惊喜呈现了。肯定是久旱逢甘霖的感觉,在这儿对TQ2440之定时器中止0的原创作者表明感谢。

后来,经过代码比照,发现两个可疑的当地:

(1)之前的Timer0的初始化中没有rTCMPB0 = 0;这条句子。

而后来参阅TQ2440之定时器中止0中的代码是有这条句子的。

后来经过验证,这儿无关紧要。

(2)之前关于Led1灯亮灭操控句子是放在Main函数中的:

而后来参阅的TQ2440之定时器中止0中是将这段代码放在了中止服务函数傍边:

不过,按道理来讲,这个当地不加修正应该是能够的。

暂时先总结这样一条经历吧:假如一些操控句子(比方操控Led灯亮、灭)是要经过中止来驱动履行,那么最好将这些操控句子放在中止服务程序(也叫中止处理程序)中。假如只是在中止服务程序中操控一个全局变量(比方flag),而在Main函数中依据flag来驱动操控句子的履行,或许得不到预期效果。

为什么代码逻辑入情入理却得不到预期效果呢?其本源在于,在界说flag时没有加volatile要害字

volatile要害字的效果:当一个变量用volatile要害字润饰,表明该变量或许被硬件更改,因而每次读取这个变量值的时分都要从头从内存中读取这个变量,而不是运用保存在寄存器里的备份。

这儿有一篇文章:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html彻彻底底的解说了volatile。也正是关于我在Timer0中止实例中遇到的问题的具体回答。其间要害点如下:

volatile提示编译器它后边所界说的变量随时都有或许改动,因而编译后的程序每次需求存储或读取这个变量的时分,都会直接从变量地址中读取数据。假如没有volatile要害字,则编译器或许优化读取和存储,或许暂时运用寄存器中的值,假如这个变量由其他程序更新了的话,将呈现不一致的现象。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/325886.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部