前言
本文只描述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可以根据自己需求用自带的串口文件给电脑发送信息