文章目录
本笔记基于 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 发送到消息队列。如果存在,发送线程指向的数据项被复制到等待线程;否则,如果空间可用,则将该项目复制到消息队列的环形缓冲区。在任一情况下,被发送的数据区的大小 必须等于消息队列的数据项大小。
如果线程在环形缓冲区已满时尝试发送数据项,则发送线程可能会选择等待空间变得可用。当环形缓冲区已满时,任何数量的发送线程都可以同时等待;当空间可用时,它会分配给等待时间最长的最高优先级发送线程。
如果线程在环形缓冲区为空时尝试接收数据项,则接收线程可能会选择等待被发送的数据项。当环形缓冲区为空时,任何数量的接收线程都可以同时等待;当一个数据项可用时,它会被分配给等待时间最长的最高优先级的接收线程。
线程可以从消息队列中接收数据项。将数据项复制到接收线程指定的区域;接收区的大小必须等于消息队列的数据项大小。
线程还可以查看消息队列头部的消息,而无需将其从队列中删除。将数据项复制到接收线程指定的区域;接收区的大小必须等于消息队列的数据项大小。
Note:
内核确实允许 ISR 从