ThreadX消息队列如何在STM32上工作?

消息队列是ThreadX中线程间通信的主要方式。一个或多个消息可以驻留在消息队列中。包含单个消息的消息队列通常称为邮箱。

消息由tx_queue_send复制到队列,并由tx_队列_receive从队列复制。唯一的例外是线程在等待空队列上的消息时挂起。在这种情况下,发送到队列的下一条消息将直接放入线程的目标区域。
每个消息队列支持许多固定大小的消息。可用的消息大小为1到16(包括32位单词)。消息大小是在创建队列时指定的。大于16个字的应用程序消息必须通过指针传递。这是通过创建一个消息大小为1个字(足以容纳一个指针)的队列,然后发送和接收消息指针而不是整个消息来实现的。
队列的总消息容量是通过将每条消息中的字节数除以所提供的内存区域中的字节总数来计算的。例如,如果一个支持一个32位字(4字节)消息大小的消息队列是用100字节的内存区域创建的,那么它的容量是25条消息。

1.目标以下为:

本文的目的是通过一个关于消息队列如何工作的工作示例提供一个简短的解释
尽管该示例使用NUCLEO-H223ZG,但您可以对其他基于STM32H7的板使用相同的步骤。主要区别通常是引脚输出和时钟配置。
本文将从头开始一个项目,使用STM32CubeIDE中提供的软件包添加AzureRTOS中间件,并添加几行代码,目的是获得两个具有相同优先级的线程,它们将被命名为Sender1和Receiver。这些将用于展示消息队列服务的使用情况。之后,我们将添加第二个发送方,它将被命名为Sender2,提高Receiver线程的优先级,并使用同一队列发送2条消息。这是最后的演示演示:

2.了解功能:

UINT tx_queue_create(tx_queue*queue_ptr、CHAR*name_ptr、UINT message_size、VOID*queue_start、ULONG queue_size);
此服务创建一个消息队列,通常用于线程间通信。消息总数是根据指定的消息大小和队列中的字节总数计算得出的
参数:
  • queue_ptr:指向消息队列控制块的指针。
  • name_ptr:指向消息队列名称的指针。
  • message_size:指定队列中每条消息的大小。消息大小从一个32位字到十六个32位词不等。有效的消息大小选项是从1到16的数值,包括1到16。
  • queue_start:消息队列的起始地址。起始地址必须与ULONG数据类型的大小对齐。
  • queue_size:消息队列可用的字节总数。
UINT tx_queue_receive(tx_queue*queue_ptr,VOID*destination_ptr,ULONG wait_option);
此服务从指定的消息队列中检索消息。检索到的消息是复制的从队列进入目的指针指定的内存区域。然后将该消息从队列中删除。
参数:
 
  • 队列_ptr:
    指向以前创建的消息队列的指针。
  • 目的地_ptr:
    复制邮件的位置。
  • 等待选项(_O):
    定义消息队列为空时服务的行为。等待选项定义如下:
    • *TX_NO_WAIT:(0x00000000)-无论是否成功,选择TX_NO_ WAIT都会立即从该服务返回。如果服务是从非线程调用的,那么这是唯一有效的选项;例如,初始化、定时器或ISR。
    • TX_WAIT_FOREVER(0xFFFFFFFF)-选择TX_WAIT_FOREVER会导致调用线程无限期挂起,直到消息可用。
    • timeout value(0x00000001到0xFFFFFFFE)-选择一个数字值(1-0xFFFFFFFE。
UINT tx_queue_send(tx_queue*queue_ptr,VOID*source_ptr,ULONG wait_option);
此服务向指定的消息队列发送消息。发送的消息将从源指针指定的内存区域复制到队列中。
参数:
  • 队列_ptr:
    指向以前创建的消息队列的指针。
  • 来源_ptr:
    指向消息的指针。
  • 等待选项(_O):
    定义消息队列已满时服务的行为。等待选项定义如下:
    • *TX_NO_WAIT:(0x00000000)-无论是否成功,选择TX_NO_ WAIT都会立即从该服务返回。如果服务是从非线程调用的,那么这是唯一有效的选项;例如,初始化、定时器或ISR。
    • TX_WAIT_FOREVER(0xFFFFFFFF)-选择TX_WAIT_FOREVER会导致调用线程无限期挂起,直到队列中有空间为止。
    • timeout value(0x00000001到0xFFFFFFFE)-选择一个数字值(1-0xFFFFFFFE。

值得一提的是,ThreadX还包括一个名为tx_queue_send_notify的服务。此服务注册一个通知回调函数,每当消息被发送到指定的队列时都会调用该函数。通知回调的处理由应用程序定义。
在里面
第2部分我们将逐步介绍从头开始创建项目,并使用2个线程进行简单的队列传输。
在里面
第3部分我们将解释如何添加Sender 2线程并评估行为。