1.线程通信的主要方式。消息队列中可以驻留一个或多个消息。 保留单个消息的消息队列称为邮箱(mailbox)。每个消息队列都是一个公用资源。
2.消息通过 tx_queue_send 复制到队列尾部(可通过tx_queue_front_send发送消息到队列头部),然后通过 tx_queue_receive 从队列中复制。唯一的例外是在等待空队列中的消息时线程会挂起,发送到队列的下一条消息将直接放入该线程的目标区域。
3.创建消息队列
线程在初始化期间或运行时创建。 应用程序中的消息队列数没有限制。
4.消息大小(一条消息有多大)
在创建队列时指定,可以是1个、2个、4个、8个、16个32位字。一个消息队列消息大小只能是其中一种。
超过 16 个字的消息必须通过指针传递。 可以创建消息大小为 1 个字的队列(足以容纳一个指针),然后发送和接收消息指针,而不是整个消息。
5.消息队列容量(多少条消息)
与消息大小、创建期间提供的内存区域大小有关。
队列的总消息容量=每条消息中的字节数÷所提供的内存区域的总字节数。
例如,如果支持消息大小为 1 个 32 位字(4 个字节)的消息队列是使用 100 字节内存区域创建的,则其容量为25条消息。
6.队列内存区域
在队列创建期间指定。应用程序可能会在高速 RAM 中定位重要队列的内存区域,从而提高性能。
7.线程挂起
尝试从队列发送或接收消息时,线程可能会挂起。 线程通常在等待来自空队列的消息时挂起,也可能在尝试向已满队列发送消息时挂起。
解决挂起的条件后,请求的服务完成,等待的线程也相应恢复。 如果同一队列中的多个线程挂起,这些线程将按FIFO恢复。
调用 tx_queue_prioritize可以恢复优先级。 队列设置优先级服务将优先级最高的线程置于挂起列表的前面,让所有其他挂起的线程采用相同的 FIFO 顺序。
超时会指定线程保持挂起状态的最大计时器时钟周期数。 如果发生超时,会恢复线程,该服务会返回相应的错误代码。
8.队列发送通知
tx_queue_send_notify 将应用程序通知函数注册到指定的队列,只要有消息发送到队列,就会通知函数。
9.队列事件链接(queue event chaining)
通知功能可用于链接各种同步事件。单个线程处理多个同步事件时很有用。
如:假设单个线程负责处理来自五个不同队列的消息,还必须在没有可用消息时挂起。 可通过为每个队列注册应用程序通知函数,并引入额外的计数信号灯实现。 就是每次调用应用程序通知函数时,该函数会执行 tx_semaphore_put(信号灯计数表示所有五个队列中的消息总数)。处理线程通过tx_semaphore_get挂起此信号灯。 当信号灯可用时(消息可用时),会恢复处理线程。 随后,它会询问每个队列来获取一条消息,处理找到的消息,然后执行另一个tx_semaphore_get,以等待下一条消息。
通常情况下,事件链会减少线程、降低开销和减少 RAM 要求。它还提供了一种非常灵活的机制来处理更复杂系统的同步要求。
10.运行时队列性能信息
可通过tx_queue_performance_info_get 和 tx_queue_performance_system_info_get获得
(1) 整个系统的总数
发送的消息数、收到的消息数、队列为空的挂起数、队列已满的挂起数、队列已满返回的错误数(未指定挂起)、队列超时数
(2) 每个队列的总数
发送的消息数、收到的消息数、队列为空的挂起数、队列已满的挂起数、队列已满返回的错误数(未指定挂起)、队列超时数
如果“队列已满的挂起数”相对较多,则表明增加队列大小可能有好处。
11.队列控制块TX_QUEUE
12.消息目标缺陷
消息将在队列区域和应用程序数据区域之间复制。 需要确保收到消息的目标大到足以容纳整个消息。 否则,可能会损坏消息目标后面的内存。