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) ) );如此,即可使用复写函数进行队列消息的发送。


————————————————
版权声明:本文为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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值