Freertos系列(三)任务的挂起和恢复API函数

8 篇文章 2 订阅
3 篇文章 0 订阅
本文介绍如何在FreeRTOS操作系统中使用任务挂起和恢复功能,以暂停和重新启动任务执行。通过示例代码展示了一个包含四个任务的系统,其中key任务用于控制test1任务的挂起和恢复,实现任务执行的临时中断和继续。
摘要由CSDN通过智能技术生成

有时候我们需要暂停某个任务的运行,过一段时间以后在重新运行。这个时候要是使用任务删除和重建的方法的话那么任务中变量保存的值肯定丢了!FreeRTOS 给我们提供了解决这种问题的方法,那就是任务挂起和恢复,当某个任务要停止运行一段时间的话就将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。

函数描述
vTaskSuspend()挂起一个任务。
vTaskResume()恢复一个任务的运行。
xTaskResumeFromISR()中断服务函数中恢复一个任务的运行。

任务挂起和恢复实验

实验:
创建四个任务,start任务,test1任务,test2任务,key任务

start:用来创建下面三个任务
test1:每隔一秒,灯LED0闪烁,并输出提示信息,该任务的执行次数
test2:每隔一秒,灯LED1闪烁,并输出提示信息,该任务的执行次数
key:通过俩个二按键,来控制test1任务的挂起与恢复

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "FreeRTOS.h"
#include "task.h"
#include "key.h"

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define TASK1_TASK_PRIO		2
//任务堆栈大小	
#define TASK1_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);

//任务优先级
#define TASK2_TASK_PRIO		3
//任务堆栈大小	
#define TASK2_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);

//任务优先级
#define KEY_TASK_PRIO		10
//任务堆栈大小	
#define KEY_STK_SIZE 		128  
//任务句柄
TaskHandle_t KeyTask_Handler;
//任务函数
void key_task(void *pvParameters);


int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);					//初始化延时函数
	uart_init(115200);     				//初始化串口
	LED_Init();		        			//初始化LED端口
	KEY_Init();                 //按键初始化

	
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    //taskENTER_CRITICAL();           //进入临界区
    //创建TASK1任务
    xTaskCreate((TaskFunction_t )task1_task,             
                (const char*    )"task1_task",           
                (uint16_t       )TASK1_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )TASK1_TASK_PRIO,        
                (TaskHandle_t*  )&Task1Task_Handler);   
    //创建TASK2任务
    xTaskCreate((TaskFunction_t )task2_task,     
                (const char*    )"task2_task",   
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_TASK_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler); 
//创建key任务
    xTaskCreate((TaskFunction_t )key_task,             
                (const char*    )"key_task",           
                (uint16_t       )KEY_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )KEY_TASK_PRIO,        
                (TaskHandle_t*  )&KeyTask_Handler);   
    vTaskDelete(StartTask_Handler); //删除开始任务
    //taskEXIT_CRITICAL();            //退出临界区
}


void key_task(void *pvParameters)
{
	u8  key;
	while(1)
	{
		key=KEY_Scan(0);
		
		switch(key)
		{
			case WKUP_PRES:vTaskSuspend(Task1Task_Handler);
			printf("test1 suspend!!!!\r\n");break;
			case KEY0_PRES:vTaskResume(Task1Task_Handler);
			printf("test1 resume!!!\r\n");break;
		}
	
        vTaskDelay(10);                           //延时1s,也就是1000个时钟节拍	
	}
}

//task1任务函数
void task1_task(void *pvParameters)
{
	u8 task1_num=0;
	

	while(1)
	{
		task1_num++;	//任务执1行次数加1 注意task1_num1加到255的时候会清零!!
		LED0=!LED0;
		printf("任务1已经执行:%d次\r\n",task1_num);


        vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	
	}
}

//task2任务函数
void task2_task(void *pvParameters)
{
	u8 task2_num=0;
	while(1)
	{
		task2_num++;	//任务2执行次数加1 注意task1_num2加到255的时候会清零!!
        LED1=!LED1;
		printf("任务2已经执行:%d次\r\n",task2_num);
		
        vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	
	}
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值