ISR/主程式共享變數情況需設定成volatile,計時器一定要設成volatile.
原因如下:
編譯器不一定知道 ISR 會在任意時間修改它,因此可能將值暫存在 CPU 暫存器。
所以在其它地方還是讀取變數,而ISR的修改卻存在CPU暫存器沒存回變數,
會因此造成錯誤。(編譯器不最佳化可能不會出問題,但最佳化後可能會出問題)
因為使用免費的編譯器沒有最佳化功能所以不會有問題 >"<
volatile 不代表執行緒安全
volatile 只保證編譯器不要省略或快取存取,不提供:
- 原子操作保證
- 互斥鎖
- 防止 ISR 在操作中間插入
- 多個變數的一致性
留言
張貼留言