E-mail:zzssdd2@foxmail.com
一、应用简介消息队列是RTOS中常用的一种数据通信方式,常用于任务与任务之间或是中断与任务之间的数据传递。在裸机系统中我们通常会使用全局变量的方式进行数据传递,比如在事件发生后在中断中改变数据和设置标志,然后在主循环中轮询不同的标志是否生效来对全局数据执行不同的操作,执行完毕后清除相关标志。但是这种方式需要不断地轮询标志状态,使得CPU的利用率并不高。而使用RTOS的消息队列则具有任务阻塞机制,当没有需要处理的消息时任务挂起等待消息,此时其他任务占用CPU执行其他操作,当有消息放入队列时任务恢复运行进行消息接收和处理。这种消息处理机制相比裸机而言大大地提高了CPU利用率。
ThreadX的消息队列支持“消息置顶通知”功能,也就是可以将消息放在队列的最前面,使得任务可以及时处理某些紧急消息(RT-Thread的消息队列也有该功能)
ThreadX的消息队列可以传递任意长度的数据,因为它是采用传递数据指针的方式(uCOS也是采用这种引用传递的方式,而FreeRTOS和RT-Thread则支持传递整体数据内容。这两种方式各有优劣吧,指针传递方式优点是执行效率高,缺点是存数据的内存区域如果数据还未及时处理就被覆写了那么就会引发问题;整体数据传递方式优点是安全不需担心数据覆写致错,缺点是数据量大的话传递数据过程执行时间长导致效率低)
二、API简介下面介绍使用ThreadX的消息队列时常用的几个API函数。
1、创建消息队列描述
该服务用于创建消息队列。 消息总数是根据指定的消息大小和队列中的字节总数来计算的
如果在队列的内存区域中指定的字节总数不能被指定的消息大小均分,则不会使用该内存区域中的其余字节
参数
queue_ptr 指向消息队列控制块的指针
name_ptr 指向消息队列名称的指针
message_size 指定队列中每条消息的大小。 消息大小选项为1个32位字到16个32位字之间(包含)
queue_start 消息队列的起始地址。 起始地址必须与ULONG数据类型的大小对齐
queue_size 消息队列可用的字节总数
返回值
TX_SUCCESS (0x00) 创建成功
TX_QUEUE_ERROR (0x09) 无效的消息队列指针,指针为NULL或队列已创建
TX_PTR_ERROR (0x03) 消息队列的起始地址无效
TX_SIZE_ERROR (0x05) 消息队列大小无效
TX_CALLER_ERROR (0x13) 该服务的调用者无效
UINT tx_queue_create( TX_QUEUE *queue_ptr, CHAR *name_ptr, UINT message_size, VOID *queue_start, ULONG queue_size); 2、删除消息队列描述
此服务删除指定的消息队列。所有挂起等待此队列消息的线程都将恢复,并给出TX_DELETED返回状态
在删除队列之前,应用程序必须确保已完成(或禁用)此队列的所有send_notify回调。 此外,应用程序必须防止将来使用已删除的队列
应用程序还负责管理与队列相关联的内存区域,该内存区域在此服务完成后可用
参数
queue_ptr 指向先前创建的消息队列的指针
返回值
TX_SUCCESS (0x00) 删除成功
TX_QUEUE_ERROR (0x09) 消息队列指针无效
TX_CALLER_ERROR (0x13) 该服务的调用者无效
UINT tx_queue_delete(TX_QUEUE *queue_ptr); 3、清空消息队列描述
此服务删除存储在指定消息队列中的所有消息
如果队列已满,将丢弃所有挂起线程的消息,然后恢复每个挂起的线程,并返回一个指示消息发送成功的返回状态。如果队列为空,则此服务不执行任何操作。
参数
queue_ptr 指向先前创建的消息队列的指针
返回值
TX_SUCCESS (0x00) 操作成功
TX_QUEUE_ERROR (0x09) 消息队列指针无效
UINT tx_queue_flush(TX_QUEUE *queue_ptr); 4、消息置顶描述
该服务将消息发送到指定消息队列的最前面。 消息从源指针指定的存储区域复制到队列的最前面
参数
queue_ptr 指向消息队列控制块的指针
source_ptr 指向存放消息的指针
wait_option 定义消息队列已满时服务的行为
TX_NO_WAIT (0x00000000) - 无论是否成功都立即返回(用于非线程调用,例如中断里面)
TX_WAIT_FOREVER (0xFFFFFFFF) - 一直等待直到消息队列有空闲为止
返回值
TX_SUCCESS (0x00) 操作成功
TX_DELETED (0x01) 线程挂起时,消息队列被删除
TX_QUEUE_FULL (0x0B) 服务无法发送消息,因为在指定的等待时间内队列已满
TX_WAIT_ABORTED (0x1A) 被另一个线程、计时器或ISR中断给中止
TX_QUEUE_ERROR (0x09) 无效的消息队列指针
TX_PTR_ERROR (0x03) 消息的源指针无效