FreeRTOS 任务管理之任务创建
FreeRTOS 任务管理之任务创建
任务概念
任务:个人感觉就是将相关的一系列操作放在一个任务函数里来,跟线程差不多一个概念。
任务创建
在FreeRTOS中,任务创建是由任务创建函数来执行,任务创建函数原型如下:
#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) ) BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, StackType_t * const puxStackBuffer, const MemoryRegion_t * const xRegions );
我们平时调用的是xTaskCreate()这个API,而其实这个API是个参数宏,其实际函数xTaskBenericCreate();在这里就置分析xTaskCreate()的参数;
-
pvTaskCode,这个是一个指向任务函数的指针,类型为:TaskFunction_t–void (TaskFunction_t)( void ),也就是说这是一个指向无返回值, 人口参数为指针 函数的函数指针。从这里就引出来了 任务函数一说,任务函数原型为:
void (*TaskFunction_t)( void * );
举个例子,一个闪灯的任务函数如下:
static void vLEDTask( void *pvParameters ) { while(1) { LED_Toggle(GREEN_LED_Toggle); printf("LED Toggle "); Delay(1000); } }
-
pcName,这个是任务的描述性名字,这个并没有多大的作用,只是方便用于调试程序,该字段的长度由FreeRTOSConfig.h中configMAX_TASK_NAME_LEN来决定。 usStackDepth,当创建任务时,内核会为每个任务分配自己的堆栈空间,该参数告诉内核该分配多少堆栈给该任务;当MCU为STM32时,该参数的内存单位不是字节,而是uint32_t为单位,四个字节为单位,代码中如下:
#define portSTACK_TYPE uint32_t
-
pvParameters, 任务函数接受一个指向 void 的指针(void*)。pvParameters 的值即 是传递到任务中的值。 uxPriority,任务执行的优先级;优先级从0到(configMAX_PRIORITIES-1),0为最低优先级,数字越大优先级越高; pxCreatedTask, pxCreatedTask 用于传出任务的句柄。这个句柄将在 API 调用中对 该创建出来的任务进行引用,比如改变任务优先级,或者删除任务。 如果应用程序中不会用到这个任务的句柄,则 pxCreatedTask 可以 被设为 NULL。
最后,我们来创建上面闪灯的任务:
xTaskCreate(vLEDTask, "vLEDTASK", 512, NULL, 1, NULL);