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();          //¿ªÆôÈÎÎñµ÷¶È
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
yangsen
1楼-- · 2020-01-11 19:54
就是说你的信号量还没建立起来就被使用了,你可以在开中断前先创建好信号量,更保险的办法是在通信解析任务中创建信号量和开中断
zsmbj
2楼-- · 2020-01-11 20:30
把串口初始化放到任务开始里边去。

还有,你在中断里给一个任务一个信号,用信号量不如用Notify。这个freertos新版本支持的。比信号量快.
That flexibility allows task notifications to be used where previously it would have been necessary to create a separate queue, binary semaphore, counting semaphore or event group. Unblocking an RTOS task with a direct notification is 45% faster * and uses less RAM than unblocking a task with a binary semaphore.

zsmbj
3楼-- · 2020-01-11 21:13
 精彩回答 2  元偷偷看……
shangdawei
4楼-- · 2020-01-12 00:40
zsmbj 发表于 2018-1-7 20:47
把串口初始化放到任务开始里边去。

还有,你在中断里给一个任务一个信号,用信号量不如用Notify。这个free ...

是这里吧?
https://www.freertos.org/RTOS-task-notifications.html
Available From FreeRTOS V8.2.0

zsmbj
5楼-- · 2020-01-12 02:52
shangdawei 发表于 2018-1-7 21:08
是这里吧?
https://www.freertos.org/RTOS-task-notifications.html
Available From FreeRTOS V8.2.0

yes,8.20以上都支持。Notify不需要初始化,直接就可以使用。
上海爱观视觉
6楼-- · 2020-01-12 03:17
问题已经解决,主要是串口数据一直进来,导致系统一直进中断并调度任务,CPU一直被中断劫持导致的。现在的做法是在中断中解析数据,解析完一帧后发信号量,任务只做解析后的数据的读取工作,正常工作

一周热门 更多>