最近在学习FreeRTOS
在学习事件标志组时,中断里面的xEventGroupSetBitsFromISR出现问题,我觉得是在FreeRTOS.h或者是FreeRTOSConfig.h里面的宏定义配置出现问题。希望有大伙可以给我解答一下具体问题是什么
以下是我的代码:
#include "main.h"
#define START_TASK_PRIO 1
#define START_STK_SIZE 512 //任务栈空间
void start_task(void * pvParameters); //任务函数
TaskHandle_t StartTask_Handler; //任务句柄
#define TASK1_TASK_PRIO 2
#define TASK1_STK_SIZE 512
static void task1_task(void * pvParameters);
TaskHandle_t Task1Task_Handler; //任务句柄
#define TASK2_TASK_PRIO 2
#define TASK2_STK_SIZE 512
static void task2_task(void * pvParameters);
TaskHandle_t Task2Task_Handler; //任务句柄
#define TASK3_TASK_PRIO 2
#define TASK3_STK_SIZE 512
static void task3_task(void * pvParameters);
TaskHandle_t Task3Task_Handler; //任务句柄
EventGroupHandle_t g_flag_event =NULL; //串口1消息队列
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SysTick_Config(SystemCoreClock/configTICK_RATE_HZ);
led_init();
//115200波特率
usart1_init(115200);
/* 创建事件标志组 */
g_flag_event = xEventGroupCreate(); /* 消息的大小 */
if(NULL == g_flag_event)
printf("创建Test_Queue消息队列失败!\r\n");
xTaskCreate((TaskFunction_t ) start_task,
(char* ) "start_task",
(uint16_t ) TASK1_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t* ) &StartTask_Handler);
vTaskStartScheduler(); //开启任务调度
while(1)
{
}
}
void exti3_init(void)
{
//使能端口A硬件时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
//使能系统配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//配置PA0引脚为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //决定io口响应速度,100mhz是高速响应
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //有使能上拉电阻
GPIO_Init(GPIOE,&GPIO_InitStructure);
//将PA0和EXTI0连接到一起
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
//外部中断配置
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//配置nvic(中断请求通道)
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //打开外部中断0的请求通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道
NVIC_Init(&NVIC_InitStructure);
}
void start_task(void * pvParameters)
{
printf("start_task create is ok\r\n");
//创建Task1
xTaskCreate((TaskFunction_t ) task1_task,
(char* ) "task1_task",
(uint16_t ) TASK1_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK1_TASK_PRIO,
(TaskHandle_t* ) &Task1Task_Handler);
//创建Task2
xTaskCreate((TaskFunction_t ) task2_task,
(char* ) "task2_task",
(uint16_t ) TASK2_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK2_TASK_PRIO,
(TaskHandle_t* ) &Task2Task_Handler);
//创建Task3
xTaskCreate((TaskFunction_t ) task3_task,
(char* ) "task3_task",
(uint16_t ) TASK3_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK3_TASK_PRIO,
(TaskHandle_t* ) &Task3Task_Handler);
vTaskDelete(StartTask_Handler); //NULL
}
void task1_task(void * pvParameters)
{
uint32_t task_cnt=0;
printf("task1 is create ok\r\n");
while(1)
{
task_cnt++;
printf("app_task1 have run %d times\r\n",task_cnt);
xEventGroupSetBits( g_flag_event, 0x01 );
delay_ms(200);
}
}
void task2_task(void * pvParameters)
{
uint32_t task2_cnt=0;
printf("task2 is create ok\r\n");
exti3_init();
while(1)
{
task2_cnt++;
printf("app_task2 have run %d times\r\n",task2_cnt);
delay_ms(200);
}
}
void task3_task(void * pvParameters)
{
EventBits_t flag=0;
printf("task3 is create ok\r\n");
while(1)
{
//等待事件组中的相应事件位,或同步
flag=xEventGroupWaitBits(g_flag_event,
0x03, //0x01和0x02相与
pdTRUE,
pdTRUE,
portMAX_DELAY);
if(flag & 0x03)
{
printf("xEventGroupWaitBits bit0 is set ok\r\n");
}
}
}
void EXTI3_IRQHandler(void)
{
uint32_t ulReturn;
/* 进入临界段,临界段可以被更高抢占优先级的中断嵌套 */
ulReturn = taskENTER_CRITICAL_FROM_ISR();
//判断是否有中断请求(是否有标志位)
if(EXTI_GetITStatus(EXTI_Line3) == SET)
{
printf("就是xEventGroupSetBitsFromISR这个函数的问题\r\n");
xEventGroupSetBitsFromISR( g_flag_event, 0x02,NULL );
//清空标志位(已经完成中断处理)
EXTI_ClearITPendingBit(EXTI_Line3);
}
/* 退出临界段 */
taskEXIT_CRITICAL_FROM_ISR( ulReturn );
}
输出结果为:
希望有大伙可以给我解答一下,万分感谢