主函数与中断函数共用变量

1、变量的读-写

主函数对变量的 读-写,可能会造成中断函数对变量的 读-写无效。

  • 当主函数刚刚把变量读入到内部寄存器时,还未再回写到变量中时,就发生了中断,中断改写了变量。当中断返回时,主函数将值再回写到变量中。造成中断函数对变量的改写无效

2、多字节变量读取错误

当变量的其中一个字节读入到寄存器中时,发生中断,中断中改写了变量值。当中断返回时,变量的其他字节继续被读入到寄存器中,造成新旧字节组合错误

3、解决方法

主函数与中断函数共享变量的问题类似两个线程共享资源的问题,如何解决共享资源冲突是系统结构设计的关键。

1、volatile正确使用
2、注意临界段(或原子操作)“写变量时,关中断,写完后再打开”
3、引入一个相同类型的临时变量

  • unsigned int tmp_counter;
    在使用ms_counter做判断前作如下操作:
    do{
    tmp_counter = ms_counter;
    }while(tmp_counter != ms_counter);
    然后使用tmp_counter代替ms_counter进行判断。

4、volatile使用场景

1、中断程序中修改的供其他程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志位需要加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写可能都有不同的意义。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值