Zephyr内核——内核服务(数据传递)——消息队列

Zephyr内核中的消息队列提供了一种异步线程间通信的方式,允许固定大小的数据项传递。消息队列包含一个环形缓冲区,数据项大小需与特定边界对齐。初始化后,线程和ISR可发送、接收、查看数据项。当缓冲区满时,发送线程可选择等待,反之,当缓冲区为空时,接收线程也可等待。消息队列适用于小数据项传输,避免中断延迟。

消息队列

消息队列是一个内核对象,它实现了一个简单的消息队列,允许线程和isr异步地发送和接收固定大小的数据项。

概念

可以定义任意数量的消息队列(仅受可用RAM的限制)。每个消息队列都由其内存地址引用。

消息队列具有以下关键字属性:

  • 已发送但尚未收到的数据项的环形缓冲区。
  • 数据项大小,以字节为单位度量。
  • 可在环缓冲区中排队的最大数据项数量。

消息队列的环缓冲区必须与N字节边界对齐,其中N是2的幂(即1、2、4、8、…)。为了确保存储在环缓冲区中的消息同样与此边界对齐,数据项的大小也必须是N的倍数。

必须对消息队列进行初始化后才能使用。这将将其环形缓冲区设置为空。

数据项可以通过线程或ISR发送到消息队列。如果存在,发送线程指向的数据项将复制到等待线程;否则,如果空间可用,该项将复制到消息队列的环形缓冲区。在任何一种情况下,要发送的数据区域的大小必须等于消息队列的数据项大小。

如果线程在环缓冲区已满时尝试发送数据项,则发送线程可以选择等待空间可用。当环缓冲区满时,任意数量的发送线程可以同时等待;当空间可用时,它被给予等待时间最长的最高优先级的发送线程。

一个线程可以从一个消息队列中接收到一个数据项。该数据项将被复制到由接收线程指定的区域;接收区域的大小必须等于消息队列的数据项大小。

如果线程在环缓冲区为空时尝试接收数据项,则接收线程可以选择等待发送数据项。当环缓冲区为空时,任意数量的接收线程可以同时等待;当数据项可用时,将给予等待时间最长的最高优先级接收线程。<

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值