关于FreeRTOS 时间标志组的配置

最近在学习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 );

}

输出结果为:

img

希望有大伙可以给我解答一下,万分感谢