STM32下FREERTOS初始化失败问题求助

2020-01-11 18:15发布

各位,问题如下:

目前系统使用串口来接收IMU模块上传的欧拉角数据,现在的做法是在接收到一个字节后在中断中直接抛信号量,然后相应的任务去读取、解析接收到的数据,最后清中断,重开串口接收中断。代码如下:

中断部分:
void USART2_IRQHandler(void)                       
{

  BaseType_t xHigherPriorityTaskWoken;

        //ÊͷŶþÖµÐźÅÁ¿
        if(BinarySemaphore_DecodeUart2ReceivedChar !=NULL)//½ÓÊÕµ½Êý¾Ý£¬²¢ÇÒ¶þÖµÐźÅÁ¿ÓÐЧ
        {
                xSemaphoreGiveFromISR(BinarySemaphore_DecodeUart2ReceivedChar,&xHigherPriorityTaskWoken);        //ÊͷŶþÖµÐźÅÁ¿
                portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//Èç¹ûÐèÒªµÄ»°½øÐÐÒ»´ÎÈÎÎñÇл»
        }

}

任务部分:
void task2_task(void *pvParameters)
{
        u32 timeout=0;
          u32 maxDelay=0x1FFFF;
        while(1)
        {
                        err=xSemaphoreTake(BinarySemaphore_DecodeUart2ReceivedChar,portMAX_DELAY);
                        if(err == pdTRUE)
                        {
                                {
                                        Packet_Decode(Uart2_aRxBuffer[0]);//数据解析
                                        HAL_UART_IRQHandler(&UART2_Handler);        //µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý
                                        timeout=0;
                                        while (HAL_UART_GetState(&UART2_Handler)!=HAL_UART_STATE_READY)//µÈ´ý¾ÍÐ÷
                                        {
                                                timeout++;///
                                                if(timeout>maxDelay) break;               
                                        }
                                        timeout=0;
                                        while(HAL_UART_Receive_IT(&UART2_Handler,(u8 *)Uart2_aRxBuffer, RXBUFFERSIZE)!=HAL_OK)//重开接收中断
                                        {
                                                timeout++; //
                                                if(timeout>maxDelay) break;       
                                        }
                                }
                        }
        }
}


目前的问题是系统一上电IMU模块就自动按500Hz的频率上传数据,main函数中先做硬件初始化 创建任务,开调度器,发现OS无法运行起来。  试了几次,感觉可能是OS初始化太长,然后UART中断中就调用了OS的系统函数导致的。   所以想问各位,外设中断中需要调用OS函数的情况下怎么初始化,才能保证系统正常运行

初始化部分:

int main(void)
{
/************************************************************/

       
/*************************************/       
  Cache_Enable();                 //´ò¿ªL1-Cache
  HAL_Init();                                        //³õʼ»¯HAL¿â
  Stm32_Clock_Init(432,25,2,9);   //ÉèÖÃʱÖÓ,216Mhz
  delay_init(216);                //ÑÓʱ³õʼ»¯
        imu_data_decode_init();
        //portDISABLE_INTERRUPTS();
  uart_init(115200);                        //ËùÓд®¿Ú³õʼ»¯   Ä¿Ç°Ê¹Óô®¿Ú1  2
  LED_Init();                     //³õʼ»¯LED
        KEY_Init();                                                //³õʼ»¯°´¼ü
        EXTI_Init();                                        //³õʼ»¯ÍⲿÖжÏ
        SDRAM_Init();
        //CAN³õʼ»¯»·»Øģʽ,²¨ÌØÂÊ1000Kbps  
        CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS2_2TQ,CAN_BS1_3TQ,9,CAN_MODE_LOOPBACK);

    xTaskCreate((TaskFunction_t )start_task,            //ÈÎÎñº¯Êý
                (const char*    )"start_task",          //ÈÎÎñÃû³Æ
                (uint16_t       )START_STK_SIZE,        //ÈÎÎñ¶ÑÕ»´óС
                (void*          )NULL,                  //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý
                (UBaseType_t    )START_TASK_PRIO,       //ÈÎÎñÓÅÏȼ¶
                (TaskHandle_t*  )&StartTask_Handler);   //ÈÎÎñ¾ä±ú              
    vTaskStartScheduler();          //¿ªÆôÈÎÎñµ÷¶È
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。