FreeRTOS
任务的挂起与恢复
这里所谓的挂起,可以简单理解为把正在执行的任务暂停,同理恢复就是将暂停的任务恢复到继续运行的状态
相关API:
- 单个任务挂起:
vTaskSuspend(要挂起的任务句柄) - 单个任务恢复:
vTaskResume(要恢复的任务句柄) - 挂起所有任务:
vTaskSuspendAll(void) - 恢复所有任务:
vTaskResumeAll(void)
API的具体解释详见官网:FreeRTOS官网
示例:
- 任务1:LED1闪烁,周期1s
- 任务2:LED2闪烁,周期1s
- 任务3:获取按键值,按键1按下就挂起任务1,按键2按下就恢复任务1,按键3按下就挂起所有任务,按键4按下就恢复所有任务
freeRTOS_demo.c源代码:
#include "stm32f10x.h" // Device header
#include "myusart.h"
#include "Led.h"
#include "Key.h"
#include "freeRTOS_demo.h"
#include "FreeRTOS.h"
#include "task.h"//包含创建、挂起、恢复、删除任务
//初始任务句柄
TaskHandle_t start_mytask_Handler;
//业务逻辑任务句柄
TaskHandle_t myTask1_Handler;
TaskHandle_t myTask2_Handler;
TaskHandle_t myTask3_Handler;
void start_mytask(void *param);
void myTask1(void *param);
void myTask2(void *param);
void myTask3(void *param);
void freeRTOS_start(void)
{
//初始任务为创建其他任务
BaseType_t res = xTaskCreate(
//任务函数
start_mytask,
//任务描述
"create_allTasks",
//任务所分配的堆栈字数
256,
//给任务传递的参数
NULL,
//任务执行优先级,数字越大优先级越高
2,
//任务的句柄
&start_mytask_Handler
);
if(res == pdPASS)
{
Usart1_printf("start Task create Success");
}
//任务调度
vTaskStartScheduler();
}
void start_mytask(void *param)
{
//三个子任务都创建完毕后再运行
taskENTER_CRITICAL();
//task1:led1闪烁
xTaskCreate(myTask1 ,"Led1" ,256 ,NULL ,2 ,&myTask1_Handler);
//task2:led2闪烁
xTaskCreate(myTask2 ,"Led2" ,256 ,NULL ,2 ,&myTask2_Handler);
//task3:key检测
xTaskCreate(myTask3 ,"Led3" ,256 ,NULL ,2 ,&myTask3_Handler);
//创建完成后删除自己
vTaskDelete(NULL);
taskEXIT_CRITICAL();
}
void myTask1(void *param)
{
while(1)
{
Led_On(LED1);
vTaskDelay(500);
Led_Off(LED1);
vTaskDelay(500);
}
}
void myTask2(void *param)
{
while(1)
{
Led_On(LED2);
vTaskDelay(500);
Led_Off(LED2);
vTaskDelay(500);
}
}
void myTask3(void *param)
{
uint8_t KeyNum = 0;
while(1)
{
KeyNum = get_KeyNum();
if(KeyNum == 1)
{
vTaskSuspend(myTask1_Handler);//暂停任务1
}
else if(KeyNum == 2)
{
vTaskResume(myTask1_Handler);//恢复任务1
}
else if(KeyNum == 3)
{
vTaskSuspendAll();//暂停所有任务
}
else if(KeyNum == 4)
{
xTaskResumeAll();//恢复所有任务
}
}
}