欢迎来到天天文库
浏览记录
ID:8830659
大小:159.50 KB
页数:12页
时间:2018-04-08
《嵌入式操作系统内核原理和开发(消息队列)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、软件英才网软件行业驰名招聘网站嵌入式操作系统内核原理和开发(消息队列)消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以把自己pend到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是
2、为了方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的,[cpp]viewplaincopy1typedefstructRAW_MSG_Q{23RAW_VOID**queue_start;/*Pointertostartofqueuedata*/4RAW_VOID**queue_end;/*Pointertoendofqueuedata*/5RAW_VOID**write;/*Pointertowherenextmessagewillbeins
3、ertedintheQ*/6RAW_VOID**read;/*PointertowherenextmessagewillbeextractedfromtheQ*/7RAW_U32size;/*Sizeofqueue(maximumnumberofentries)*/8RAW_U32current_numbers;/*Currentnumberofentriesinthequeue*/9RAW_U16blocked_send_task_numbers;/*numberofblockedsendtasknumbers*/10RAW_U16block
4、ed_receive_task_numbers;/*numberofblockedsendtasknumbers*/1112}RAW_MSG_Q;1314typedefstructRAW_QUEUE15{16RAW_COMMON_BLOCK_OBJECTcommon_block_obj;17RAW_MSG_Qmsg_q;1819}RAW_QUEUE;有需要请联系我们软件英才网软件行业驰名招聘网站上面的代码中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻
5、塞的发送线程数据、阻塞的接受线程数目。而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外,也会分成初始化、发送消息、接受消息、清除消息、删除消息队列等几种操作函数。当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。说到这,我们还是看看消息队列是怎么初始化的,[cpp]viewplaincopy1RAW_U16raw_queue_crea
6、te(RAW_QUEUE*p_q,RAW_U8*p_name,RAW_VOID**msg_start,RAW_U32number)2{34#if(RAW_QUEUE_FUNCTION_CHECK>0)56if(p_q==0){78returnRAW_NULL_OBJECT;9}1011if(msg_start==0){1213returnRAW_NULL_POINTER;14}1516if(number==0){1718returnRAW_ZERO_NUMBER;19}2021#endif2223list_init(&p_q->common_b
7、lock_obj.block_list);2425p_q->common_block_obj.name=p_name;26p_q->common_block_obj.block_way=0;27p_q->msg_q.queue_start=msg_start;/*Initializethequeue*/有需要请联系我们软件英才网软件行业驰名招聘网站1p_q->msg_q.queue_end=&msg_start[number];2p_q->msg_q.write=msg_start;3p_q->msg_q.read=msg_start;4p_q
8、->msg_q.size=number;5p_q->msg_q.current_numbers=0;6p_q->msg_q.blocked_send_
此文档下载收益归作者所有