實際場景:操作系統
首先有個標誌位 pps_flag,是一個全局變量。有兩個地方會用到這個變量,一個是pps信號觸發的外部中斷,一個是ucos的任務。當pps信號觸發外部中斷的時候pps_flag被置爲2,當任務裏面檢測到pps_flag被置爲2的時候,會把pps_flag設置爲0,所以就產生一個問題,會不會這樣操做,致使pps_flag亂掉。沒法保證數據的可靠性和完整性啊。怎麼搞,所以查了一下書《基於嵌入式實時操做系統點的程序設計技術》第七章資源同步-103頁。設計
1.關中斷資源
當參與訪問共享資源的 程序中包含 中斷程序(ISR)時,必須也只能用關中斷的方式處理。優勢是簡單,缺點是影響系統實時性。所以在關中斷裏的代碼必須的短。同步
採用OS_ENTER_CRITICAL(); 關中斷程序設計
採用OS_EXIT_CRITICAL();退出關中斷變量
2.關調度程序
關調度只能用於任務之間,並且關調度開啓的時候不影響中斷的運行,他只是不讓各個task跑了,對系統其餘的運行操做無影響。關調度的缺點是:使與該共享資源無關的任務都受到牽連,把全部任務都暫停了,確定受牽連了啊。技術
OSSchedLock(); OSSchedUnlock();數據
若是關調度時間長了,那麼會影響其餘的任務運行,因此不要使用關調度,採用互斥鎖吧。時間
3.互斥鎖-互斥信號量
互斥鎖也是僅限於 任務之間使用,若是涉及到了isr,那麼還得使用關中斷。使用互斥鎖的時候,對於其餘任務和中斷都沒有影響,只對涉及到使用共享資源的任務有影響。所以對於系統的實時性影響最小。
OSMutexPend(Sem,0,&err);
OSmutexPost(Sem);