FreeRTOS任务相关API函数(STM32F103C8T6)

FreeRTOS 创建和删除任务相关 API 函数

FreeRTOS 中用于创建和删除任务的 API 函数如下表所示:

1. 函数 xTaskCreate() 

此函数用于使用动态的方式创建任务,任务的任务控制块以及任务的栈空间所需的内存, 均由 FreeRTOS 从 FreeRTOS 管理的堆中分配,若使用此函数,需要在 FreeRTOSConfig.h 文件 中将宏 configSUPPORT_DYNAMIC_ALLOCATION 配置为 1。此函数创建的任务会立刻进入就 绪态,由任务调度器调度运行。函数原型如下所示:
函数 xTaskCreate()的形参描述,如下表所示:
函数 xTaskCreate()的返回值,如下表所示:

2.函数 vTaskDelete()

      此函数用于删除已被创建的任务,被删除的任务将被从就绪态任务列表、阻塞态任务列表、 挂起态任务列表和事件列表中移除,要注意的是,空闲任务会负责释放被删除任务中由系统分 配的内存,但是由用户在任务删除前申请的内存,则需要由用户在任务被删除前提前释放,否 则将导致内存泄露。若使用此函数,需要在FreeRTOSConfig.h文件中将宏INCLUDE_vTaskDelete 配置为 1。函数原型如下所示:

函数 vTaskDelete()的形参描述,如下表所示:

函数 vTaskDelete()无返回值。

FreeRTOS中关于静态和动态创建任务的区别:

FreeRTOS 任务创建与删除实验(动态方法)

解析:分别动态创建3个任务,其中T1和T2任务用来以1S的频率来执行:Led灯的亮灭,以及打印串口信息“Taskx running......”

其中T3任务5S频率执行一次,第一个周期为pre阶段,第二个周期删除任务T1,第三个周期删除任务T2。

代码解析:

void t1_task(void *pvParameters)
{
    unsigned char red_led_change_flag = 0;
    
    while(1)
    {
         if(red_led_change_flag)
         {
              LED_RED_ON;
         }else
         {
              LED_RED_OFF;
         }
         
         red_led_change_flag = ~red_led_change_flag;
         
         printf("\r\n");
         printf("Task1 running......\r\n");
         
         vTaskDelay(1000);
    }
}

void t2_task(void *pvParameters)
{
    unsigned char green_led_change_flag = 0;
    
    while(1)
    {
         if(green_led_change_flag)
         {
              LED_GREEN_ON;
         }else
         {
              LED_GREEN_OFF;
         }
         
         green_led_change_flag = ~green_led_change_flag;
         
         printf("\r\n");
         printf("Task2 running......\r\n");
         
         vTaskDelay(1000);
    }
}

void t3_task(void *pvParameters)
{
    unsigned char delect_debug_task_num = 0;
    
    while(1)
    {
         delect_debug_task_num++;
        
         if(delect_debug_task_num == 1)
         {
             printf("\r\n");
             printf("Delect task pre......\r\n");
             
         }else if(delect_debug_task_num == 2)
         {
              vTaskDelete(T1Task_Handler);
              printf("\r\n");
              printf("Task1 Delect......\r\n");
             
         }else if(delect_debug_task_num == 3)
         {
              vTaskDelete(T2Task_Handler);
              printf("\r\n");
              printf("Task2 Delect......\r\n");
             
         }else
         {
              delect_debug_task_num = 4;
         }
         
         vTaskDelay(5000);
    }
}

Note:

void t_task(void *pvParameters)

{    

       /*在这里就可以定义该函数的全局变量,每次调用该函数都是从while(1)开始运行*/

       while(1)

       {    

       }

}

所以,以下示例在一开始就没有运行成功。 delect_debug_task_num的数值始终卡在1。原因就是上述所描述的那样。

unsigned char delect_debug_task_num = 0;

void t3_task(void *pvParameters)

{

    delect_debug_task_num++;

    while(1)

    {

        /*略*/

         vTaskDelay(5000);

    }

}

运行示例:

FreeRTOS 挂起和恢复任务相关 API 函数

FreeRTOS 中用于挂起和恢复任务的 API 函数如下表所示:

1. 函数 vTaskSuspend()

       此函数用于 挂 起 任务, 若使用此函数,需 要 在 FreeRTOSConfig.h 文件中将宏 INCLUDE_vTaskSuspend 配置为 1。无论优先级如何,被挂起的任务都将不再被执行,直到任务 被恢复。此函数并不支持嵌套,不论使用此函数重复挂起任务多少次,只需调用一次恢复任务 的函数,那么任务就不再被挂起。函数原型如下所示:

      函数 vTaskSuspend()的形参描述,如下表所示:

函数 vTaskSuspend()无返回值。

2. 函数 vTaskResume()

       此函数用于在任务中恢复被挂起的任务,若使用此函数,需要在 FreeRTOSConfig.h 文件中 将宏 INCLUDE_vTaskSuspend 配置为 1。不论一个任务被函数 vTaskSuspend()挂起多少次,只 需要使用函数 vTakResume()恢复一次,就可以继续运行。函数原型如下所示:

      函数 vTaskResume()的形参描述,如下表所示:

函数 vTaskResume()无返回值。

3. 函数 xTaskResumeFromISR()

       此函数用于在中断中恢复被挂起的任务,若使用此函数,需要在 FreeRTOSConfig.h 文件中 将宏 INCLUDE_xTaskResumeFromISR 配置为 1。不论一个任务被函数 vTaskSuspend()挂起多少 次,只需要使用函数 vTakResumeFromISR()恢复一次,就可以继续运行。函数原型如下所示:

函数 xTaskResumeFromISR()的形参描述,如下表所示:

函数 xTaskResumeFromISR()的返回值,如下表所示:

FreeRTOS 任务挂起与恢复实验

解析:分别动态创建3个任务,其中T1和T2任务用来以1S的频率来执行:Led灯的亮灭,以及打印串口信息“Taskx running......”

其中T3任务5S频率执行一次,第一个周期为pre阶段,第二个周期挂起任务T1,第三个周期恢复任务T2。

其中T1和T2函数和上个任务删除恢复任务一致,不再重复。

void t3_task(void *pvParameters)
{
    unsigned char suspend_debug_task_num = 0;
    
    while(1)
    {
         suspend_debug_task_num++;
        
         if(suspend_debug_task_num == 1)
         {
             printf("\r\n");
             printf("Suspend task pre......\r\n");
             
         }else if(suspend_debug_task_num == 2)
         {
              vTaskSuspend(T1Task_Handler);
              printf("\r\n");
              printf("Task1 Suspend......\r\n");
             
         }else if(suspend_debug_task_num == 3)
         {
              vTaskResume(T1Task_Handler);
              printf("\r\n");
              printf("Task1 Resume......\r\n");
             
         }else
         {
              suspend_debug_task_num = 4;
         }
         
         vTaskDelay(5000);
    }
}

运行示例:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moon2shine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值