问题描述
FreeRtos系统中通过串口报错:
Error:..\FreeRTOS\queue.c,927
Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,784
原因分析:
常见修改bug的方法是增加任务栈、
或者修改中断优先级,
但在本次运行中这两种方式均不起任何作用
继续设置条件编译对代码进行分析,发现一个有意思的现象:
如果调试时先运行代码后进行串口发送,则不报错;
如果调试时代码运行前串口就在自动发送消息,则进行报错
继续定位报错的地方,语句为 :configASSERT( pxQueue );
忽然之间知道问题出在哪里了:一般我们先进行串口的初始化,然后创建队列,如下图
USART3_Init(115200); //初始化串口3
...
usart3MsgQueue = xQueueCreate(1,sizeof(P_Usart3Msg)); //创建串口3消息队列
但是串口的中断函数中一句话是:
xQueueSendFromISR(usart3MsgQueue,(void *)(&pUsart3data),&xHigherPriorityTaskWoken);
串口在初始化后会调用中断服务函数,终端服务函数中使用了队列进行数据传递,但此时并未创建队列,因此会进行报错。
解决方案:
先创建队列,然后初始化串口
usart3MsgQueue = xQueueCreate(1,sizeof(P_Usart3Msg)); //创建串口3消息队列
...
USART3_Init(115200); //初始化串口3