STM32解决方法 | 解决在“stm32的HAL库+freertos”中,使用xTaskResumeFromISR函数无响应

本文描述了一个关于FreeRTOS中任务调度的问题,在串口中断后尝试恢复一个较高优先级的任务失败的情况。通过检查xTaskResumeFromISR函数的返回值并正确执行上下文切换解决了该问题。

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

起因

最近在有一个项目因为任务比较多,就上了freertos,但是在我接收串口数据后,使用xTaskResumeFromISR函数,进入一个更高优先级的任务时,死活进不去。

问题描述

在运行一个优先级为5的任务,这个时候串口有数据传给单片机,进入中断接收数据,并使用xTaskResumeFromISR恢复一个优先级为6的任务,使数据写入内部flash。这个时候,恢复的任务优先级为6,原本在运行的任务优先级为5,应该优先执行优先级为6的任务,但单片机不这么执行。

解决方法

如果函数xTaskResumeFromISR()返回值为pdTRUE,那么说明要恢复的这个任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),所以在退出中断的时候一定要进行上下文切换!

void USART3_IRQHandler(void)
{
	HAL_UART_IRQHandler(&huart3);

	BaseType_t YieldRequired;
	if(usart3_buf[0]=='a' && usart3_buf[1]=='b' && usart3_buf[2]=='c')
	{
		YieldRequired = xTaskResumeFromISR(WriteFlashHandler);
		if(YieldRequired = pdTRUE)
		{
			portYIELD_FROM_ISR(YieldRequired);
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值