FreeRTOS 資源管理

2021-10-05 09:55:44 字數 3610 閱讀 5869

在多工系統中,有這麼一種情況,如果某個任務開始訪問資源,但是發生了任務排程,在它從執行態退出前,還沒有完成對資源的訪問。那麼,如果這個資源被其他任務修改,就會造成資料的遺失,甚至系統崩潰。

比如說有這麼幾種情況:

為確保資料一致性,必須使用「互斥」技術管理任務之間或任務與中斷之間共享的資源的訪問。

目標是確保一旦任務開始訪問乙個不可重入且不具有執行緒安全性的共享資源,同一任務對該資源具有獨佔訪問許可權,直到資源返回到consistent狀態。

臨界區格式如下:

示例

這樣可以實現printf不會被排程打斷。

格式如下:

與臨界區相比,掛起排程器只能防止任務的訪問,但是中斷還是可以訪問的!

vtasksuspendall()

排程程式通過呼叫vtasksuspendall()掛起。

掛起排程程式可防止發生上下文切換,但會使中斷保持啟用狀態。

如果中斷在排程程式掛起時請求上下文切換,則請求將掛起,並且僅在排程程式恢復時執行。

排程程式掛起時,不能呼叫freertos api函式。

排程器可以呼叫xtaskresumeall()恢復排程。示例

互斥量是二值訊號量的乙個特殊形式,它用來控制共享資源在多個任務之間被訪問。

當在互斥場景中使用互斥量時,互斥量可以被視為與共享的資源相關聯的令牌。要使任務合法地訪問資源,它必須首先成功地「獲取」令牌(作為令牌持有者)。當令牌持有者使用完資源後,必須將令牌「交回」。只有當令牌已返回時,另乙個任務才能成功獲取令牌,然後安全地訪問同一共享資源。除非任務持有令牌,否則不允許它訪問共享資源。

儘管互斥量和二值訊號量都可以實現同步,但是他們是有區別的:

示例:

上圖展示了使用互斥量的潛在陷阱之一。所描述的執行順序顯示了高優先順序任務2必須等待低優先順序任務1放棄互斥量的控制。以這種方式被低優先順序任務延遲的高優先順序任務稱為「優先順序反轉」。當有中等優先順序任務在高優先順序任務等待訊號量時開始執行,這個後果更加嚴重。結果將是高優先順序任務等待低優先順序任務,而低優先順序任務甚至無法執行。最壞的情況如下圖所示。

由於mp任務搶占了lp,導致lp無法釋放互斥量,系統死鎖。

互斥量有優先順序繼承機制,而二值訊號量沒有。優先順序繼承可以減輕優先順序反轉的問題,但是並不能完全解除。然而,優先順序繼承使系統時序分析複雜化,過度依賴優先順序繼承也是不可取的。

優先順序繼承的工作方式是暫時將互斥鎖持有者的優先順序提高到試圖獲取相同互斥鎖的最高優先順序任務的優先順序。持有互斥鎖的低優先順序任務「繼承」等待互斥鎖的任務的優先順序。如圖所示。互斥鎖持有者的優先順序在返回互斥鎖時自動重置為其原始值。

死鎖是另乙個使用互斥量的潛在陷阱

如果兩個任務互相占有對方的資源,就會造成死鎖

與優先順序反轉一樣,避免死鎖的最佳方法是在設計時考慮其發生的可能性,並設計系統以確保不會發生死鎖。任務無限期地等待(沒有超時)以獲得互斥鎖通常是一種不好的做法。相反,使用比預期的等待互斥鎖的最長時間稍長的延時,然後在該時間內未能獲取互斥量,可能會造成死鎖。

一般在小系統中,死鎖並不是大問題,設計者可以判斷是否會發生死鎖。

乙個任務也有可能自己死鎖,考慮如下情況:

在這個場景中,任務處於阻塞狀態,等待互斥量返回,但是任務已經是互斥量的持有者。由於任務處於阻塞狀態以等待自身,因此發生了死鎖。

通過使用遞迴互斥代替標準互斥量,可以避免這種死鎖。遞迴互斥量可以由同乙個任務獲取多次,並且僅在前乙個遞迴互斥量被釋放後才會返回。

apixsemaphoretakerecursive()

xsemaphoregiverecursive()

示例如果兩個優先順序不同的任務使用相同的互斥鎖,那麼freertos排程策略將清除任務的執行順序;可以執行的最高優先順序任務將被選擇為進入執行狀態的任務。例如,如果高優先順序任務處於阻塞態以等待低優先順序任務持有的互斥量,則高優先順序任務將在低優先順序任務返回互斥量時搶占低優先順序任務。然後,高優先順序任務將成為互斥鎖持有者。

如果任務1和任務2具有相同的優先順序,並且任務1處於阻止狀態以等待任務2持有的互斥鎖,則當任務2釋放互斥量時,任務1不會搶占任務2。相反,任務2將保持在執行狀態,任務1將簡單地從阻塞狀態移動到就緒狀態。如圖:

這是因為:

看門任務提供了一種實現互斥的方法,而不存在優先順序反轉或死鎖的風險。

看門任務是對資源具有唯一所有權的任務。只有看門任務才允許直接訪問資源,任何其他需要訪問資源的任務只能通過使用看門任務間接訪問資源。

設定:

看門任務使用freertos佇列對標準輸出的訪問。任務的內部實現不必考慮互斥,因為它是唯一允許直接訪問標準輸出的任務。看門任務的大部分時間都處於阻塞狀態,等待訊息到達佇列。當訊息到達時,看門任務只需將訊息寫入標準輸出,然後返回到阻止狀態以等待下乙個訊息。如圖所示。

輸出

FreeRTOS學習(九)資源管理

2.資源管理方法 3.全域性變數 4.總結 1.1 必要性 在多工系統中,會存在一種潛在的風險。比如,當乙個任務正在使用某個資源時,被另乙個任務或中斷搶占訪問該資源,將造成資料損壞。可能存在類似風險的場景有以下幾種 1 訪問外設 舉個例子,任務a通過串列埠向主機傳送感測器資料,任務b搶占任務a傳送命...

MTK資源管理

資源檔案生成的臨時檔案主要有 custmenutree out.c,這個檔案是選單臨時檔案,生成了我們的最終顯示的選單結構。如果你新增的選單沒有顯示,正常顯示的選單突然不顯示了或者顯示錯位了,或者顯示的選單與呼叫的功能不符合了,都可以從這裡查到原因。resource base table.txt這個...

MTK資源管理

使用mtk作開發,常常不可避免和資源打交道,常使用的資源有字串,字型,選單,風格,聲音等,mtk好像沒有系統的專門的資源管理工具,導 致資源管理十分凌亂而容易出問題,雖然有些牛人也開發了一些工具來管理這些資源,但由於使用不便或者其他一些原因,比如資源由大量的巨集控制,以及修改維護 的人多,還有一些其...