新闻  |   论坛  |   博客  |   在线研讨会
rtems;:消息函数
tongxin | 2009-04-12 20:45:56    阅读:1094   发布文章

RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
%A 14.4: 函数
%A 14.4.1 : MESSAGE_QUEUE_CREATE- 创建一个队列
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_create(
%A
%A rtems_name name,
%A
%A rtems_unsigned32 count,
%A
%A rtems_unsigned32 max_message_size,
%A
%A rtems_attribute attribute_set,
%A
%A rtems_id *id
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功地创建消息队列
%A
%A RTEMS_INVALID_NAME- 无效任务名字
%A
%A RTEMS_INVALID_ADDRESS- ID标识是空值
%A
%A RTEMS_INVALID_NUMBER- 无效的coun值
%A
%A RTEMS_INVALID_SIZE- 无效的消息大小max_message_size
%A
%A RTEMS_TOO_MANY- 已经创建了太多队列
%A
%A RTEMS_UNSATISFIED- 不能分配消息缓存
%A
%A RTEMS_MP_NOT_CONFIGURED- 没有配置的多重处理(用于全局消息创建)
%A
%A RTEMS_TOO_MANY- 已经有太多的全局对象
%A
%A
%A
%A 描述:
%A
%A 该函数在本地节点上创建一个用户命名的消息队列。为了控制和维护队列,RTEMS为队列分配了QCB 。同时为信息分配了内存空间,队列长度使用count初始化,max_message_size初始化消息的对大长度。*id是函数返回的ID标识。
%A
%A attribute_set设置了RTEMS_PRIORITY,那么等候消息的任务按照任务优先级排序。设置了RTEMS_FIFO时,队列按照FIFO排序。
%A
%A
%A
%A 注意:
%A
%A 除非是远端节点需要和消息队列交互,否则消息队列将会是本地的。这样可以减少系统开销。如果创建了全局的的消息队列,那么消息的名称和ID会被传输到系统中每个节点的全局对象表中。
%A
%A 对于全局消息队列,最大的消息长度在MPCI中定义。
%A
%A 全局对象的总数,包括消息队列,被 配置表中maximum_global_objects字段限制。
%A
%A
%A 14.4.2 : MESSAGE_QUEUE_IDENT-获取消息队列的 ID标识
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_ident(
%A
%A rtems_name name,
%A
%A rtems_unsigned32 node,
%A
%A rtems_id *id
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功地获得队列ID
%A
%A RTEMS_INVALID_ADDRESS- ID标识是空值
%A
%A RTEMS_INVALID_NAME- 找不到对应名字的消息队列
%A
%A RTEMS_INVALID_NODE- 无效的结点ID
%A
%A
%A
%A 描述:
%A
%A 该函数根据消息队列名称查找消息队列。如果名字不唯一,就返回找到的第一个队列ID。
%A
%A 注意:
%A
%A 如果node是RTEMS_SEARCH_ALL_NODES,将首先搜索本地节点,然后按照节点编号,搜索所有的结点。
%A
%A 如果node编号是一个有效的远端节点,并不会真正的在远端节点上进行搜索,只会搜索本地节点中的全局区域。
%A 14.4.3 : MESSAGE_QUEUE_DELETE- 删除一个消息队列
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_delete(
%A
%A rtems_id id
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 队列删除成功
%A
%A RTEMS_INVALID_ID- 无效的队列 ID标识
%A
%A RTEMS_ILLEGAL_ON_REMOTE_OBJECT- 不能够删除远端的队列
%A
%A
%A
%A 描述:
%A
%A 该函数删除ID标识指定的消息队列。该函数将解除所有消息队列上的阻塞任务的阻塞状态,并且返回一个表明队列被删除的状态码。如果没有任务等候,但是队列包含消息,那么函数将丢弃这些消息并且释放内存。此外QCB也会被释放。
%A
%A 注意:
%A
%A 如果调用者允许抢占,而且队列删除后有高优先级的任务就绪,那么会发生抢占。当然,如果高优先的任务不是本地任务,不会发生抢占。
%A
%A 删除的调用者不一定是队列的创建者,只要是知道队列ID的本地任务就可以了。
%A
%A 用来代表远端任务的代理在消息队列被删除时也会被释放。
%A 14.4.4 : MESSAGE_QUEUE_SEND 在消息队列的后面添加消息
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_send(
%A
%A rtems_id id,
%A
%A void *buffer,
%A
%A rtems_unsigned32 size
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 消息成功地送出
%A
%A RTEMS_INVALID_ID- 无效的队列 ID 标识
%A
%A RTEMS_INVALID_SIZE- 无效的消息 size 大小
%A
%A RTEMS_INVALID_ADDRESS- buffer 是空值
%A
%A RTEMS_UNSATISFIED- 消息超过了 buffer 容量
%A
%A RTEMS_TOO_MANY- 已经到达队列的存储界限
%A
%A
%A
%A 描述 :
%A
%A 该函数向 ID 标识指定的队列发送消息 , 消息体在 buffer 中定义 , 消息长度用 size 定义。如果有任务正在队列等候消息,那么该消息会被传递各该任务,并且解除任务阻塞。如果没有任务在队列中等候,那么消息会存放在队列的缓存器后端。
%A
%A 注意:
%A
%A 如果调用者支持抢占,那么他有可能被解除阻塞的任务抢占。
%A
%A 向远端节点传送消息会对远端结点产生一个发送消息的请求。
%A
%A 如果等待消息的任务不是本地任务,那么消息将会传递给对应的节点。然后释放任务的代理。
%A 14.4.5 : MESSAGE_QUEUE_URGENT 将消息放在一个队列的前面
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_urgent(
%A
%A rtems_id id,
%A
%A void *buffer,
%A
%A rtems_unsigned32 size
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 消息成功地送出
%A
%A RTEMS_INVALID_ID- 无效的队列 ID 标识
%A
%A RTEMS_INVALID_SIZE- 无效的消息 size 大小
%A
%A RTEMS_INVALID_ADDRESS- buffer 是空值
%A
%A RTEMS_UNSATISFIED- 消息超过了 buffer 容量
%A
%A RTEMS_TOO_MANY- 已经到达队列的存储界限
%A
%A
%A
%A 描述 :
%A
%A 该函数向 ID 标识指定的队列发送消息 , 消息体在 buffer 中定义 , 消息长度用 size 定义。如果有任务正在队列等候消息,那么该消息会被传递各该任务,并且解除任务阻塞。如果没有任务在队列中等候,那么消息会存放在队列的缓存器前端。
%A
%A
%A
%A 注意:
%A
%A 如果调用者支持抢占,那么他有可能被解除阻塞的任务抢占。
%A
%A 向远端节点传送消息会对远端结点产生一个发送消息的请求。
%A
%A 如果等待消息的任务不是本地任务,那么消息将会传递给对应的节点。然后释放任务的代理。
%A 14.4.6 : MESSAGE_QUEUE_BROADCAST- 向消息队列广播消息
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_broadcast(
%A
%A rtems_id id,
%A
%A void *buffer,
%A
%A rtems_unsigned32 size,
%A
%A rtems_unsigned32 *count
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 消息成功地送出
%A
%A RTEMS_INVALID_ID- 无效的队列 ID 标识
%A
%A RTEMS_INVALID_SIZE- 无效的消息 size 大小
%A
%A RTEMS_INVALID_ADDRESS- buffer 是空值
%A
%A RTEMS_UNSATISFIED- 消息超过了 buffer 容量
%A
%A
%A
%A 描述 :
%A
%A 该函数向消息队列上面所有等待的任务发送消息。count返回了接收到消息的任务数目。
%A
%A
%A
%A 注意:
%A
%A 如果调用者支持抢占,那么他有可能被解除阻塞的任务抢占。
%A
%A 函数的执行效率和等待的任务数目有关,但是在任务数目相同的情况下,它比 rtems_message_queue_send 效率高。
%A
%A 向远端节点广播消息会对远端结点产生一个发送广播消息的请求。
%A
%A 如果接收到广播消息的任务不是本地任务,那么消息将会传递给对应的节点。然后释放任务的代理。
%A
%A
%A 14.4.7 : MESSAGE_QUEUE_RECEIVE-接受来自一个队列的消息
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_receive(
%A
%A rtems_id id,
%A
%A void *buffer,
%A
%A rtems_unsigned32 *size,
%A
%A rtems_unsigned32 option_set,
%A
%A rtems_interval timeout
%A
%A
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功地收到消息
%A
%A RTEMS_INVALID_ID- 无效的队列 ID 标识
%A
%A RTEMS_INVALID_ADDRESS- 缓冲 buffer 是空值
%A
%A RTEMS_INVALID_ADDRESS- 计数 count 是空值
%A
%A RTEMS_UNSATISFIED- 队列是空的
%A
%A RTEMS_TIMEOUT- 等候消息时使用定时
%A
%A RTEMS_OBJECT_WAS_DELETED- 当等候的时候 , 队列被删除
%A
%A
%A
%A 描述:
%A
%A 该函数接受ID标识指定消息队列中一个消息。 option_set中RTEMS_WAIT和RTEMS_NO_WAIT选项告定义了函数未接收到消息时是否立即返回。如果队列中有消息,函数将消息复印到buffer,消息大小使用size返回。
%A
%A 如果使用RTEMS_NO_WAIT要求任务立刻返回,并且队列是空的,那么返回RTEMS_UNSATISFIED表明没有取得需要的消息。如果任务需要等待消息,那么将会按照FIFO(RTEMS_FIFO)或者优先级(RTEMS_PRIORITY )方式排序等待消息。一个指出这一个条件被退还的状态 [代]码。
%A
%A 一个选择在队列等候的任务也可以使用定时器来等待一定的时间。如果定时器设置为RTEMS_NO_TIMEOUT,那么任务将会循环等候。
%A
%A
%A
%A 注意:
%A
%A 如果从远程的消息队列上获取消息,那么会传递给对应的节点消息获取信息。如果远程队列中没有需要的消息,而同时任务需要等待该消息,就会在远端节点上创建代理,直到获取消息才会删除代理。如果需要定时服务,必须要有时钟支持。
%A
%A
%A 14.4.8 : MESSAGE_QUEUE_GET_NUMBER_PENDING- 在指定队列上获取消息个数
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_get_number_pending(
%A
%A rtems_id id,
%A
%A rtems_unsigned32 *count
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功获得多个消息
%A
%A RTEMS_INVALID_ADDRESS- 计数count是空值
%A
%A RTEMS_INVALID_ID- 无效队列ID标识
%A
%A
%A
%A 描述:
%A
%A 函数获取消息队列上的消息个数,如果队列为空,*count为0
%A
%A
%A
%A 注意:
%A
%A 如果消息队列是远端节点上的全局队列,那么需要向远端节点发送获取消息数目的请求。
%A
%A
%A 14.4.9 : MESSAGE_QUEUE_FLUSH- 清除消息队列上的所有消息
%A
%A 函数原型:
%A
%A rtems_status_code rtems_message_queue_flush(
%A
%A rtems_id id,
%A
%A rtems_unsigned32 *count
%A
%A );
%A
%A
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功地情况消息队列
%A
%A RTEMS_INVALID_ADDRESS- 计数count是空值
%A
%A RTEMS_INVALID_ID- 无效的队列 ID标识
%A
%A
%A
%A 描述:
%A
%A 该函数移除消息队列中所有的消息。count返回了被删除消息的数目。如果消息队列为空,那么*count是0。
%A
%A
%A
%A 注意:
%A
%A 如果消息队列是远端节点上的全局队列,那么需要向远端节点发送清空消息队列的请求。
%A
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客