我使用的开发板是正点原子的战舰V3,使用正点原子的标准库例程移植的FreeRTOS,在测试任务挂起、恢复的时候遇到的问题。
下面四行是串口打印的error:
挂起LED1Task
Error:..\FreeRTOS\portable\RVDS\ARM_CM3\port.c,378
中断中恢复LED1Task
Error:..\FreeRTOS\tasks.c,2806
下面是exti.c的代码,与FreeRTOS任务挂起恢复例程的代码一模一样。
内容就是初始化KEY、GPIO、EXTI、NVIC,中断服务程序中对指定任务恢复,并进行任务切换,我运行例程的时候是正常运行的,并不会报上诉错误,但是在我移植的工程中使用这个exti就会报错,网上也找不到解决的方案。
#include "delay.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
extern TaskHandle_t LED1Task_Handler;
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//外部中断 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//
//外部中断0服务程序
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
KEY_Init(); // 按键端口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
//GPIOE.2 中断线以及中断初始化配置 下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键KEY2所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x06; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
//外部中断2服务程序
void EXTI2_IRQHandler(void)
{
BaseType_t xYieldRequired;
delay_ms(10);//消抖
if(KEY2==0) //按键KEY2
{
printf("中断中恢复LED1Task\r\n");
xYieldRequired = xTaskResumeFromISR(LED1Task_Handler);
if(xYieldRequired == pdTRUE)
{
portYIELD_FROM_ISR( xYieldRequired );
}
}
EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位
}