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) ) );如此,即可使用复写函数进行队列消息的发送。
————————————————
版权声明:本文为CSDN博主「Blucher_Ce」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_25505611/article/details/80570213
https://blog.csdn.net/baidu_25505611/article/details/80570213