資源管理

爬上那个坡發表於2024-07-17

  對於共享資源的訪問或者一些非原子操作的保護,有幾種常用方法:

  1. 透過掛起中斷建立臨界區

  2. 透過掛起排程器

  3. 透過互斥量

1. 掛起中斷

taskENTER_CRITICAL();
taskEXIT_CRITICAL();

  對於臨界區的內容處理短、快速的程式碼,可以使用中斷掛起,但是,該套函式掛起的中斷僅僅是優先順序在

configMAX_SYSCAL_INTERRUPT_PRIORITY (包含)以下的中斷。  

  這兩個函式介面配對使用

  這兩個函式支援巢狀使用

2. 掛起任務排程器

void vTaskSuspendAll( void );
portBASE_TYPE xTaskResumeAll( void );

  這個主要是臨界區中的程式碼處理比較長,將排程器掛起,暫時獨佔CPU進行處理這段程式碼

3. 互斥訊號量

  互斥訊號量保證資源被安全的訪問,但是,當低優先順序任務佔有資源時,高優先順序任務也要等待低優先順序任務釋放資源才能進行訪問。這是要避免死鎖問題。

  對於互斥訊號量導致的優先順序倒掛問題,優先順序繼承可以對齊進行最佳化。

 守護程序;

  對於死鎖和優先順序倒掛問題,另一個解決方法是: 對於共享資源,僅由唯一一個任務(稱作守護程序)進行操作,透過佇列進行資料傳遞,此時,需要此程序有一個較高的優先順序,保證能夠及時相應。

相關文章