第五章 FreeRTOS的任务挂起与恢复

本文详细介绍了FreeRTOS中任务的挂起与恢复机制,包括常规的vTaskSuspend和vTaskResume,以及在中断服务函数中使用的vTaskResumeFromISR,涉及挂起流程、恢复流程和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一. 任务的挂起

1.1 任务挂起函数介绍

1.2 任务挂起流程

1.3 任务挂起函数内部实现流程(概括)

二. 任务的恢复

2.1“任务中的恢复”

2.1.1任务恢复函数介绍

2.1.2 任务恢复流程

2.1.3任务恢复函数内部实现流程(概括)

2.2 “中断中的恢复”

2.2.1任务恢复函数介绍

2.2.2 任务恢复流程

2.2.3 任务恢复函数内部实现流程(概括)

2.2.4 示例代码


一. 任务的挂起

1.1 任务挂起函数介绍

void vTaskSuspend(TaskHandle_t xTaskToSuspend) 

参数介绍

xTaskToSuspend:待挂起任务的任务句柄(想挂起哪个任务,就传入哪个任务的任务句柄

1.2 任务挂起流程

使用时需将宏 INCLUDE_vTaskSuspend  配置为 1 即可。

注意:

        ① 当传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)。

        ② 无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。


1.3 任务挂起函数内部实现流程(概括)


二. 任务的恢复

2.1“任务中的恢复”

2.1.1任务恢复函数介绍

void vTaskResume(TaskHandle_t xTaskToResume)

 参数介绍

xTaskToResume待恢复任务的任务句柄。

2.1.2 任务恢复流程

使用时需将宏 INCLUDE_vTaskSuspend  配置为 1 即可,和挂起任务需要配置的宏是同一个。

注意:

        任务无论被vTaskSuspend()挂起多少次,只需在任务中调用vTaskResume()恢复一次,就可以继续运行,且被恢复的任务会进入就绪态


2.1.3任务恢复函数内部实现流程(概括)


2.2 “中断中的恢复”

2.2.1任务恢复函数介绍

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)  

参数介绍

xTaskToResume待恢复任务的任务句柄。

函数返回值描述
pdTrue任务恢复后需要进行任务切换(恢复的任务优先级,大于当前正在执行的任务优先级)
pdFALSE任务恢复后不需要进行任务切换

2.2.2 任务恢复流程

使用时,将宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR配置为1

注意:

        ① 该函数专用于中断服务函数中,用于解挂(恢复)被挂起的任务。

        ② 中断服务函数中要调用FreeRTOS中的API函数,则中断优先级不能高于FreeRTOS所管理的最高优先级。(FreeRTOS所管理的中断优先级是5~15,中断优先级必须在此范围内,如果中断优先级在0~4(FreeRTOS任务优先级是越大越高,而中断优先级是越小越高。),0~4数值比5~15小,优先级高,不属于FreeRTOS所管理的范围)。

        ③ 函数带有“FromISR”后缀的,为中断服务函数中专用API函数


2.2.3 任务恢复函数内部实现流程(概括)

2.2.4 示例代码

void EXTI4_IRQHandler(void)
{
	delay_xms(10);//消抖
	BaseType_t YieldRequired;
	
	if(KEY0==1)	 //按键KEY0
	{
		YieldRequired = xTaskResumeFromISR(task1_handler);	//在中断中恢复被挂起的任务

		printf("中断恢复任务1的运行!\r\n");
		if(YieldRequired == pdTRUE)	
		{
			 portYIELD_FROM_ISR(YieldRequired);				//任务切换
		}
	}		 
	EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值