API函数
使用的原因
我们有一个任务在创建过程中,暂停运行等待某个条件触发再去运行,这样就可以有效保留数据
代码修改
上节代码 在上节代码基础上 加
Key_Task3_Handler= xTaskCreateStatic((TaskFunction_t) Key_task3,
(char *) "Key_task3",
(uint32_t) Key_Task3_Size,/
(void*) NULL,
(UBaseType_t) Key_Task3_Priority,
(StackType_t*) Key_Task3Stack,
(StaticTask_t*) &Key_Task3TCB);
按键初始化
void Key_Init(void)
{
GPIO_InitTypeDef GPIOE_InitStruct;
GPIO_InitTypeDef GPIOA_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);
GPIOE_InitStruct.GPIO_Mode =GPIO_Mode_IPU;
GPIOE_InitStruct.GPIO_Pin =GPIO_Pin_3;
GPIOE_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIOE_InitStruct);
GPIOA_InitStruct.GPIO_Mode =GPIO_Mode_IPD;
GPIOA_InitStruct.GPIO_Pin =GPIO_Pin_0;
GPIOA_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOA_InitStruct);
}
任务挂起
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
{
vTaskSuspend(Task_Task1_Handler);
printf("task1 is Supend\r\n");
vTaskDelay(1000);
}
}
任务恢复
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
vTaskDelay(1000);
vTaskResume(Task_Task1_Handler);
printf("task1 is Handler\r\n");
vTaskDelay(1000);
}
}
挂起的任务函数
执行的应该LED1 (任务2), 因为挂起了 任务1
恢复 任务函数
挂起什么就恢复什么
实验现象
使用中断触发
nvic.c
void NVIC_INIT(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
Key_Init();
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
EXTI_InitStruct.EXTI_Mode =EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Line =EXTI_Line3;
EXTI_InitStruct.EXTI_Trigger =EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd =ENABLE;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel =EXTI3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0x04;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
中断函数
extern TaskHandle_t Task_Task1_Handler;
void EXTI3_IRQHandler(void)
{
BaseType_t yieldRequired;
delay_xms(20);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
{
yieldRequired=xTaskResumeFromISR(Task_Task1_Handler);
printf("task1 is Handler\r\n");
if(yieldRequired==pdTRUE)
portYIELD_FROM_ISR(yieldRequired);
}
}
}
EXTI_ClearITPendingBit(EXTI_Line3);
}
好像这样就行了 是不是呢
串口打印为什么error 呢
原因如下
所以把 优先级改了就行了 改 5(包含)以上
回去代码 需要注意一个地方
判断条件 是 手册 提供 的 并不是重点 主要我们要看下一句 为什么要进行 上下文切换呢
因为你进入中断之后 执行完中断事件 如果不进行切换 你就卡在中断事件出不来了
这里相当于是一个退出条件 退出成功之后就是回到最初的起点。
extern 关键字 可以调用其他文件的变量 并且不改变值 ,不影响调用文件的变量的使用 。
|