FreeRTOS(三)——资源管理
概述
多任務系統中存在一種潛在的風險,當一個任務在使用某個資源的過程中,即還沒有完全結束對資源的訪問時,便被切出運行態(tài),使得資源處于非一致,不完整的狀態(tài),如果這個時候有另一個任務或者中斷來訪問這個資源,則會導致數據損壞或者其他相似的錯誤。
會發(fā)生該問題的情景:
一個函數只訪問自己棧空間上的數據或者是內核寄存器中的數據,不訪問其他任何數據,比如全局變量啥的,則這個函數就是重入的。否則不可重入。
互斥
互斥保證資源在被訪問后具有排他性,防止資源被意外修改
最高的互斥方法
盡量不要共享資源,或者是每個資源都通過單任務訪問。
互斥的方法
臨界區(qū)與掛起調度器
- 基本臨界區(qū)
臨界區(qū)指在訪問資源前,關閉全部中斷,在訪問資源后,再恢復中斷,是一種非常原始的方法。
臨界區(qū)必須只具有很短的時間,否則會反過來影響中斷響應時間
- 掛起(鎖定)調度器
掛起調度器,保證代碼區(qū)不會被其他任務或中斷打斷。
互斥量
互斥量是一種特殊的二值信號量,用于控制在兩個或多個任務間訪問共享數據。
互斥量的機制:
一個任務想要合法地訪問資源,必須先成功的得到該資源對應的令牌,當完成對資源的使用后,必須馬上歸還令牌。只有歸還了令牌,其他任務才可能訪問共享資源。
互斥量和二值信號量的區(qū)別:
- 用于互斥的信號量必須歸還
- 用于同步的信號量通常是完成同步后便丟棄,不再歸還
優(yōu)先級反轉
互斥量容易導致一個問題是優(yōu)先級反轉,優(yōu)先級反轉會導致重大問題
即高優(yōu)先級任務因為無法獲取互斥信號,而阻塞,導致低優(yōu)先級優(yōu)先運行。
更嚴重的一種情形:
低優(yōu)先級先運行,獲得互斥量,高優(yōu)先級無法獲得互斥量而阻塞,這時候,一個中等優(yōu)先級任務開始運行,搶占了低優(yōu)先級,然后低優(yōu)先級任務block了,無法give互斥量,從而高優(yōu)先級也無法運行。
優(yōu)先級繼承
最小化減少優(yōu)先級反轉的負面影響,但不能完全消除。
通過暫時的將互斥量持有者的優(yōu)先級提升至所有等待此互斥量的任務所具有的最高優(yōu)先級,互斥量持有者歸還互斥量后,優(yōu)先級會自動設置為其原來的優(yōu)先級。
死鎖
兩個資源都等待被對方持有時,兩個任務都無法再繼續(xù)執(zhí)行,這種情況成為死鎖。
守護程序
守護程序提供一種干凈利落的方法來實現互斥功能,而不用擔心會發(fā)生優(yōu)先級反轉和死鎖。
守護任務是對某個資源具有唯一所有權的任務,只有守護任務才可以直接訪問其守護的資源,其他任務要訪問該資源只能簡介的通過守護任務提供的服務。
守護程序的實現機制:
利用隊列,當其他任務想使用某個資源的時候,通過隊列發(fā)送消息給守護程序,由守護程序對資源進行操作。
總結
以上是生活随笔為你收集整理的FreeRTOS(三)——资源管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从更底层研究C\C++动态内存分配
- 下一篇: web前端 学习线路