消息队列queue

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.消息目标缺陷

        消息将在队列区域和应用程序数据区域之间复制。 需要确保收到消息的目标大到足以容纳整个消息。 否则,可能会损坏消息目标后面的内存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值