FreeRTOS的多工處理

2021-08-31 23:42:05 字數 1947 閱讀 3570

1.freertos 多任務排程支援 時間片段,搶占式  和 和做式

任務侁先級可以在排程器啟動後呼叫 vtaskpriorityset() api 函式進行修改

任意數量的任務可以共享同乙個優先順序——以保證最大設計彈性。當然,如果需要的話,你也可以為每個任務指定唯一的優先順序(就如同某些排程演算法的要求一樣),但這不是強制要求的。低優先順序號表示任務的優先順序低,優先順序號 0 表示最低優先順序。有效的優先順序號範圍從 0 到(configmax_priorites – 1)。

我們知道裸機中,優先順序設定一樣時,會看硬體編號,小的優先順序高。

freertos中,優先順序數值越大的,優先順序越高,那麼,要是設定成優先順序相同呢?

2.排程器保證總是在所有可執行的任務中選擇具有最高優先順序的任務,並使其進入執行態。如果被選中的優先順序上具有不止乙個任務,排程器會讓這些任務輪流執行。這種行為方式在之前的例子中可以明顯看出來。兩個測試任務被建立在同乙個優先順序上,並

且一直是可執行的。所以每個任務都執行乙個」時間片」,任務在時間片起始時刻進入執行態,在時間片結束時刻又退出執行態

圖 3 中 t1 與 t2 之間的時段就等於乙個時間片。 

要能夠選擇下乙個執行的任務,排程器需要在每個時間片的結束時刻執行自己本身。乙個稱為心跳(tick,時鐘滴答)中斷的週期性中斷用於此目的。

時間片的長度通過心跳中斷的頻率進行設定,心跳中斷頻率由freertosconfig.h 中的編譯時配置常量 configtick_rate_hz 進行配置。比如說,如果 configtick_rate_hz 設為 100(hz),則時間片長度為 10ms。

freertos api 函式呼叫中指定的時間總是以心跳中斷為單位(通常的提法為心跳」ticks」)。

常量 porttick_rate_ms 用於將以心跳為單位的時間值轉化為以毫秒為單位的時間值。有效精度依賴於系統心跳頻率。心跳計數(tick count)值表示的是從排程器啟動開始,心跳中斷的總數,並假定心跳 計數器不會溢位。使用者程式在指定延遲週期時不必考慮心跳計數溢位問題,因為時間連貫性在核心中進行管理。

如果兩個任務都處於就緒狀體,排程器會一直執行那個優先順序高的 那個任務屏;

解決這個問題要用事件驅動(例如freertos的延時函式,即阻塞);

3.乙個事件驅動任務只會在事件發生後觸發後工作(處理),而在事件沒有發生時是不能進入執行態的;排程器保證總是在所有可執行的任務中選擇具有最高優先順序的任務;

非執行狀態:阻塞狀態     掛起狀態   

4.阻塞狀態

如果乙個任務正在等待某個事件,則稱這個任務處於」阻塞態(blocked)」。阻塞態是非執行態的乙個子狀態。

任務可以進入阻塞態以等待以下兩種不同型別的事件:

1.) 定時(時間相關)事件——這類事件可以是延遲到期或是絕對時間到點。比如說某個任務可以進入阻塞態以延遲 10ms。

2.)同步事件——源於其它任務或中斷的事件。比如說,某個任務可以進入阻塞態以等待佇列中有資料到來。同步事件囊括了所有板級範圍內的事件型別。freertos 的佇列,二值訊號量,計數訊號量,互斥訊號量(recursive semaphore,遞迴訊號量,本文一律稱為互斥訊號量, 因為其主要用於實現互斥訪問)和互斥量都可以用來實現同步事件。任務可以在進入阻塞態以等待同步事件時指定乙個等待超時時間,這樣可以有效地實現阻塞狀態下同時等待兩種型別的事件。比如說,某個任務可以等待佇列中有資料到來,但最多隻等 10ms。如果 10ms 內有資料到來,或是 10ms 過去了還沒有資料到來,這兩種情況下該任務都將退出阻塞態。 

「掛起(suspended)」也是非執行狀態的子狀態。處於掛起狀態的任務對排程器而言是不可見的。讓乙個任務進入掛起狀態的唯一辦法就是呼叫 vtasksuspend() api 函式;而 把 一 個 掛 起 狀 態 的 任 務 喚 醒 的 唯 一 途 徑 就 是 調 用 vtaskresume() 或vtaskresumefromisr() api 函式

多工處理

問題描述 給定乙個任務列表和冷卻時間。在同一時刻可以同時處理多件任務,但是不能同時處理同一類任務。每一類任務處理完成後需要一定的冷卻時間後才能繼續處理同類的任務。演算法輸出按順序完成列表中給定任務所需的最短總時間。測試樣例 input 1 1,2 1,3 3,1 output 12 執行順序為 1 ...

多工時的引數傳遞處理

背景 在開發板上判斷旋鈕左旋和右旋從而控制乙個數的增加和減小 task a 同時在lcd上顯示這個數 task b 問題 假設左旋一下,則在lcd上顯示左旋了很多下,用串列埠顯示確實多次操作了。思考 認真思考後發現問題出在任務的同步上,當a從開始到結束,有可能b已經執行很多次了,這就導致了多次判斷出...

對 iOS 多工的誤解 多工原理

如今,多工這個有趣特性已經成功整合在裝置中,我們如今使用的智慧型手機完全支援多工,這其中有乙個東西尤其功不可沒。這就是蘋果的iphone手機。ios是使用廣泛的令人驚嘆的作業系統。在2010年之後ios 4 變成了多工作業系統。眾所周知,當你開啟乙個應用程式然後退出,它仍然會保留在後台。當然,這會導...