談一下臨界區保護

出現問題,才能解決問題:

一個全局變數,被一個中斷和一個任務使用,都是對其加一。這就出現了衝突,大家都能讀寫,那麼變數的整個讀寫更新就出現了混亂。

解決方法很簡單,就是在任務運行時,直接disable中斷.

實現起來超級簡單,ARM裏有一個中斷控制寄存器PRIMASK,給1或者給0即可。


新的問題產生了,關中斷操作太黃太暴力,連延遲函數都沒有辦法使用了,這就需要一個更加巧妙的方法---調度鎖保護

給一個初始值為0的全局變數作為鎖,上鎖就++,解鎖就--。每次任務調度的時候判斷,如果大於零就說明有所,不做任務切換,反之就切換。

推薦閱讀:

相關文章