第三章 FreeRTOS任務基礎知識
1、任務特性
- 1、簡單
- 2、沒有使用限制
- 3、支持搶佔
- 4、支持優先級設置
- 5、每個任務都有堆棧導致RAM(運行內存)的增大
- 6、如果使用搶佔的話必須仔細的考慮重入的問題
2、任務狀態
1、運行態:在當前狀態下運行的任務
2、就緒態:處於準備好的任務,等待運行態任務結束運行
3、阻塞態:等待某個觸發的時間時,稱之爲阻塞態
4、掛起態:暫停運行某個任務
3、任務優先級
任務優先級決定了任務的執行優先級級別,在FreeRTOS中,任務優先級的可選範圍爲:
0~configMAX_PRIORITIES-1
注:數字越大,優先級越高,0優先級我們不能使用,留給系統的滴答定時器內核使用。
4、任務實現
/*任務實現的基本框架 */
void vATaskFunction(void *pvParameters)
{
while(1)
{
task_func();//注:這個代表的是自己編寫的一些任務函數,不是僅僅一個函數
vTaskDelay();//任務delay函數,當執行完上述程序以後,此時可以進行任務切換,並且任務是內部自動切換任務,無需自己切換
}
vTaskDelete(NULL);
}
// 注: vTaskDelay();可以引起(觸發)任務調度函數的切換。
5、任務控制塊
描述任務屬性的數據結構稱之爲任務控制塊,爲TCB_t.
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack;
#if(portUSING_MPU_WRAPPERS==1)
xMPU_STTINGS xMPUSettings;
#endif
ListItem_t xStateListItem ;
...
...
} taskTCB ;
typedef taskTCB TCB_t;
5、任務堆棧
堆棧:保存一個任務的內存或者寄存器的但前的情況,如果在一個任務中定義的有大量寄存器的值和定義的變量的值,那麼堆棧的空間需要更大一些,否則會出現錯誤或者死機的情況。
舉例說明:
在一個任務中要定義以下基本框架
//任務優先級
#define LED1_TASK_PRIO 3
//任務堆棧大小
#define LED1_STK_SIZE 50 //注:1個size是4個字節,所以這裏是4*50=200字節
//任務句柄
TaskHandle_t LED1Task_Handler;
//任務函數
void led1_task(void *pvParameters) ;