FreeRTOS自学笔记--任务管理

任务函数

函数原型: void ATaskFunction(void *pvParameters);
void ATaskFunction(void *pvParameters)
{
          
   
    int iVariableExample = 0;
     for( ; ; )
     {
          
   
     	//任务实现代码
     }
     //如果任务的具体实现会跳出上面的死循环,
     //则此任务必需在函数运行完之前删除。
     vTaskDelete( NULL );
}

顶层任务状态

    运行状态 非运行状态

创建任务

函数原型:
portBASE_TYPE xTaskCreate( pbTASK_CODE pvTaskcode,
                           const signed portCHAR * const pcName,
                           unsigned portSHORT usStackDepth,
                           void *pvParameters,
                           undigned portBASE_TYPE uxPriority,
                           xTaskHandle *pxCreatedTask );
函数调用:
xTaskCreate( Task1,/*指向任务函数的指针*/
             "Task 1",/*任务文本名字,只在调试中用到*/
             1000,/*栈深度*/
             1,/*此任务运行在优先级1上*/
             NULL );/*不会用到任务句柄

任务优先级

优先级数目配置: configMAX_PRIORITIES 优先级频率配置: configTICK_RATE_HZ portTICK_RATE_MS 将以心跳为单位的时间值转化成以毫秒为单位

扩充非运行状态

    阻塞态
1.定时(时间)相关事件
void vTaskDelay( portTickType xTicksToDelay );
//实现任务精确的周期性调用
void vTaskDelayUntil( portTickType * pxPreviousWakeTime,
portTickType xTimeIncrement );
2.同步事件
    挂起态 就绪态
void ATaskFunction(void *pvParameters)
{
          
   
    char *pcTaskName;
     for( ; ; )
     {
          
   
      vPrintString(pcTaskName);
      //250ms的循环周期时间,让任务在延时期间保持挂起态。
      vTaskDelay250/portTICK_RATE_MS);
     }
}

空闲务与空闲任务钩子函数

    空闲任务的创建
启用调度器: vTaskStartScheduler();
    钩子函数的实现
函数原型: void vApplicationIdleHook( void ); 配置: configUSE_IDLE_HOOK
    空闲任务钩子函数的实现限制
在函数被删除后,空闲函数回收内核资源;如果空闲函数被饿死将无法进行回收工作。

改变任务优先级

改变任务优先级: void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); 获取任务优先级: unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
void ATaskFunction(void *pvParameters)
{
          
   
    unsigned portBASE_TYPE uxPriority;
    //获取自身优先级
    uxPriority = uxTaskPriorityGet( NULL );
     for( ; ; )
     {
          
   
      vPrintString("Task1 is runing./n/r");
      //改变任务2的优先级,用到了任务句柄,在创建任务时需定义。
      vTaskPrioritySet( xTask2Handle, (uxPriority + 1));
      //250ms的循环周期时间,让任务在延时期间保持挂起态。
      vTaskDelay250/portTICK_RATE_MS);
     }
}

删除任务

函数原型: void vTaskDelete( xTaskHandle pxTaskToDelete );
void ATaskFunction(void *pvParameters)
{
          
   
    int iVariableExample = 0;
     for( ; ; )
     {
          
   
      //任务实现代码
     }
     //如果任务的具体实现会跳出上面的死循环,
     //则此任务必需在函数运行完之前删除。
     vTaskDelete( NULL );
}

思维导图

经验分享 程序员 微信小程序 职场和发展