这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 寄存器操作

共5条 1/1 1 跳转至

寄存器操作

菜鸟
2009-02-23 17:14:40     打赏

下面是一个定时器的中断函数,即定时器的比较中断函数
__interrupt(vect=22) void CSystem::TimerISR(void)
{
    static bool Toggle;

     // Read the flag before clearing it
     volatile char x   = TV.TCSRV.BYTE;

    // Clear compare match flag A
   TV.TCSRV.BYTE    = 0x19;   // enable control fan
  
   // Allow interrupts
   and_ccr(0x7F);

   // Run system tick every 1ms
   if (Toggle) {
      Toggle = false;
      CSystem::Tick1ms();
   } else {
      Toggle = true;
   }
}
有两个问题:
1. 一直都有这样一个习惯,就是再中断函数中在清寄存器标志位前会读该标志位,但现在回到 思考一下,觉得很迷茫,为何要这样做呢?
2. 还有,将下面语句:
volatile char x   = TV.TCSRV.BYTE;
改写成:
char x   = TV.TCSRV.BYTE;
程序也不会出问题,为何要加上一个volatile? 这也不是一个其他函数要用到的变量啊。
希望哪位给小弟指点迷津。多谢!!




关键词: 寄存器     操作    

高工
2009-02-23 17:26:38     打赏
2楼
路过的大侠都来支招吧!~~

助工
2009-02-24 08:08:16     打赏
3楼
请参阅数据手册
1,要先读后清零
2,读后的数据基本是垃圾数据

你可以注释掉那两句看看会发生什么。。。。
死循环或者看门狗复位!

高工
2009-02-24 21:31:05     打赏
4楼
先回答第一个问题,进中断绝大多数是要清中断标志位的,为下一次中断做准备,当然要先读数据再清标志位,否则数据将丢失。
第二个问题, volatile 就是一个类型修饰符,有它的话主要是实现代码优化和处理多线程程序的,在一些比较大的程序中一般都要用到。

助工
2009-03-06 08:52:46     打赏
5楼

学习中 顶一下希望有更多的人谈谈经验


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]