rtems;:消息与消息队列管理器
RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
%A 14.1: 介绍
%A
%A 消息管理器提供任务间通信和使用 RTEMS 消息队列同步的能力。由消息管理器提供的函数是:
%A
%A rtems_message_queue_create- 创建一个消息队列
%A
%A rtems_message_queue_ident- 获取消息队列的 ID标识
%A
%A rtems_message_queue_delete- 删除一个消息队列
%A
%A rtems_message_queue_send- 将消息放入消息队列的尾部
%A
%A rtems_message_queue_urgent- 将消息放入消息队列的前面
%A
%A rtems_message_queue_broadcast- 对一个队列广播多个个消息
%A
%A rtems_message_queue_receive- 接受来自消息队列的消息
%A
%A rtems_message_queue_get_number_pending- 获取队列上的消息个数
%A
%A rtems_message_queue_flush- 清空消息队列上的所有消息
%A 14.2: 背景知识
%A 14.2.1 : 消息
%A
%A 消息是一个可变长度缓冲区,用于存储任务间通信的信息。 消息的长度和信息是用户定义的,可以是是真实的数据,指针, 或为空。
%A 14.2.2 : 消息队列
%A
%A 消息队列允许在任务或者ISR之间传递信息。消息队列能包含零个或者多个消息。通常,任务使用 rtems_message_queue_send 函数按照的 FIFO次序收发消息。此外,rtems_message_queue_urgent 函数可以将消息放在队首。
%A
%A 任务间可以通过消息队列实现任务间的同步。任务等待消息的方式有轮询和死等两种。
%A
%A 消息的最大长度在消息队列中定义。
%A 14.2.3 : 消息队列属性集合
%A
%A 和RTEMS其他对象相同,消息队列属性也是用属性分量构造的:
%A
%A RTEMS_FIFO- 任务按照 FIFO 等候 (默认)
%A
%A RTEMS_PRIORITY- 任务按照优先级等候
%A
%A RTEMS_LOCAL- 本地消息队列 (默认)
%A
%A RTEMS_GLOBAL- 全局消息队列
%A
%A 属性 RTEMS_DEFAULT_ATTRIBUTES 用于代表系统默认属性。
%A
%A 下面是构造attribute_set参数的例子:
%A
%A 如果需要创建一个本地消息队列,获取消息的任务按照优先级排序。 那么rtems_message_queue_create函数的attribute_set参数可以是 RTEMS_PRIORITY 或者 RTEMS_LOCAL|RTEMS_PRIORITY 。如果构建全局的按照优先级排序的消息队列,那么attribute_set参数就是 RTEMS_GLOBAL|RTEMS_PRIORITY 。
%A 14.2.4 : MESSAGE_QUEUE_RECEIVE选项
%A
%A rtems_message_queue_receive函数的接受选项可以是:
%A
%A RTEMS_WAIT- 任务将会等候一个消息 (默认)
%A
%A RTEMS_NO_WAIT- 任务不等候,直接返回
%A
%A 可以使用RTEMS_DEFAULT_OPTIONS表示缺省的选项。
%A 14.3 消息队列操作
%A 14.3: 操作
%A
%A 1.
%A 创造一个消息队列
%A 2.
%A 获得消息队列 ID标识
%A 3.
%A 从队列中接收消息
%A 4.
%A 向队列发送消息
%A 5.
%A 广播消息
%A 6.
%A 删除消息队列
%A
%A 14.3.1 : 创造消息队列
%A
%A rtems_message_queue_create 函数用来创建一个用户命名的消息队列。用户定义消息最大长度和消息队列的长度。用户可以指定等待消息的任务排序方法(FIFO或者优先级排序)。创建队列后,RTEMS从空闲链表中为队列分配队列控制块(QCB)用于维护队列信息,同时也会创建消息队列 ID标识。
%A
%A 对于全局消息队列,最长的消息长度被MPCI限制。
%A 14.3.2 : 获得消息排队 ID标识
%A
%A 当一个消息队列创建时,RTEMS 产生一个唯一的消息队列 ID标识。消息队列 ID标识可使用二种方法获得。 首先, rtems_message_queue_create 函数的参数返回,其次,使用 rtems_message_queue_ident 函数获取。
%A 14.3.3 : 获取消息
%A
%A rtems_message_queue_receive 函数从指定的消息队列获取一个消息。如果队列中至少有一个消息,那么该函数会从队列中摘除该消息,并且将信息内容拷贝到任务的缓存区中。如果队列中没有消息,那么如果设置了 RTEMS_NO_WAIT,函数可以返回错误代码;缺省状态,函数会死等。
%A
%A 如果任务死等,那么他就会进入消息队列的等待队列中,等待队列中排序方式可以是FIFO也可以是优先级排序。
%A 14.3.4 : 发送消息
%A
%A 任务使用rtems_message_queue_send 和 rtems_message_queue_urgent 函数向消息队列发送消息。如果消息队列本来就是空的,而等待那么两个函数效果相同。等待队列中第一个任务将会获取消息,变成就绪状态。
%A
%A 如果消息队列中有消息,rtems_message_queue_send 把消息放在消息队列的后面而 rtems_message_queue_urgent 把消息放在队列的前面。 如果消息队列满了,两个函数都不能继续向队列中放消息。
%A 14.3.5 : 消息广播
%A
%A rtems_message_queue_broadcast函数将会向等待队列上的每个任务发送消息,该过程是以原子操作的方式进行的。消息内容将会复制到每个等待任务的消息缓冲区,并且解除阻塞。函数返回了接收到广播的任务数目。
%A 14.3.6 : 删除消息排队
%A
%A rtems_message_queue_delete 函数删除消息队列而且释放它的控制块以及内存资源。任何知道消息队列ID标识的本地任务都可以删除队列。该函数执行后,所有消息队列上的等待任务都会变成就绪态,他们调用的消息获取函数都会返回对应的错误代码。此后对消息ID的引用也会返回错误。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。