2.資源管理方法
3.全域性變數
4.總結
1.1 必要性
在多工系統中,會存在一種潛在的風險。比如,當乙個任務正在使用某個資源時,被另乙個任務或中斷搶占訪問該資源,將造成資料損壞。可能存在類似風險的場景有以下幾種:
(1)訪問外設
舉個例子,任務a通過串列埠向主機傳送感測器資料,任務b搶占任務a傳送命令請求,這時便破壞了感測器資料的完整性。
(2)讀-改-寫操作
在**被編譯成組合語言後,有些暫存器值的修改過程是分多步完成的:①從記憶體中讀到暫存器,②在暫存器中修改資料,③然後再寫回記憶體,即「讀-改-寫」。因此在這個過程中也有可能被任務或中斷搶占破壞這個完整過程。
(3)變數的非原子訪問
更新結構體的多個成員變數。
(4)函式重入
被多個任務呼叫的函式有可能是不可重入函式。
1.2 互斥機制
由於多工系統存在以上隱患,freertos
總是希望訪問資源的這段**在執行的時候全程不要被打斷,或者即使打斷但是其它任務不能訪問同樣的資源。
全程不被打斷其實過於苛刻,所以基本都是專注於能夠被打斷但是重入後依然沒有問題的設計。任務被打斷的原因有2個:中斷(外部)的到來、排程器中斷(內部)排程任務,可以簡述為外部中斷和任務中斷,所以只要解決這2個問題,就可以實現資源互斥訪問機制。
通過以上可知,freertos
提供了4
種特性用於實現互斥機制,分別是臨界區、掛起排程器、互斥量和守護任務,各有優缺點,分別應用在不同的場合。
2.1 臨界區
一種最為簡單粗暴的方法,通過關閉閾值優先順序以下的任務來實現互斥,具體實現過程前面講過。
這種方式的要求是臨界區之間的**要盡可能精簡,避免影響freertos
的中斷響應,應用場景有任務建立、資料連續讀取等。
if
(cs1259ready()
)//等待ad開始訊號
2.2 掛起排程器
掛起排程器使得任務的執行過程不被其它任務打斷,但是可以被外部中斷打斷。
api功能
vtasksuspendall()
掛起排程器
xtaskresumeall()
喚醒排程器
vtasksuspendall()
++uxschedulersuspended;
//計數加1,用於巢狀和標記
xtaskresumeall()
taskenter_critical()
//進入臨界區
--uxschedulersuspended //計數減1,用於巢狀和標記
prvaddtasktoreadylist()
//調出就緒任務
taskexit_critical()
//退出臨界區
vtasksuspendall()
掛起排程器只是簡單地加1計數,因為這個uxschedulersuspended
全域性變數會在systick
中斷中使用(具體到xtaskincrementtick()
函式),如果uxschedulersuspended
不為0(掛起),那麼xtickcount
不再計數,表達系統心跳暫時停止,於是排程器也不會進行任務切換。
2.3 互斥量
互斥量不需要關閉任何中斷,它採用一種申請-釋放的方式去訪問資源,申請和釋放的其實不是資源,而是代表資源的鑰匙,在這種方式下,資源與一把鑰匙繫結,要想訪問資源,必須先拿到這把鑰匙,沒有鑰匙的只能等待前者釋放,所以即使擁有鑰匙的一方被打斷,後者也不能訪問資源。
2.4 守護任務
無論是臨界區、掛起排程器還是互斥量,它們的使用都帶來非常多的問題,核心原因是資源是公用的,資源的所有權和使用權都是公共的,任何乙個任務都可以去直接操作,為了解決這個核心原因,可以把資源私有化,所有權和使用權都在乙個任務a上面,其它任務只能間接去訪問,比如把要寫入的資料發給a,由a去寫入,把要讀的資料要求發給a,由a去讀然後返回資料等等。
守護任務的實現不需要什麼特性或者機制的支援,是乙個協議,設定好任務的**邏輯後就可以實現,它非常乾淨利落,把資源私有化後,阻塞等待其它任務的要求
例如穿戴手錶中的主機從機之間的資料傳輸,從機所有感測器的資料都是通過佇列傳送到守護任務,由守護任務統一傳送給主機。
在嵌入式開發中,難免要使用一些全域性變數,如果存在多個任務對同乙個全域性變數操作,那麼將帶來共享資源管理問題(上面提到的原子操作問題),即需要對這個全域性變數進行保護。
a任務正在使用全域性變數s,a任務由於任務切換暫停執行切換到b任務,而b任務也要使用s,這時候b任務修改了s的值。當再次切換到a任務的時候這個變數s就變了,a任務可能就執行出錯。如果存在以上使用場景,可以為全域性變數新增互斥保護。即在任務對全域性變數進行操作時必須獲得互斥量,然後進行讀寫,讀寫完後釋放訊號量。
a任務要使用佇列s,先申請,申請成功以後才可以使用。b任務也要使用s的時候也要先申請,當時發現s已經被a任務使用了,所以b任務就沒法使用(假設當前的佇列長度為1),直到a任務使用完s並且釋放掉b任務才申請使用!這裡提到了一種特殊情況:如果乙個任務只是對全域性變數進行讀操作,乙個任務只是對全域性變數進行寫操作,這種情況是是否還要對全域性變數新增互斥保護。
互斥機制
本質優點
缺點臨界區
關閉任務中斷和外部中斷
確保資源訪問不可能被打斷,資源訪問過程簡單
其餘任務停滯、外部中斷得不到響應
掛起排程器
關閉任務中斷
可以響應外部中斷,不能被其它任務打斷,資源訪問過程簡單
其餘任務停滯
互斥量資源需要申請和釋放
不需要關中斷,資源訪問過程簡單
容易出現死鎖和優先順序反轉
守護任務
資源私有化
不再出現以上問題缺點
資源訪問過程複雜,間接訪問可能帶來速度和效率問題
FreeRTOS 資源管理
在多工系統中,有這麼一種情況,如果某個任務開始訪問資源,但是發生了任務排程,在它從執行態退出前,還沒有完成對資源的訪問。那麼,如果這個資源被其他任務修改,就會造成資料的遺失,甚至系統崩潰。比如說有這麼幾種情況 為確保資料一致性,必須使用 互斥 技術管理任務之間或任務與中斷之間共享的資源的訪問。目標是...
MTK資源管理
資源檔案生成的臨時檔案主要有 custmenutree out.c,這個檔案是選單臨時檔案,生成了我們的最終顯示的選單結構。如果你新增的選單沒有顯示,正常顯示的選單突然不顯示了或者顯示錯位了,或者顯示的選單與呼叫的功能不符合了,都可以從這裡查到原因。resource base table.txt這個...
MTK資源管理
使用mtk作開發,常常不可避免和資源打交道,常使用的資源有字串,字型,選單,風格,聲音等,mtk好像沒有系統的專門的資源管理工具,導 致資源管理十分凌亂而容易出問題,雖然有些牛人也開發了一些工具來管理這些資源,但由於使用不便或者其他一些原因,比如資源由大量的巨集控制,以及修改維護 的人多,還有一些其...