FreeRTOS中队列复写的问题

本文探讨了FreeRTOS中队列复写函数xQueueOverwrite的问题,详细分析了使用该函数时遇到的一个断言错误,并给出了修改建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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源码详解与应用开发


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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值