freeRTOS 一步步學習(三)

2021-07-25 03:30:07 字數 2641 閱讀 7653

freertos 一步步學習(二)

任務 狀態

阻塞狀態 

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

任務可以在進入阻塞態以等待同步事件時指定乙個等待超時時間,這樣可以有效地實現阻塞狀態下同時等待兩種型別的事件。 

xtickstodelay 延遲多少個心跳週期。呼叫該延遲函式的任務將進入阻塞態,經延遲指定的心跳週期數後,再轉移到就緒態。

舉個例子,當某個任務呼叫 vtaskdelay( 100 )時,心跳計數值為 10,000,則該任務將保持在阻塞態,直到心跳計數計到10,100。常數 porttick_rate_ms 可以用來將以毫秒為單位的時間值轉換為以心跳週期為單位的時間值。 

掛起狀態

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

乙個掛起

狀態的任

務喚醒的

唯一途徑

就是呼叫 vtaskresume() 或vtaskresumefromisr() api 函式。大多數應用程式中都不會用到掛起狀態。 

就緒狀態

如果任務處於非執行狀態,但既沒有阻塞也沒有掛起,則這個任務處於就緒(ready,準備或就緒)狀態。處於就緒態的任務能夠被執行,但只是」準備(ready)」執行,而當前

尚未執行。 

vtaskdelay() api函式 

void vtaskdelay( portticktype xtickstodelay ) ;

xtickstodelay

延遲多少個心跳週期。呼叫該延遲函式的任務將進入阻塞態,經延遲指定的心跳週期數後,再轉移到就緒態。舉個例子,當某個任務呼叫

vtaskdelay( 100 )

時,心跳計數值為

10,000

,則該任務將保持在阻塞態,直到心跳計數計到

10,100

。常數

porttick_rate_ms

可以用來將以毫秒為單位的時間值轉換為以心跳週期為單位的時間值。

vtaskdelayuntil() api函式 

void vtaskdelayuntil( portticktype * pxpreviouswaketime, portticktype xtimeincrement );

pxpreviouswaketime 此引數命名時假定 vtaskdelayuntil()用於實現某個任務以固定頻率週期性執行。這種情況下 pxpreviouswaketime儲存了任務上一次離開阻塞態(被喚醒)的時刻。這個時刻被用作乙個參考點來計算該任務下一次離開阻塞態的時刻。

pxpreviouswaketime 指向的

變數值會

在 api 函

數vtaskdelayuntil()呼叫過程中自動更新,應用程式除了該變數第一次初始化外,通常都不要修改它的值。

xtimeincrement 此引數命名時同樣是假定 vtaskdelayuntil()用於實現某個任務以

固定頻率

週期性執

行 —— 這個頻

率就是由xtimeincrement 指定的。

xtimeincrement 的單位

是心跳周

期,可以

使用常量porttick_rate_ms 將毫秒轉換為心跳週期 。

總結:工程專案基本只使用vtaskdelay。功能簡單實現方便。

任務 刪除

vtaskdelete() api函式 

任務可以使用 api 函式 vtaskdelete()刪除自己或其它任務。任務被刪除後就不復存在,也不會再進入執行態。

需要說明一點,只有核心為任務分配的記憶體空間才會在任務被刪除後自動**。任務自己占用的記憶體或資源需要由應用程式自己顯式地釋放 .

總結:工程專案基本不會刪除自己建立的任務,否則架構設計一般也不合理。

任務 排程

(一)優先順序搶占式排程 

這種型別的排程方案被稱為」固定優先順序搶占式排程」。所謂」固定優先順序」是指每個任務都被賦予了乙個優先順序,這個優先順序不能被核心本身改變(只能被任務修改)。 」搶占

式」是指當任務進入就緒態或是優先順序被改變時,如果處於執行態的任務優先順序更低,則該任務總是搶占當前執行的任務 

(二)選擇任務優先順序 

單調速率排程(rate monotonic scheduling, rms)是一種常用的優先順序分配技術。其根據任務週期性執行的速率來分配乙個唯一的優先順序。 

(三)協作式排程 

採用乙個純粹的協作式排程器,只可能在執行態任務進入阻塞態或是執行態任務顯式呼叫 taskyield()時,才會進行上下文切換。 

總結:工程專案基本使用搶占式排程。

freeRTOS 一步步學習(二)

freertos 一步步學習 二 任務狀態 應用程式可以包含多個任務。如果執行應用程式的微控制器只有乙個核 core 那麼在任意給定時間,實際上只會有乙個任務被執行。這就意味著乙個任務可以有乙個或 兩個狀態,即執行狀態和非執行狀態。freertos 的排程器是能讓任務切入切出的唯一實體。任務建立 x...

一步步學習電子維修

一步步學習電子維修 第一節 電是什麼 1 電子技術,很多人感興趣,不過入門卻非常困難,我總結了下原因,1 屬於微觀,看不見摸不著 2 缺少實際動手環境 3 學校教育或培訓教育問題,填鴨式的灌輸,越來越煩,最終一點興趣也沒有了。2 針對以上問題,這裡都有絕招解決,俗話說一招鮮,吃遍天,看到這篇文章的同...

一步步學ROS

最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...