分类: 嵌入式
2015-07-21 22:12:22
1.2、 uCOS-II消息队列
与邮箱不同,当事件控制块OS_EVENT被用于消息队列时,域OSEventPtr指向一个循环队列的队列控制块(OS_Q)而不是指向一个消息。循环队列由队列控制块(OS_Q)进行维护,该数据结构详细信息如下:
uCOS-II 提供了7 个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函数。在这里只对OSQCreate()、OSQFlush()和OSQPostFront()进行说明。
OS_EVENT *OSQCreate (void **start, INT16U size)
创建一个消息队列,第一个参数是一个二重指针,该指针指向容纳各个消息的指针的指针数组的起始地址。在创建消息队列之前,首先需要定义一个指针数组,该数组的元素个数必须和消息队列最大消息数相等。然后把这个数组的起始地址传给OSQCreate。这里需要注意的是该数组必须是void类型。第二个参数是消息队列最大消息数,即指针数组的大小。
INT8U OSQFlush (OS_EVENT *pevent)
清空消息队列中所有的消息,重新开始使用。函数参数是指向需要清空消息队列的指针。
INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
OSQPostFront()函数和OSQPost()基本上是一样的,只是在插入新的消息到消息队列中时,使用OSQOut 作为指向下一个插入消息的单元的指针,而不是OSQIn。由于OSQPend()取出的消息是OSQPostFront()刚刚插入的,因此OSQPostFront()函数实现了一个LIFO队列。