如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
本文由长春白癜风专科医院http://tf463.com/收集,转载请注明出处嵌入式操作系统内核原理和开发(消息队列)消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以把自己pend到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的,[cpp]viewplaincopy1.typedefstructRAW_MSG_Q{2.3.RAW_VOID**queue_start;/*Pointertostartofqueuedata*/4.RAW_VOID**queue_end;/*Pointertoendofqueuedata*/5.RAW_VOID**write;/*PointertowherenextmessagewillbeinsertedintheQ*/6.RAW_VOID**read;/*PointertowherenextmessagewillbeextractedfromtheQ*/7.RAW_U32size;/*Sizeofqueue(maximumnumberofentries)*/8.RAW_U32current_numbers;/*Currentnumberofentriesinthequeue*/9.RAW_U16blocked_send_task_numbers;/*numberofblockedsendtasknumbers*/10.RAW_U16blocked_receive_task_numbers;/*numberofblockedsendtasknumbers*/11.12.}RAW_MSG_Q;13.14.typedefstructRAW_QUEUE15.{16.RAW_COMMON_BLOCK_OBJECTcommon_block_obj;17.RAW_MSG_Qmsg_q;18.19.}RAW_QUEUE;本文由吉林白癜风医院http://tf463.com/收集,转载请注明出处本文由长春白癜风专科医院http://tf463.com/收集,转载请注明出处上面的代码中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻塞的发送线程数据、阻塞的接受线程数目。而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外,也会分成初始化、发送消息、接受消息、清除消息、删除消息队列等几种操作函数。当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。说到这,我们还是看看消息队列是怎么初始化的,[cpp]viewplaincopy1.RAW_U16raw_queue_create(RAW_QUEUE*p_q,RAW_U8*p_name,RAW_VOID**msg_start,RAW_U32number)2.{3.4.#if(RAW_QUEUE_FUNCTION_CHECK>0)5.6.if(p_q==0){7.8.returnRAW_NULL_OBJECT;9.}10.11.if(msg_start==0){12.13.returnRAW_NULL_POINTER;14.}15.16.if(number==0){17.18.returnRAW_ZERO_NUMBER;19.}20.21.#endif22.23.list_init(&p_q->common_block_obj.block_list);24.25.p_q->common_block_obj.name=p_name;26.p_q->common_block_obj.block_way=0;27.p_q->msg_q.queue_start=msg_start;/*In