1. 程式人生 > >【轉載】UCOS臨界程式碼問題以及解決辦法

【轉載】UCOS臨界程式碼問題以及解決辦法

先上圖
1

①:有兩個任務1和2(任務1優先順序<任務2優先順序),兩個任務用到了同一個全域性變數nGlobalVar,然後中斷來了!中斷打斷了任務1,中斷退出之後,一定退回到任務1繼續往下執行嗎?
解答:答案是否定的!!答案是否定的!!因為在中斷退出前,實現了任務切換,更高優先順序的,就緒的任 務被執行!!所以說中斷退出後,程式可能跳轉到任務2!!

②:如果任務2中修改了nGlobalVar變數,那在執行任務1的時候,任務就不會走向剛才的分支結構了。程式就可能出問題!!
解答:方法如圖,在執行分支結構之前,禁止中斷;在執行完分支結構,才開啟中斷。
2
好了,那麼問題又來了:看圖,類似臨界程式碼巢狀吧
3


假設在關閉中斷的程式裡面呼叫了subFun()函式,而子函式同樣也有關閉中斷,開啟中斷的處理。那麼很有可能在臨界區並沒有執行完成的條件下,中斷被打開了。臨界區的一部分被截掉了!!!!

  解決方法:

在上文的主程式中宣告一個cpu_sr變數,在subFun函式中也宣告一個cpu_sr變數

**主程式中:
cpu_sr = ARMCoreDisableIntExt();//cpu_sr開始是開啟中斷的狀態
……
//subFun函式

cpu_sr = ARMCoreDisableIntExt();//cpu_sr此時是關閉中斷的狀態
……
ARMCoreRestoreIntStatus(cpu_sr );//恢復cpu到關閉中斷的狀態

……
ARMCoreRestoreIntStatus(cpu_sr );//恢復cpu到開始狀態**

看看,多巧妙,通過一個區域性變數,實現了這個保護臨界程式碼的功能。

/******
文章為轉載
uCOS臨界處理_開啟中斷,關閉中斷 恢復中斷最初狀態
(出處: 微控制器論壇)
********/