FreeRTOS學習筆記( )

2021-09-19 04:03:45 字數 3065 閱讀 7667

1任務管理

portbase_type xtaskcreate( 

pdtask_code pvtaskcode, /* 指向任務函式的指標 */

const portchar * const pcname, /* 任務的文字名字,只會在除錯中用到 */ 

unsigned portshort usstackdepth,    /* 棧深度 */

void *pvparameters,           /* 傳參*/

unsigned portbase_type uxpriority,  /* 優先順序 */

xtaskhandle *pvcreatedtask /* 不會用到任務控制代碼 */

);

kcode : 指向任務的入口函式.實現常通常是乙個死迴圈.

pcname: 任務名.

usstackdepth: usstackdepth 值用於告訴核心為它分配多大的棧空間。

這個值指定的是棧空間可以儲存多少個字(word),而不是多少個位元組(byte)。

比如說,如果是 32 位寬的棧空間,傳入的 usstackdepth值為 100,則將會分配 400 位元組的棧空間(100 * 4bytes)。棧深度乘以棧寬度的結果千萬不能超過乙個 size_t 型別變數所能表達的最大值。

pvparameters: 傳遞到任務中的值

uxpriority: 優先順序

pxcreatedtask:用於傳出任務的控制代碼.

vtasksuspend() //掛起

vtaskresume() 或 vtaskresumefromisr()  //喚醒

vtaskdelayuntil(portticktype * pxpreviouswaketime, portticktype xtimeincrement)

//週期任務轉換

vtaskdelay() // 延遲

vtaskpriorityset(xtaskhandle pxtask, unsigned portbase_type uxnewpriority) //修改優先順序

uxtaskpriorityget()xtaskhandle pxtask //查詢優先順序

vtaskdelete(xtaskhandle pxtask) // 刪除任務

vtaskdelete(null); //表示刪除自己本身

排程任務簡述

優先順序搶占式排程

1,每個任務都賦予了乙個優先順序。

2,每個任務都可以存在於乙個或多個狀態。

3,在任何時候都只有乙個任務可以處於執行狀態。

4,排程器總是在所有處於就緒態的任務中選擇具有最高優先順序的任務來執行。

2 佇列管理

由於佇列可以被多個任務讀取,所以對單個佇列而言,也可能有多個任務處於阻塞

狀態以等待佇列資料有效。這種情況下,一旦佇列資料有效,只會有乙個任務會被解除

阻塞,這個任務就是所有等待任務中優先順序最高的任務。而如果所有等待任務的優先順序

相同,那麼被解除阻塞的任務將是等待最久的任務。

xqueuecreate(unsigned uxqueuelength, unsigned uxitemsize)
uxqueuelength: 佇列深度

uxitemsize: 佇列中資料單元的長度,以位元組為單位.

返回值為佇列操作控制代碼.

xqueuesendtoback() //將資料傳送到佇列尾

xqueuesendtofront()//將資料傳送到佇列首

portbase_type xqueuesendtofront(

xqueuehandle xqueue,   /*佇列控制代碼*/

const void * pvitemtoqueue,  /*傳送資料的指標*/

portticktype xtickstowait ); /*阻塞超時時間 */

如 果 xtickstowait 設 為 0 , 並 且 隊 列 已 滿 , 則xqueuesendtofront()與 xqueuesendtoback()均會立即返回。

如 果 把 xtickstowait 設 置 為 portmax_delay , 並 且 在freertosconig.h 中設定 include_vtasksuspend 為 1,那麼阻塞等待將沒有超時限制。

xqueuereceive()與 xqueuepeek() api 函式

portbase_type xqueuereceive (

xqueuehandle xqueue,   /*佇列控制代碼*/

const void * pvbuffer,  /*傳送資料的指標*/

portticktype xtickstowait ); /*阻塞超時時間 */

xqueuereceive()用於從佇列中接收(讀取)資料單元。接收到的單元同時會從佇列中刪除。

xqueuepeek()也是從從佇列中接收資料單元,不同的是並不從佇列中刪出接收到的單元。xqueuepeek()從佇列首接收到資料後,不會修改佇列中的資料,也不會改變資料在佇列中的儲存序順。

切記不要在中斷服務例程中呼叫 xqueuerceive()和 xqueuepeek()。中斷安全版本 的替代 api 函式

xqueuereceivefromisr()

unsigned portbase_type uxqueuemessageswaiting( xqueuehandle xqueue );

用於查詢佇列中當前有效資料單元個數。

切記不要在中斷服務例程中呼叫 uxqueuemessageswaiting()。應當在中斷服務中 使用其中斷安全版本uxqueuemessageswaitingfromisr()。

freeRTOS學習筆記

freertos學習筆記 主要目的記api 1.freertos配置檔案 freertosconfig.h 2.狀態轉換執行就緒阻塞態 掛起態 vtasksuspend 掛起 就緒 vtaskresume 阻塞 就緒 cevent 執行 阻塞 呼叫阻塞api函式3.任務堆疊大小 實際引數 引數x4 ...

FreeRTOS學習筆記(3)

宣告 本文內容來自 在使用stm32cubemx進行freertos配置的時候會有乙個cmsis rtos的版本號。cmsis cortex microcontroller inte ce standard cmsis rtos是arm公司為了統一作業系統 降低嵌入式開發門檻而開發的作業系統軟體標準...

FREERTOS學習筆記,中斷管理三

xqueuesendtofrontfromisr 該函式相當於任務中的xqueuesendtofront 的中斷呼叫安全版。xqueuesendtobackfromisr 該函式相當於任務中的xqueuesendtoback 的中斷呼叫安全版。xqueuereceivefromisr 該函式相當於任...