FreeRTOS学习(二) 任务挂起和恢复

本文详细介绍了在STM32F103环境下,利用Keil编译器实现任务挂起与恢复的方法。重点讲解了如何使用vTaskSuspend与vTaskResume函数在非中断与中断服务函数中控制任务状态,以及在中断服务函数中恢复任务后的上下文切换处理。

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

声明及感谢: 跟随正点原子资料学习, 在此作为学习的记录和总结
环境 keil , stm32f103
1. 任务挂起
vTaskSuspend(Task1Task_Handler) // 参数传入任务句柄

2. 任务恢复
任务恢复有两种情况,
第一种: 在非中断中恢复
vTaskResume(Task1Task_Handler); // 参数为任务句柄 即可恢复任务
注意: 只有通过函数vTaskSuspend()设置为挂起态的任务才可以用vTaskResume()恢复
第二种: 在中断服务函数中恢复任务
xTaskResumeFromISR(Task2Task_Handler); // 参数为任务句柄,即可恢复任务
注意: 返回值
返回 pdTRUE 表示恢复运行的任务的优先级等于或高于正在运行的任务(被中断打断的任务)
这意味着在退出中断服务函数以后必须进行一次上下文切换.
上下文切换使用 portYIELD_FROM_ISR(pdTRUE);
返回 pdFALSE 恢复运行的任务的优先级的任务优先级低于当前正在运行的任务(被中断打断的任务), 这意味
在退出中断函数以后不需要进行上下文切换.

实例:

// 外部中断4服务程序
void EXTI4_IRQHandler(void)
{
	BaseType_t YieldRequired;
	
	delay_xms(20);	// 消抖 注意中断中延时函数不能使用引起任务调度的延时
	if(KEY0==0)	 
	{				 
		YieldRequired=xTaskResumeFromISR(Task2Task_Handler);// 恢复任务2
		if(YieldRequired == pdTRUE)
		{
			/*
			函数xTaskResumeFromISR()返回值为pdTRUE,那么说明要恢复的这个任务的优先级
			等于或者高于正在运行的任务(被中断打断的任务)所以在退出中断的时候一定要进行上下文切换
			*/
			portYIELD_FROM_ISR(YieldRequired);
		}
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line4);// 清除LINE4上的中断标志位
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值