FreeRTOS中队列复写的问题
FreeRTOS应该是所有嵌入式人员都经常使用的操作OS了,最近博主在使用的时候遇到了一个问题,具体情况如下:
在hal库中,其封装好了队列QUEUE的复写函数
xQueueOverwrite( xQueue, pvItemToQueue )
那么其宏定义如下
#define xQueueOverwrite( xQueue,pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0,queueOVERWRITE )
可以看到最后一个参数为queueOVERWRITE,说明调用该函数是为了队列的复写功能
现在博主来分析下这个问题:
初始化一个队列,item一定要大于1
osMessageQDef(UsbSendQueue, 256, uint8_t);
UsbSendQueueHandle =osMessageCreate(osMessageQ(UsbSendQueue), NULL);
调用该方法,
xQueueOverwrite(UsbQueue,g_USBTxdBuffer); //复写入队
会死在其函数的断言中:
configASSERT( !( ( xCopyPosition ==queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
分析该断言可发现其是一个循环函数:
#define configASSERT( x ) if ((x) == 0){taskDISABLE_INTERRUPTS(); for( ;; );}
分析下该断言的使用,也就是说只有当队列为item为1的时候,才能使用该复写的方法。
很扯是吗。。但是的确是这个问题。
查询资料为FreeRTOS源码详解与应用开发
该函数常用语向长度为1的队列发送消息,也就是说如果要向长度大于1的队列发送消息,则需要在断言内进行更改
configASSERT( !( ( xCopyPosition ==queueOVERWRITE ) && ( pxQueue->uxLength != 256) ) );
如此,即可使用复写函数进行队列消息的发送。