加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

51单片机主程序和中断共享全局变量时的访问冲突

(2019-03-14 14:11:41)
标签:

c51

中断

全局变量

分类: C
为了避免访问冲突,需要注意如下事项:
(1)在主程序中访问时,需要先关中断,访问结束后再开中断,此过程代码要尽量精简,可以将全局变量赋值给临时变量或者另一个全局变量,后续处理使用这些替代的变量,这样可以尽可能地做到不影响实时性;
  PS:
         关闭中断后再打开中断,如果此期间有发生中断,则中断标志位还是会置位,待再次开中断后,还是可以正常地进入中断处理函数。
(2)共享的全局变量类型使用volatile修饰

        1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

        2、多任务环境下各任务间共享的标志应该加volatile;

        3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

       另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。


sample code:
//定义全局变量:ms计数器
volatile unsigned int cnt_ms;
//定义全局变量:ms计数器备份
unsigned int cnt_ms_bk;
//定义LED对应的IO口
sbit LED = P3 ^ 3;
//主循环读访问

int main(void)
{
 ......
 EA = 0;    //关中断
 if ((cnt_ms - cnt_ms_bk) > 500)
 {
  led = ~led;
  cnt_ms_bk = cnt_ms;
 }
 EA = 1;    //开中断
 ......
}

void timer0_interrupt(void) interrupt 1
{
 ......
 TL0 = 0x0cd; //装在1ms定时初值
 TH0 = 0x0f8;
 count_ms++;
 ......
}
---------------------------------------------------------------------------------------------
小知识:
(1)中断使能和中断标志的关系
中断使能和中断标志IFG是没有关系的,开中断使能会使程序指针随着中断标志的置位而跳到那个中断向量所指的段里去;不开中断使能的时候你的主函数就不会被打断。
中断标志xxxIFG会随着某个事件发生而置位,是为了方便编程时候判断具体发生了什么事件用的,两者互相独立不冲突。

--------------------------------------------------------------------------------------------
参考文章:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有