對於共享資源的訪問或者一些非原子操作的保護,有幾種常用方法:
1. 透過掛起中斷建立臨界區
2. 透過掛起排程器
3. 透過互斥量
1. 掛起中斷
taskENTER_CRITICAL();
taskEXIT_CRITICAL();
對於臨界區的內容處理短、快速的程式碼,可以使用中斷掛起,但是,該套函式掛起的中斷僅僅是優先順序在
configMAX_SYSCAL_INTERRUPT_PRIORITY (包含)以下的中斷。
這兩個函式介面配對使用
這兩個函式支援巢狀使用
2. 掛起任務排程器
void vTaskSuspendAll( void ); portBASE_TYPE xTaskResumeAll( void );
這個主要是臨界區中的程式碼處理比較長,將排程器掛起,暫時獨佔CPU進行處理這段程式碼
3. 互斥訊號量
互斥訊號量保證資源被安全的訪問,但是,當低優先順序任務佔有資源時,高優先順序任務也要等待低優先順序任務釋放資源才能進行訪問。這是要避免死鎖問題。
對於互斥訊號量導致的優先順序倒掛問題,優先順序繼承可以對齊進行最佳化。
守護程序;
對於死鎖和優先順序倒掛問題,另一個解決方法是: 對於共享資源,僅由唯一一個任務(稱作守護程序)進行操作,透過佇列進行資料傳遞,此時,需要此程序有一個較高的優先順序,保證能夠及時相應。