任務實現
FreeRTOS 官方給出的任務函數模板如下:
void vATaskFunction(void *pvParameters)
{
for( ; ; )
{
--任務應用程序--
vTaskDelay();
}
vTaskDelete(NULL);
}
(1)、任務函數本質也是函數,所以肯定有任務名什么的,不過這里我們要注意:任務函數 的返回類型一定要為 void 類型,也就是無返回值,而且任務的參數也是 void 指針類型的!任務 函數名可以根據實際情況定義。
(2)、任務的具體執行過程是一個大循環,for(; ; )就代表一個循環,作用和 while(1)一樣,博主習慣用 while(1)。
(3)、循環里面就是真正的任務代碼了,此任務具體要干的活就在這里實現!
(4)、FreeRTOS 的延時函數,此處不一定要用延時函數,其他只要能讓 FreeRTOS 發生任務 切換的 API 函數都可以,比如請求信號量、隊列等,甚至直接調用任務調度器。只不過最常用 的就是 FreeRTOS 的延時函數。
(5)、任務函數一般不允許跳出循環,如果一定要跳出循環的話在跳出循環以后一定要調用 函數 vTaskDelete(NULL)刪除此任務!
FreeRTOS 的任務函數和 UCOS 的任務函數模式基本相同的,不止 FreeRTOS,其他 RTOS 的任務函數基本也是這種方式的。
任務控制塊
FreeRTOS 的每個任務都有一些屬性需要存儲,FreeRTOS 把這些屬性集合到一起用一個結構體來表示,這個結構體叫做任務控制塊:TCB_t,在使用函數 xTaskCreate()創建任務的時候就會自動的給每個任務分配一個任務控制塊。
此結構體在文件 tasks.c 中有定義。類似于 Linux 的 task_struct 結構體,保存進程信息用的,每個進程有一個。
任務堆棧
FreeRTOS 之所以能正確的恢復一個任務的運行就是因為有任務堆棧在保駕護航,任務調度器在進行任務切換的時候會將當前任務的現場(CPU 寄存器值等)保存在此任務的任務堆棧中,等到此任務下次運行的時候就會先用堆棧中保存的值來恢復現場,恢復現場以后任務就會接著從上次中斷的地方開始運行。
創建任務的時候需要給任務指定堆棧,如果使用的函數 xTaskCreate()創建任務(動態方法)的話那么任務堆棧就會由函數 xTaskCreate()自動創建。如果使用函數 xTaskCreateStatic()創建任務(靜態方法)的話就需要程序員自行定義任務堆棧,然后堆棧首地址作為函數的參數 puxStackBuffer 傳遞給函數。
-
嵌入式
+關注
關注
5087文章
19145瀏覽量
306111 -
函數
+關注
關注
3文章
4338瀏覽量
62740 -
FreeRTOS
+關注
關注
12文章
484瀏覽量
62226 -
控制塊
+關注
關注
0文章
5瀏覽量
6399 -
任務
+關注
關注
1文章
20瀏覽量
8550
發布評論請先 登錄
相關推薦
評論