中断和主函数都会改变同一个变量的问题

changfeng1800 |浏览2220次
收藏|2015/05/27 09:56

下面观点是否正确?
为了防止中断函数把某些共享数据破坏,在主函数中更改某个数据变量时,应该先关闭中断,修改完后再打开中断;如果是1个字节char变量没关系,如果是int等类型的2个字节以上的数据就有必要考虑一下。因为char是一个字节,在数据改变的时候,一条指令就可以更改完毕.而int是2个字节,更改数据的时候至少需要2条指令以上,所以我怕在刚执行一条指令的时候,还没来得及执行完第二条指令,也就是int数据还没更改完时出现定时中断,而恰好在定时中断里有发生了更改次变量的情况。

 

就是说中断里面用到的变量,如果主循环也有用,在主循环里面修改时,就要关中断,防止操作到一半,中断发生,中断里面改变了这个变量?

不知这个问题使用volatile能否解决?

 

满意回答

2022/09/06 16:51

Volatile只是说, 每次在用到这个变量时, 都要重新读一次, 防止有中断或其它任务改变了这个值.

对于Cortex系列单片机, 变量是存在内存中, 只要改写变量, 就要先读到寄存器中,值改变后,再回写到内存中, 所以即使是char型8bit变量, 只要中断里有改写,中断外(或低优先级中断里)改写时,就一定要先关全局中断, 改写完后,再开全局中断. 而中断外(或低优先级中断里)的读不必这样关开中断.

Angus

其他回答(0)
0人关注该问题
+1
 加载中...