FreeRTOS 创建和删除任务相关 API 函数
FreeRTOS 中用于创建和删除任务的 API 函数如下表所示:
1. 函数 xTaskCreate()
![](https://img-blog.csdnimg.cn/ef2eaa2479e2412b8db3dda84d85f219.png)
![](https://img-blog.csdnimg.cn/0670e43c0f434e81a279f232a1209c8a.png)
![](https://img-blog.csdnimg.cn/9b37913ae977457bbc5b0813741261fb.png)
![](https://img-blog.csdnimg.cn/512d10d0eb5d4ce2a06e8cbccda3cf2a.png)
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);
}
}
运行示例: