Zephyr RTOS -- Message Queues

本笔记基于 Zephyr 版本 2.6.0-rc2

 

前言

本人正在学习 Zephyr,一个可移植性较强,可以兼容多种开发板及物联网设备的操作系统,如果你感兴趣,可以点此查看我的 学习笔记总述 进行了解!

 

摘要

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

 

1. Concepts

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

消息队列具有下列属性:

  • 一个已发送但尚未接收的数据项的 环形缓冲区(ring buffer)
  • 数据项的大小(data item size),以字节为单位。
  • 可在循环缓冲区中排队的数据项的 最大数量(maximum quantity)

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

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

如果线程在环形缓冲区已满时尝试发送数据项,则发送线程可能会选择等待空间变得可用。当环形缓冲区已满时,任何数量的发送线程都可以同时等待;当空间可用时,它会分配给等待时间最长的最高优先级发送线程。

如果线程在环形缓冲区为空时尝试接收数据项,则接收线程可能会选择等待被发送的数据项。当环形缓冲区为空时,任何数量的接收线程都可以同时等待;当一个数据项可用时,它会被分配给等待时间最长的最高优先级的接收线程。

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

线程还可以查看消息队

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值