FreeRTOS学习总结(3)——任务挂起与恢复


前言

本文只描述vTaskSuspend vTaskResume xTaskResumeFromISR这三个函数


一、查看官方定义

原文大意

vTaskSuspend是用来按暂停的
vTaskResume 是按继续开始的,不管暂停了几次,只需要按一次继续
xTaskResumeFromISR 是特殊的继续开始,在中断中执行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

需要使用的宏定义

INCLUDE_xTaskResumeFromISR
include_vTaskSuspend

二、使用步骤

1.vTaskSuspend与vTaskResume

这两个比较简单,直接传递句柄参数就好
代码如下详情看源码:

uint16_t i=0;
void task1_void(void *pvParameters)
{
    while(1)
    {
			OLED_ShowString(1,1,"        ");
			OLED_ShowString(1,1,"1");
			vTaskDelay(1000);
			i++;
    }
}
void task2_void(void *pvParameters)
{
	    while(1)
    {
			if(i>=5)
			{
				vTaskSuspend(task1_Handler);
				OLED_ShowString(1,1,"finish");
				i++;
			}
			OLED_ShowNum(2,1,i,2);
						if(i==10)
			{
				i=0;
				vTaskResume(task1_Handler);
			}
			vTaskDelay(1000);
    }
}

2.xTaskResumeFromISR

首先我们要知道 FreeRTOS管理的中断优先级在5~15
所以我们选用的优先级分组为NVIC_PriorityGroup_4
优先级选 5 0
代码如下(示例):

	//主函数分过组了,这里就注释掉
	//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	NVIC_InitTypeDef nvic;
	nvic.NVIC_IRQChannel=EXTI15_10_IRQn;
	nvic.NVIC_IRQChannelCmd=ENABLE;
	nvic.NVIC_IRQChannelPreemptionPriority=5;
	nvic.NVIC_IRQChannelSubPriority=0;

在之后查看参考手册,说明这里有返回值
这个函数并不直接恢复,而是根据返回值判断是否需要恢复
在这里插入图片描述
直接在中断函数里写,最后要清除标志位

void EXTI15_10_IRQHandler(void)
{
	BaseType_t xYieldRequired;
	if(EXTI_GetITStatus(EXTI_Line12)==SET)
	{
		
		xYieldRequired = xTaskResumeFromISR( task1_Handler );
		//ÖжÏ
		if(xYieldRequired==pdTRUE)portYIELD_FROM_ISR( xYieldRequired );
		EXTI_ClearITPendingBit(EXTI_Line12);
	}
	
}

三、源文件

链接:https://pan.baidu.com/s/1cL8Ae2XV3AS8jphoXhgPGA?pwd=1111
提取码:1111
中断恢复没有进行测试,别的测试过了,需要有OLED进行显示
没有OLED可以根据自己需求用自带的串口文件给电脑发送信息

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值