主函数与中断函数共用变量
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说明,因为每次对它的读写可能都有不同的意义。