freeRTOS 一步步學習(二)

2021-07-25 03:29:05 字數 2882 閱讀 4660

freertos 一步步學習(二)

任務狀態

應用程式可以包含多個任務。如果執行應用程式的微控制器只有乙個核(core),那麼在任意給定時間,實際上只會有乙個任務被執行。這就意味著乙個任務可以有乙個或

兩個狀態,即執行狀態和非執行狀態。 freertos 的排程器是能讓任務切入切出的唯一實體。 

任務建立

xtaskcreate() api函式,建立任務使用 freertos 的 api 函式 xtaskcreate()。 

xtaskcreate() api函式原型 :

portbase_type xtaskcreate( pdtask_code pvtaskcode,

const signed portchar * const pcname,

unsigned portshort usstackdepth,

void *pvparameters,

unsigned portbase_type uxpriority,

xtaskhandle *pxcreatedtask );

引數名描述

pvtaskcode 任務只是永不退出的 c 函式,實現常通常是乙個死迴圈。引數pvtaskcode 只乙個指向任務的實現函式的指標(效果上僅僅是函式名)。

pcname 具有描述性的任務名。這個引數不會被 freertos 使用。其只是單純地用於輔助除錯。識別乙個具有可讀性的名字總是比通過控制代碼來識別容易得多。

應用程式可以通過定義常量 config_max_task_name_len 來定義任務名的最大長度——包括』\0』結束符。如果傳入的字串長度超過了這個最大值,字串將會自動被截斷 。

usstackdepth 當任務建立時,核心會分為每個任務分配屬於任務自己的唯一狀態。usstackdepth 值用於告訴核心為它分配多大的棧空間。這個值指定的是棧空間可以儲存多少個字(word),而不是多少個位元組(byte)。比如說,如果是 32 位寬的棧空間,傳入的 usstackdepth值為 100,則將會分配 400 位元組的棧空間(100 * 4bytes)。棧深度乘以棧寬度的結果千萬不能超過乙個 size_t 型別變數所能表達的最大值 。

應用程式通過定義常量 configminimal_stack_size 來決定空閒任務任用的棧空間大小。在 freertos 為微控制器架構提供的demo 應用程式中,賦予此常量的值是對所有任務的最小建議值。如果你的任務會使用大量棧空間,那麼你應當賦予乙個更大的值。沒有任何簡單的方法可以決定乙個任務到底需要多大的棧空間。計算出來雖然是可能的,但大多數使用者會先簡單地賦予乙個自認為合理的值,然後利用 freertos 提供的特性來確證分配的空間既不欠缺也不浪費。freertos 有函式去查詢任務使用了多少棧空間 。

pvparameters 任務函式接受乙個指向 void 的指標(void*)。 pvparameters 的值即是傳遞到任務中的值。這篇文件中的一些範例程式將會示範這個引數可以如何使用 。

uxpriority 指定任務執行的優先順序。優先順序的取值範圍可以從最低優先順序 0 到最高優先順序(configmax_priorities – 1)。configmax_priorities 是乙個由使用者定義的常量。優先順序號並沒有上限(除了受限於採用的資料型別和系統的有效記憶體空間),但最好使用實際需要的最小數值以避免記憶體浪費。如果 uxpriority 的值超過了(configmax_priorities – 1),將會導致實際賦給任務的優先順序被自動封頂到最大合法值。 

pxcreatedtask pxcreatedtask 用於傳出任務的控制代碼。這個控制代碼將在 api 呼叫中對該建立出來的任務進行引用,比如改變任務優先順序,或者刪除任務。如果應用程式中不會用到這個任務的控制代碼,則 pxcreatedtask 可以被設為 null。 

返回值有兩個可能的返回值:

1. pdtrue表明任務建立成功。

2. errcould_not_allocate_required_memory由於記憶體堆空間不足, freertos 無法分配足夠的空間來儲存任務結構資料和任務棧,因此無法建立任務 。

示例:int main( void )

任務優先順序

xtaskcreate() api 函式的引數 uxpriority 為建立的任務賦予了乙個初始優先順序。 應用

程式在文

件 freertosconfig.h 中設定

的編譯時

配置常量configmax_priorities 的值,即是最多可具有的優先順序數目。 freertos 本身並沒有限定這個常量的最大值,但這個值越大,則核心花銷的記憶體空間就越多。所以總是建議將此常量設為能夠用到的最小值 。

對於如何為任務指定優先順序, freertos 並沒有強加任何限制。任意數量的任務可以共享同乙個優先順序——以保證最大設計彈性。當然,如果需要的話,你也可以為每個任務指定唯一的優先順序(就如同某些排程演算法的要求一樣),但這不是強制要求的。 

低優先順序號表示任務的優先順序低,優先順序號 0 表示最低優先順序。有效的優先順序號範圍從 0 到(configmax_priorites – 1).

排程器保證總是在所有可執行的任務中選擇具有最高優先順序的任務,並使其進入執行態。如果被選中的優先順序上具有不止乙個任務,排程器會讓這些任務輪流執行。 

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

freertos api 函式呼叫中指定的時間總是以心跳中斷為單位(通常的提法為心跳」ticks」)。常量 porttick_rate_ms 用於將以心跳為單位的時間值轉化為以毫秒為單位的時間值。有效精度依賴於系統心跳頻率。 

freeRTOS 一步步學習(三)

freertos 一步步學習 二 任務 狀態 阻塞狀態 如果乙個任務正在等待某個事件,則稱這個任務處於 阻塞態 blocked 阻塞態是非執行態的乙個子狀態。任務可以在進入阻塞態以等待同步事件時指定乙個等待超時時間,這樣可以有效地實現阻塞狀態下同時等待兩種型別的事件。xtickstodelay 延遲...

一步步學習電子維修

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

一步步學ROS

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