在FreeRTOS中,创建任务有两种方式:动态创建和静态创建。区别就是:动态创建任务的栈和任务TCB是由操作系统动态分配(malloc)内存空间,任务删除时可以释放内存(free);而静态创建任务的任务栈和TCB是由程序员预先分配好内存空间,是静态内存,在任务删除时内存空间不可以释放。
1.1 动态创建任务-xTaskCreate()
1.1.1TCB结构体(主要成员)
- pxTopOfStack:栈顶指针;
- xStateListItem:任务状态列表项,用来表示任务的状态,挂在对应的状态列表中;
- xEventListItem:事件列表项,用于从事件列表中引用任务;
- uxPriority:优先级,数值越大,优先级越高;
- pxStack:栈起始指针;
- pcTaskName[ configMAX_TASK_NAME_LEN ]:任务名称。
1.1.2函数原型
- pxTaskCode:任务函数;
- pcName:任务名称;
- usStackDepth:栈大小;
- pvParameters:参数;
- uxPriority:优先级;
- pxCreatedTask:句柄指针,TaskHandle_t就是TCB_t*,句柄将指向被创建函数的TCB;
1.1.3函数框架
动态创建任务的流程:
- 为任务TCB分配空间
- 为任务栈分配空间
- 初始化任务TCB成员
- 把任务TCB挂到就绪列表中
- pxCurrentTCB 是一个在 task.c 定义的全局指针,用于指向当前正在运行或者即将要运行的任务的任务控制块。
1.1.3.1任务栈初始化pxPortInitialiseStack
1.2 静态创建任务-xTaskCreateStatic()
1.2.1函数原型
- (2):任务函数名称
- (3):任务名称
- (4):栈大小
- (5):任务形参
- (6):任务栈起始地址
- (7):任务TCB起始地址
1.2.2函数框架
大体上与动态创建任务一致,静态创建任务的任务栈及任务TCB需要自己定义,然后传参给xTaskCreateStatic()函数。
1.3删除任务-xTaskDelete()
1.3.1函数原型
void vTaskDelete( TaskHandle_t xTaskToDelete )
- xTaskToDelet:句柄,传入要删除任务的句柄,删除自身传入NULL。
1.3.2函数框架
简单来说,删除任务的流程:
- 从任务当前所处的状态列表中移除;
- 判断任务是否在等待事件,若正在等待,从事件列表中移除;
- 释放内存空间,包括任务TCB和任务栈。如果是任务删除自身,由空闲任务来释放内存;如果是其他任务删除指定任务,直接释放内存。
1.4挂起任务vTaskSuspend()
1.4.1函数原型
void vTaskSuspend( TaskHandle_t xTaskToSuspend )
- xTaskToSuspend:任务句柄,传入要挂起任务的句柄,挂起自身传入NULL。
1.4.2函数框架
1.5恢复任务vTaskResume()
1.5.1函数原型
void vTaskResume( TaskHandle_t xTaskToResume )
- xTaskToResume:任务句柄,传入要恢复任务的句柄,不能为NULL。
1.5.2函数框架
1.6启动调度器vTaskStartScheduler()
1.6.1函数原型
void vTaskStartScheduler( void )
1.6.2函数框架
1.7任务通知通用发送xTaskGenericNotify()
1.7.1函数原型
- xTaskToNotify:目标任务的句柄,即接收通知的任务的句柄;
- uxIndexToNotify:任务的指定通知;
- ulValue:通知值
- eAction:定义了如何修改目标任务当前的通知值;
- pulPreviousValue:可保存之前的通知值,传入NULL则不保存。
1.7.2函数框架
1.8任务通知接收ulTaskNotifyTake()
1.8.1函数原型
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait )
-
xClearCountOnExit:指定函数退出前是否要清楚通知值,如果为
pdTRUE
,当函数返回时,通知值将被清零;如果为pdFALSE
,通知值将减去已经获取到的信号量数量。 - xTicksToWait:等待时间
- 返回值:如果成功接收到通知并取得信号量,返回从通知值中获取到的信号量数量(可能大于1);如果在
xTicksToWait
时间内未接收到通知,则返回0。
1.8.2函数框架
1.9全能的任务通知接收xTaskNotifyWait()
1.9.1函数原型
- ulBitsToClearOnEntry:表示在使用通知之前,将任务通知值的哪些位清 0;
- ulBitsToClearOnExit:表示在函数退出前,决定任务接收到的通知值的哪些位会被清 0;
-
pulNotificationValue:用于保存接收到的任务通知值;
-
xTicksToWait:等待超时时间。
-
返回值:如果获取任务通知成功则返回 pdTRUE,失败则返回 pdFALSE。
1.9.2函数框架