嵌入式操作系统内核原理和开发(消息队列)

发表于:2012-9-27 09:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以把自己pend到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。

  首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的,

typedef struct RAW_MSG_Q {   
   
   RAW_VOID         **queue_start;            /* Pointer to start of queue data                              */
   RAW_VOID         **queue_end;              /* Pointer to end   of queue data                              */
   RAW_VOID         **write;               /* Pointer to where next message will be inserted  in   the Q  */
   RAW_VOID         **read;              /* Pointer to where next message will be extracted from the Q  */
   RAW_U32       size;             /* Size of queue (maximum number of entries)                   */
   RAW_U32       current_numbers;          /* Current number of entries in the queue                      */
   RAW_U16        blocked_send_task_numbers; /*number of blocked send task numbers                    */
   RAW_U16        blocked_receive_task_numbers; /*number of blocked send task numbers                    */
    
  } RAW_MSG_Q;
 
  typedef struct RAW_QUEUE
  {
   RAW_COMMON_BLOCK_OBJECT       common_block_obj;
   RAW_MSG_Q             msg_q;
   
  } RAW_QUEUE;

  上面的代码中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻塞的发送线程数据、阻塞的接受线程数目。而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。

  根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外,也会分成初始化、发送消息、接受消息、清除消息、删除消息队列等几种操作函数。当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。说到这,我们还是看看消息队列是怎么初始化的,

RAW_U16 raw_queue_create(RAW_QUEUE  *p_q, RAW_U8    *p_name, RAW_VOID **msg_start, RAW_U32  number)
  {
 
   #if (RAW_QUEUE_FUNCTION_CHECK > 0)
 
   if (p_q == 0) {
    
    return RAW_NULL_OBJECT;
   }
   
   if ( msg_start == 0) {
    
    return RAW_NULL_POINTER;
   }
   
   if (number == 0) {
    
    return RAW_ZERO_NUMBER;
   }
   
   #endif
 
   list_init(&p_q->common_block_obj.block_list);
                               
   p_q->common_block_obj.name = p_name;  
   p_q->common_block_obj.block_way = 0;
   p_q->msg_q.queue_start  =       msg_start;               /*      Initialize the queue                 */
   p_q->msg_q.queue_end             = &msg_start[number];
   p_q->msg_q.write              = msg_start;
   p_q->msg_q.read             = msg_start;
   p_q->msg_q.size            =  number;
   p_q->msg_q.current_numbers         = 0;
   p_q->msg_q.blocked_send_task_numbers = 0;
   p_q->msg_q.blocked_receive_task_numbers = 0;
   return RAW_SUCCESS;
  }
 

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号