被兩個及以上併發程序單元(任務或者ISR)訪問的資源稱爲共享資源,共享資源不一定是全局資源(有的全局變量只被一個任務調用)。
具體可以採用以下方法:
1.關中斷
OS_ENTER_CRITICAL();//關中斷
........
OS_EXIT_CRITICAL();//退出中斷
中斷關閉後,系統失去對有所事件的反應能力,不可能進行任務切換,保證對共享資源的獨佔訪問。
2.關調度
OS_SchedLock();//關調度
........
OS_Schedunlock();//開調度
與該共享資源無關的任務也受到牽連,即使他們的優先級足夠高、ISR觸發也無法獲得CPU使用權。
3. 互斥信號量
INT8U err;
OS_EVENT *Sem;//創建互斥信號量,繼承優先級爲2.繼承優先級必須高於所有需要訪問這個共享資源的任務的優先級,且繼承優先級不能和其他任務的優先級相同。
void task(void * pdata)
{
........
OSMutexPend(Sem,0,&err);獲取互斥信號量Sem
........
OSMutexPost(Sem);//釋放互斥信號量Sem
}
4.保證數據的完整性
將共享資源備份一份,再進行處理。提高系統的實時性。