嵌入式操作系统内核原理和开发(消息队列).pdf
《嵌入式操作系统内核原理和开发(消息队列).pdf》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发(消息队列).pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 嵌入式操作系统内核原理和开发(消息队列)嵌入式操作系统内核原理和开发(消息队列)消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己 pend 到等待队列上;而如果此时没有消息,那么接受者也可以把自己 pend 到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现,而嵌入式系统常常
2、会默认提供这样的功能函数,我想主要的目的还是为了方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。首先,我们还是看看 rawos 上面关于消息队列的数据结构是怎么定义的,cpp view plaincopy 1.typedef struct RAW_MSG_Q 2.3.RAW_VOID *queue_start;/*Pointer to start of queue data */4.RAW_VOID *queue_end;/*Pointer to end of queue data */5.RAW_VOID *write;/*Pointer to wher
3、e next message will be inserted in the Q */6.RAW_VOID *read;/*Pointer to where next message will be extracted from the Q */7.RAW_U32 size;/*Size of queue(maximum number of entries)*/8.RAW_U32 current_numbers;/*Current number of entries in the queue */9.RAW_U16 blocked_send_task_numbers;/*number of b
4、locked send task numbers */10.RAW_U16 blocked_receive_task_numbers;/*number of blocked send task numbers */11.12.RAW_MSG_Q;13.14.typedef struct RAW_QUEUE 15.16.RAW_COMMON_BLOCK_OBJECT common_block_obj;17.RAW_MSG_Q msg_q;18.19.RAW_QUEUE;本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 上面的代码中有两段数据结构,第一段主要表示循环队列的
5、内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻塞的发送线程数据、阻塞的接受线程数目。而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外,也会分成初始化、发送消息、接受消息、清除消息、删除消息队列等几种操作函数。当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。说到这,我们还是看看消息队列是怎么初始化的,cpp view plainc
6、opy 1.RAW_U16 raw_queue_create(RAW_QUEUE *p_q,RAW_U8 *p_name,RAW_VOID*msg_start,RAW_U32 number)2.3.4.#if(RAW_QUEUE_FUNCTION_CHECK 0)5.6.if(p_q=0)7.8.return RAW_NULL_OBJECT;9.10.11.if(msg_start=0)12.13.return RAW_NULL_POINTER;14.15.16.if(number=0)17.18.return RAW_ZERO_NUMBER;19.20.21.#endif 22.23.lis
7、t_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;/*Initialize the queue */28.p_q-msg_q.queue_end =&msg_startnumber;29.p_q-msg_q.write =msg_start;30.p_q-msg_q.read =msg_start;本文由长春白癜风专科医院 http:/ 本文由
8、吉林白癜风医院 http:/ 31.p_q-msg_q.size =number;32.p_q-msg_q.current_numbers =0;33.p_q-msg_q.blocked_send_task_numbers=0;34.p_q-msg_q.blocked_receive_task_numbers=0;35.return RAW_SUCCESS;36.37.虽然相比较之前的互斥函数,消息队列的初始化内容好像多一些。但是大家如果对循环队列的知识比较了解的话,其实也不是很复杂的。我们看到,函数除了对通用阻塞结构进行初始化之外,就是对这些循环队列进行初始化。接着,我们就可以看看消息发送函
9、数是怎么样的,cpp view plaincopy 1.static RAW_U16 internal_msg_post(RAW_QUEUE*p_q,RAW_VOID*p_void,RAW_U8 opt_send_method,RAW_U8 opt_wake_all,RAW_U32 wait_option)2.3.RAW_U16 error_status;4.LIST*block_list_head;5.RAW_U8 block_way;6.7.RAW_SR_ALLOC();8.9.#if(RAW_QUEUE_FUNCTION_CHECK 0)10.11.if(raw_int_nesting)
10、12.13.if(wait_option!=RAW_NO_WAIT)14.15.return RAW_NOT_CALLED_BY_ISR;16.17.18.19.if(p_q=0)20.21.return RAW_NULL_OBJECT;22.23.24.if(p_void=0)25.26.return RAW_NULL_POINTER;27.28.29.#endif 本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 30.31.block_list_head=&p_q-common_block_obj.block_list;32.33.RAW_CRITICAL_EN
11、TER();34.35./*queue is full condition,there should be no received task blocked on queue object!*/36.if(p_q-msg_q.current_numbers=p_q-msg_q.size)37.38.if(wait_option =RAW_NO_WAIT)39.RAW_CRITICAL_EXIT();40.return RAW_MSG_MAX;41.42.43.else 44.45./*system is locked so task can not be blocked just return
12、 immediately*/46.if(raw_sched_lock)47.RAW_CRITICAL_EXIT();48.return RAW_SCHED_DISABLE;49.50./*queue is full and SEND_TO_FRONT method is not allowd*/51.if(opt_send_method=SEND_TO_FRONT)52.53.RAW_CRITICAL_EXIT();54.return RAW_QUEUE_FULL_OPT_ERROR;55.56.57.p_q-msg_q.blocked_send_task_numbers+;58.raw_ta
13、sk_active-msg=p_void;59.block_way=p_q-common_block_obj.block_way;60.p_q-common_block_obj.block_way=RAW_BLOCKED_WAY_FIFO;61./*there should be no blocked received task beacuse msg exits*/62.raw_pend_object(&p_q-common_block_obj,raw_task_active,wait_option);63.p_q-common_block_obj.block_way=block_way;6
14、4.65.RAW_CRITICAL_EXIT();66.67.raw_sched();68.69.error_status=block_state_post_process(raw_task_active,0);70.本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 71.return error_status;72.73.74.75.76.77./*Queue is not full here,there should be no blocked send task*/78./*If there is no blocked receive task*/79.if(i
15、s_list_empty(block_list_head)80.81.p_q-msg_q.current_numbers+;/*Update the nbr of entries in the queue */82.83.if(opt_send_method=SEND_TO_END)84.85.*p_q-msg_q.write+=p_void;86.87.if(p_q-msg_q.write=p_q-msg_q.queue_end)88.89.p_q-msg_q.write=p_q-msg_q.queue_start;90.91.92.93.94.95.else 96.97.if(p_q-ms
16、g_q.read=p_q-msg_q.queue_start)98.p_q-msg_q.read=p_q-msg_q.queue_end;99.100.101.p_q-msg_q.read-;102.*p_q-msg_q.read=p_void;/*Insert message into queue */103.104.105.106.RAW_CRITICAL_EXIT();107.108.return RAW_SUCCESS;109.110.111./*wake all the task blocked on this queue*/112.if(opt_wake_all)本文由长春白癜风专
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 操作系统 内核 原理 开发 消息 队列
限制150内