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( ;; );}

分析下该断言的使用,也就是说只有当队列为item1的时候,才能使用该复写的方法。

很扯是吗。。但是的确是这个问题。

查询资料为FreeRTOS源码详解与应用开发

FreeRTOS中队列复写的问题_第1张图片

该函数常用语向长度为1的队列发送消息,也就是说如果要向长度大于1的队列发送消息,则需要在断言内进行更改

configASSERT( !( ( xCopyPosition ==queueOVERWRITE ) && ( pxQueue->uxLength != 256) ) );

如此,即可使用复写函数进行队列消息的发送。


你可能感兴趣的:(STM32,M3)