任務(wù)實現(xiàn)
FreeRTOS 官方給出的任務(wù)函數(shù)模板如下:
void vATaskFunction(void *pvParameters)
{
for( ; ; )
{
--任務(wù)應(yīng)用程序--
vTaskDelay();
}
vTaskDelete(NULL);
}
(1)、任務(wù)函數(shù)本質(zhì)也是函數(shù),所以肯定有任務(wù)名什么的,不過這里我們要注意:任務(wù)函數(shù) 的返回類型一定要為 void 類型,也就是無返回值,而且任務(wù)的參數(shù)也是 void 指針類型的!任務(wù) 函數(shù)名可以根據(jù)實際情況定義。
(2)、任務(wù)的具體執(zhí)行過程是一個大循環(huán),for(; ; )就代表一個循環(huán),作用和 while(1)一樣,博主習(xí)慣用 while(1)。
(3)、循環(huán)里面就是真正的任務(wù)代碼了,此任務(wù)具體要干的活就在這里實現(xiàn)!
(4)、FreeRTOS 的延時函數(shù),此處不一定要用延時函數(shù),其他只要能讓 FreeRTOS 發(fā)生任務(wù) 切換的 API 函數(shù)都可以,比如請求信號量、隊列等,甚至直接調(diào)用任務(wù)調(diào)度器。只不過最常用 的就是 FreeRTOS 的延時函數(shù)。
(5)、任務(wù)函數(shù)一般不允許跳出循環(huán),如果一定要跳出循環(huán)的話在跳出循環(huán)以后一定要調(diào)用 函數(shù) vTaskDelete(NULL)刪除此任務(wù)!
FreeRTOS 的任務(wù)函數(shù)和 UCOS 的任務(wù)函數(shù)模式基本相同的,不止 FreeRTOS,其他 RTOS 的任務(wù)函數(shù)基本也是這種方式的。
任務(wù)控制塊
FreeRTOS 的每個任務(wù)都有一些屬性需要存儲,F(xiàn)reeRTOS 把這些屬性集合到一起用一個結(jié)構(gòu)體來表示,這個結(jié)構(gòu)體叫做任務(wù)控制塊:TCB_t,在使用函數(shù) xTaskCreate()創(chuàng)建任務(wù)的時候就會自動的給每個任務(wù)分配一個任務(wù)控制塊。
此結(jié)構(gòu)體在文件 tasks.c 中有定義。類似于 Linux 的 task_struct 結(jié)構(gòu)體,保存進程信息用的,每個進程有一個。
任務(wù)堆棧
FreeRTOS 之所以能正確的恢復(fù)一個任務(wù)的運行就是因為有任務(wù)堆棧在保駕護航,任務(wù)調(diào)度器在進行任務(wù)切換的時候會將當前任務(wù)的現(xiàn)場(CPU 寄存器值等)保存在此任務(wù)的任務(wù)堆棧中,等到此任務(wù)下次運行的時候就會先用堆棧中保存的值來恢復(fù)現(xiàn)場,恢復(fù)現(xiàn)場以后任務(wù)就會接著從上次中斷的地方開始運行。
創(chuàng)建任務(wù)的時候需要給任務(wù)指定堆棧,如果使用的函數(shù) xTaskCreate()創(chuàng)建任務(wù)(動態(tài)方法)的話那么任務(wù)堆棧就會由函數(shù) xTaskCreate()自動創(chuàng)建。如果使用函數(shù) xTaskCreateStatic()創(chuàng)建任務(wù)(靜態(tài)方法)的話就需要程序員自行定義任務(wù)堆棧,然后堆棧首地址作為函數(shù)的參數(shù) puxStackBuffer 傳遞給函數(shù)。
-
嵌入式
+關(guān)注
關(guān)注
5096文章
19192瀏覽量
308066 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4349瀏覽量
63027 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62423 -
控制塊
+關(guān)注
關(guān)注
0文章
5瀏覽量
6403 -
任務(wù)
+關(guān)注
關(guān)注
1文章
20瀏覽量
8567
發(fā)布評論請先 登錄
相關(guān)推薦
FreeRTOS中的任務(wù)管理
請教:有SPC560B的多任務(wù)實時系統(tǒng)的例程嗎(freertos)
靜態(tài)方法創(chuàng)建任務(wù)刪除后內(nèi)存如何回收?
在STM32下完成FreeRTOS的多任務(wù)程序開發(fā)
什么是多任務(wù)系統(tǒng)?FreeRTOS任務(wù)與協(xié)程簡析
初入FreeRTOS
![初入<b class='flag-5'>FreeRTOS</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
(一)FreeRTOS學(xué)習(xí)之FreeRTOS任務(wù)基礎(chǔ)知識
![(一)<b class='flag-5'>FreeRTOS</b>學(xué)習(xí)之<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>基礎(chǔ)知識](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FreeRTOS系列第11篇---FreeRTOS任務(wù)控制
![<b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b><b class='flag-5'>控制</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論