其他分享
首页 > 其他分享> > ThreadX学习(9)——消息队列

ThreadX学习(9)——消息队列

作者:互联网

ThreadX学习(9)——消息队列

学习参考

消息队列

消息队列是ThreadX中线程间(以及线程和中断间)通信的主要手段。

tx_queue_send服务将消息放置在队列的后面,tx_queue_ receive服务将消息从队列的前面移除。

作用

为什么需要消息队列,而不直接使用全局数组?

在裸机编程时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。

相比消息队列,使用全局数组主要有如下四个问题:

消息流向

消息发送端将消息复制到队列中,然后队列将消息复制到消息接收端。

如果消息队列为空,消息接收端等待并挂起,那么当消息发送端准备发送时,该消息会绕过队列,直接复制到接收端。

队列缓存

队列用于缓冲消息的内存区域在队列创建期间指定。

它可以位于目标地址空间的任何位置。这是一个重要的特性,因为它为应用程序提供了相当大的灵活性。

例如,应用程序可以在高速RAM中定位一个非常重要的队列的内存区域,以提高性能。

线程挂起

当线程向一个满的队列发送消息,或者从一个空的队列接收消息时,会被挂起。

消息大小

创建队列时指定消息大小,消息大小为1-16个32位字(4-64B)。

也就是说,每次调用tx_queue_send函数,只能发送最多64B的消息。

因此,消息队列不适合传输大量数据。

队列大小

用户创建消息队列时,需要自己设置队列的总大小和每个消息的大小,以此来得出队列可容纳的消息数量。

可容纳消息数量 = 队列的总大小 / 每个消息大小

如果不能整除,则不会使用剩余字节。

API

1.tx_queue_create

TX_QUEUE queue_ptr;//先定义再创建

UINT  tx_queue_create(	TX_QUEUE *queue_ptr, 
						CHAR *name_ptr, 
						UINT message_size, 
						VOID *queue_start, 
						ULONG queue_size)

创建消息队列:

2.tx_queue_send

UINT  tx_queue_send(TX_QUEUE *queue_ptr, 
					VOID *source_ptr, 
					ULONG wait_option)

发送消息:

3.tx_queue_receive

UINT tx_queue_receive(TX_QUEUE *queue_ptr,
                      VOID *destination_ptr, 
                      ULONG wait_option);

接收消息:

4.tx_queue_info_get

UINT tx_queue_info_get( TX_QUEUE *queue_ptr, 
						CHAR **name,
						ULONG *enqueued, 
						ULONG *available_storage
						TX_THREAD **first_suspended, 
						ULONG *suspended_count,
						TX_QUEUE **next_queue);

获取消息队列信息:

参数输入TX_NULL(0x00)表示不需要该参数。

5.tx_queue_delete

UINT tx_queue_delete(TX_QUEUE *queue_ptr);

删除消息队列:

  • 所有挂起等待此队列的线程都将恢复,并给出TX_DELETED返回状态。

6.tx_queue_flush

UINT tx_queue_flush(TX_QUEUE *queue_ptr);

清空消息队列:

如果队列已满,则丢弃所有挂起线程的消息,然后恢复每个挂起的线程,返回状态表明消息发送成功。如果队列为空,则此服务不执行任何操作。

7.tx_queue_front_send

UINT tx_queue_front_send(TX_QUEUE *queue_ptr,
                         VOID *source_ptr, 
                         ULONG wait_option);

发送紧急消息插队到队首:

8.tx_queue_prioritize

UINT tx_queue_prioritize(TX_QUEUE *queue_ptr);

挂起列表中最高优先级线程提到队首:

9.tx_queue_send_notify

UINT  tx_queue_send_notify( TX_QUEUE *queue_ptr,
        					VOID (*queue_send_notify)(TX_QUEUE *));

发送通知回调:

当消息被发送到指定队列时将调用queue_send_notify函数(自定义)。发送通知回调不允许调用任何带有挂起选项的 API。

标签:queue,tx,TX,队列,学习,消息,ptr,ThreadX
来源: https://blog.csdn.net/weixin_43739110/article/details/118699772