消息队列
消息队列是一个内核对象,它实现了一个简单的消息队列,允许线程和isr异步地发送和接收固定大小的数据项。
概念
可以定义任意数量的消息队列(仅受可用RAM的限制)。每个消息队列都由其内存地址引用。
消息队列具有以下关键字属性:
- 已发送但尚未收到的数据项的环形缓冲区。
- 数据项大小,以字节为单位度量。
- 可在环缓冲区中排队的最大数据项数量。
消息队列的环缓冲区必须与N字节边界对齐,其中N是2的幂(即1、2、4、8、…)。为了确保存储在环缓冲区中的消息同样与此边界对齐,数据项的大小也必须是N的倍数。
必须对消息队列进行初始化后才能使用。这将将其环形缓冲区设置为空。
数据项可以通过线程或ISR发送到消息队列。如果存在,发送线程指向的数据项将复制到等待线程;否则,如果空间可用,该项将复制到消息队列的环形缓冲区。在任何一种情况下,要发送的数据区域的大小必须等于消息队列的数据项大小。
如果线程在环缓冲区已满时尝试发送数据项,则发送线程可以选择等待空间可用。当环缓冲区满时,任意数量的发送线程可以同时等待;当空间可用时,它被给予等待时间最长的最高优先级的发送线程。
一个线程可以从一个消息队列中接收到一个数据项。该数据项将被复制到由接收线程指定的区域;接收区域的大小必须等于消息队列的数据项大小。
如果线程在环缓冲区为空时尝试接收数据项,则接收线程可以选择等待发送数据项。当环缓冲区为空时,任意数量的接收线程可以同时等待;当数据项可用时,将给予等待时间最长的最高优先级接收线程。<