各位,问题如下:
目前系统使用串口来接收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(); //¿ªÆôÈÎÎñµ÷¶È
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>