談一下臨界區保護
出現問題,才能解決問題:
一個全局變數,被一個中斷和一個任務使用,都是對其加一。這就出現了衝突,大家都能讀寫,那麼變數的整個讀寫更新就出現了混亂。
解決方法很簡單,就是在任務運行時,直接disable中斷.
實現起來超級簡單,ARM裏有一個中斷控制寄存器PRIMASK,給1或者給0即可。
新的問題產生了,關中斷操作太黃太暴力,連延遲函數都沒有辦法使用了,這就需要一個更加巧妙的方法---調度鎖保護
給一個初始值為0的全局變數作為鎖,上鎖就++,解鎖就--。每次任務調度的時候判斷,如果大於零就說明有所,不做任務切換,反之就切換。
推薦閱讀: