嵌入式FreeRTOS学习四,FreeRTOS任务的状态机

三、任务的状态机

Suspended:挂起态
Running:运行态
Blocked:阻塞态/等待态
Ready:就绪态
上图官方没有列出任务被中断的情况,倘若被中断的任务如果从中断返回,则返回被中断的任务。当到达下一个时 钟节拍,CPU资源给到就绪任务中优先级最高的任务

3.1 示例代码

3.1.1 相同优先级
代码示例
int main(void) 
{

/* 创建app_task1任务 */
 xTaskCreate(
 (TaskFunction_t )app_task1,         /* 任务入口函数 */
 (const char* )"app_task1",          /* 任务名字 */
 (uint16_t )512,                     /* 任务栈大小 */
 (void* )NULL,                       /* 任务入口函数参数 */
 (UBaseType_t )5,                    /* 任务的优先级 */
 (TaskHandle_t* )&app_task1_handle); /* 任务控制块指针 */

 /* 创建app_task2任务 */ 
 xTaskCreate(
 (TaskFunction_t )app_task2,         /* 任务入口函数 */
 (const char* )"app_task2",          /* 任务名字 */
 (uint16_t )512,                     /* 任务栈大小 */
 (void* )NULL,                       /* 任务入口函数参数 */
 (UBaseType_t )5,                    /* 任务的优先级 */
 (TaskHandle_t* )&app_task2_handle); /* 任务控制块指针 */

 /* 开启任务调度 */
 vTaskStartScheduler();
 
 while(1);

 }
 static void app_task1(void* pvParameters)
 {
        for(;;)
          {
               printf("app_task1 is running ...\r\n");
               vTaskDelay(20);
          }
 } 

static void app_task2(void* pvParameters)
 {
        for(;;)
         {
                printf("app_task2 is running ...\r\n");
                vTaskDelay(30);
         }
 }

运行结果: 

 3.1.1 不同优先级

代码示例

int main(void)  
{  /* 创建app_task1任务 */
   xTaskCreate((TaskFunction_t )app_task1, /* 任务入口函数 */
  (const char* )"app_task1",               /* 任务名字 */
  (uint16_t )512,                          /* 任务栈大小 */
  (void* )NULL,                            /* 任务入口函数参数 */
  (UBaseType_t )6,                         /* 任务的优先级 */
  (TaskHandle_t* )&app_task1_handle);      /* 任务控制块指针 */

 /* 创建app_task2任务 */ 
 xTaskCreate((TaskFunction_t )app_task2,   /* 任务入口函数 */
 (const char* )"app_task2",                /* 任务名字 */
 (uint16_t )512,                           /* 任务栈大小 */
 (void* )NULL,                             /* 任务入口函数参数 */
 (UBaseType_t )5,                          /* 任务的优先级 */
 (TaskHandle_t* )&app_task2_handle);       /* 任务控制块指针 */
 /* 开启任务调度 */
 vTaskStartScheduler();
 
 while(1);

}
 static void app_task1(void* pvParameters)
 {
         for(;;)
           {
              printf("app_task1 is running ...\r\n");
              vTaskDelay(20);
           }
 } 

 static void app_task2(void* pvParameters)
 {
        for(;;)
          {
             printf("app_task2 is running ...\r\n");
             vTaskDelay(30);
          }
 }

运行结果: 

猜你喜欢

转载自blog.csdn.net/weixin_44651073/article/details/127223755
今日推荐