FreeRTOS學習(九)資源管理

2021-10-22 19:18:28 字數 3472 閱讀 6521

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好像沒有系統的專門的資源管理工具,導 致資源管理十分凌亂而容易出問題,雖然有些牛人也開發了一些工具來管理這些資源,但由於使用不便或者其他一些原因,比如資源由大量的巨集控制,以及修改維護 的人多,還有一些其...