FreeRTOS 任务管理之任务创建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnu_fangzebin/article/details/51778782

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\n");
            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);

猜你喜欢

转载自blog.csdn.net/jnu_fangzebin/article/details/51778782