FreeRTOS資源管理
FreeRTOS資源管理
概覽
在多工環境中,資源訪問可能不是原子操作,可能會導致資源的不一致
常見情況:
1.訪問外設
比如,不同優先順序的任務同時進行LCD的列印,可能會出現亂碼。
2.讀-寫-改操作
讀記憶體到暫存器,寫暫存器,寫回記憶體。
這種操作是非原子的,可能會被中斷。
類似資料庫的髒資料。
3.變數的非原子操作
更新重要的結構體或者大於體系結構自然長度的變數。
變數很大,可能會被中斷,導致資料丟失或者損壞。
4.函式重入
如果一個函式除了訪問自己棧空間上分配的資料
或者是核心暫存器中的資料外,不會訪問其他任何資料,
則該函式是可重入的。
臨界區與掛起排程器
基本臨界區
基本臨界區是指巨集taskENTER_CRITICAL和taskEXIT_CRITICAL之間的程式碼區間。
基本臨界區的程式碼不會切換到其他任務。
臨界區是一種非常簡單的實現方法,臨界區的工工作僅僅是簡單的把中斷全部關掉。
臨界區必須只有很短的時間,否則會影響中斷相應時間。
臨界區的巢狀是安全核心維護了巢狀深度計數,臨界區只會在深度為0時才退出。
掛起排程器
可以通過掛起排程器來建立臨界區,保護一段程式碼不會被其他任務打斷。
可以使用vTaskSuspendAll掛起,使用xTaskResumeAll恢復
互斥量
互斥量是一種特殊的二值訊號量,用於控制兩個或者多個任務間訪問共享資源。
互斥量和二值訊號量的區別:
a.用於互斥的訊號量必須歸還
b.使用者同步的訊號通常是完成之後便丟棄,不再歸還
1.優先順序反轉
高優先順序的任務依賴低優先順序任務的訊號量,導致高優先順序任務等待低優先順序任務。
2.優先順序繼承
優先順序繼承暫時地將互斥量持有者的優先順序提升至所有等待此互斥量的任務所具有的最高優先順序。
互斥量持有者在歸還互斥量時,優先順序自動設定為其原來的優先順序。
3.死鎖
死鎖是互斥功能的另一個潛在缺陷。
當兩個任務在等待被對方持有資源時,兩個任務都無法再繼續執行。
守護任務
守護任務時對某一資源唯一具有所有權的任務。
資源管理API
API | 功能 |
---|---|
vTaskSuspendAll | 掛起排程器 |
xTaskResumeAll | 喚醒排程器 |
xSemaphoreCreateMutex | 建立互斥量 |