首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

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

2012-09-25 
嵌入式操作系统内核原理和开发(消息队列)【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxin

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


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】
  

     消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以把自己pend到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。
  
      首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的,
RAW_U16 raw_queue_flush(RAW_QUEUE  *p_q)  {  LIST *block_list_head;    RAW_SR_ALLOC();    RAW_TASK_OBJ *block_task;    #if (RAW_QUEUE_FUNCTION_CHECK > 0)    if (p_q == 0) {    return RAW_NULL_OBJECT;  }    #endif    block_list_head = &p_q->common_block_obj.block_list;    RAW_CRITICAL_ENTER();    /*if queue is full and task is blocked on this queue, then wake all the task*/  if (p_q->msg_q.current_numbers >= p_q->msg_q.size) {  while (!is_list_empty(block_list_head)) {  block_task = list_entry(block_list_head->next, RAW_TASK_OBJ, task_list);  raw_wake_object(block_task);  block_task->block_status = RAW_B_ABORT;    }    p_q->msg_q.blocked_send_task_numbers = 0;  }          RAW_CRITICAL_EXIT();     raw_sched();    return RAW_SUCCESS;  }  #endif      #if (CONFIG_RAW_QUEUE_DELETE > 0)  RAW_U16 raw_queue_delete(RAW_QUEUE *p_q)  {  LIST  *block_list_head;    RAW_SR_ALLOC();    #if (RAW_QUEUE_FUNCTION_CHECK > 0)    if (p_q == 0) {    return RAW_NULL_OBJECT;  }    #endif    block_list_head = &p_q->common_block_obj.block_list;    RAW_CRITICAL_ENTER();    /*All task blocked on this queue is waken up*/  while (!is_list_empty(block_list_head))  {  delete_pend_obj(list_entry(block_list_head->next, RAW_TASK_OBJ, task_list));  }                                 RAW_CRITICAL_EXIT();    raw_sched();     return RAW_SUCCESS;    }  #endif 
     从代码据结构上也看得出来,两个函数的处理逻辑十分相像,所以可以放在一起研究一下,
     (1)判断参数合法性;
     (2)唤醒等待线程,这里消息清除函数唤醒的是发送线程,而消息删除函数唤醒的所有线程;
     (3)调用系统调度函数,切换到其他线程继续运行;
     (4)当前线程再次获得运行的机会,函数返回,一切ok搞定。
 
 



热点排行