FreeRTOS消息队列

队列又称消息队列,是一种常用于任务间通信的数据结构, 队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息。 消息队列是一种异步的通信方式。

任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO),但是也支持后进先出原则(LIFO)

十分重要的阻塞机制!
只有在任务中发送消息才允许进行阻塞状态而在中断中发送消息不允许带有阻塞机制的

需要调用在中断中发送消息的 API 函数接口,因为发送消息的上下文环境是在中断中,不允许有阻塞的情况。

消息队列常用函数:
1)消息队列创建函数:xQueueCreate(UBaseType_t   uxQueueLength, UBaseType_t    uxItemSize );

                                                                                       消息队列的长度                           消息单元的大小

    函数返回值为一个队列句柄

     此函数是通过动态方式分配内存创建消息队列,需要配置
     #define configSUPPORT_DYNAMIC_ALLOCATION 1        配置动态分配内存

如果使用静态分配内存    ,需要使用xQueueCreateStatic()函数

2)消息队列删除函数 :vQueueDelete(QueueHandle_t xQueue)

   需要注意的是调用删除消息队列函数前,系统应存在 xQueueCreate()或 xQueueCreateStatic()函数创建的消息队列。

  此外vQueueDelete()也可用于删除信号量。 如果删除消息队列时,有任务正在等待消息, 则不应该进行删除操作

3)向消息队列发送消息函数:xQueueSend(QueueHandle_t xQueue, const void *pvItemToQueue, Ticktype_t xTincksTowait);

                                                                                     队列句柄          指针,指向要送到队尾的队列消息           最大超时时间

 xQueueSendFromISR(QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t  pxHigherpriorityTaskWoken)

        是 xQueueSend()的中断保护版本,用于在中断服务程序中向队列尾部发送一个队列消息

   xQueueSendToFront()  发往队首的;  xQueueSendToFrontFromISR ()带有中断保护的  发往队首的

4)消息队列接收函数:xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait)

      xQueueReceiveFromISR(QueueHandle_t xQueue, void *pvBuffer, BaseType_t  pxHigherpriorityTaskWoken)   用于中断的          过 程中  接 收消息

 

消息队列使用注意事项:

1)一定要先创建消息队列、定义存储数据的地址,确保数据区域和消息大小问题,避免引发地址非法错误。

2)无论是发送或者是接收消息都是以拷贝的方式进行, 如果消息过于庞大,可以将  消息的地址作为消息进行发送、接收


 

   


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值