2022年嵌入式操作系统内核原理和开发 .pdf
《2022年嵌入式操作系统内核原理和开发 .pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式操作系统内核原理和开发 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、软件英才网软件行业驰名招聘网站有需要请联系我们嵌入式操作系统内核原理和开发(消息队列)消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上, 这可以说这是用的最多的一种方法。通过消息队列, 无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道, 存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend 到等待队列上;而如果此时没有消息,那么接受者也可以把自己 pend 到等待队列上。当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现, 而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了方便用户, 让他
2、们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。首先,我们还是看看rawos 上面关于消息队列的数据结构是怎么定义的,typedefstruct 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 *
3、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_recei
4、ve_task_numbers; /*number of blocked send task numbers */ RAW_MSG_Q; typedefstruct RAW_QUEUE RAW_COMMON_BLOCK_OBJECT common_block_obj; RAW_MSG_Q msg_q; RAW_QUEUE; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 软件英才网软件行业驰名招聘网站有需要请联系我们上面的代码
5、中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻塞的发送线程数据、 阻塞的接受线程数目。而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外, 也会分成初始化、发送消息、 接受消息、 清除消息、 删除消息队列等几种操作函数。当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。说到这, 我们还是看看
6、消息队列是怎么初始化的,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.b
7、lock_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 */名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 软件英才网软件行业驰名招聘网站有需要请联系我们 p_q-msg_q.queue_end =
8、&msg_startnumber; 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; 虽然相比较之前的互斥函数,消息队列的初始化内容好像多一些。但是大家如果对循环队列的知识比较了解的话,其实也不是很复杂的。我们看到
9、, 函数除了对通用阻塞结构进行初始化之外, 就是对这些循环队列进行初始化。接着, 我们就可以看看消息发送函数是怎么样的,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) RAW_U16 error_status; LIST *block_list_head; RAW_U8 block_way; RAW_SR_ALLOC(); #if (RAW_QUEUE_FUNCTION_CHEC
10、K 0)if (raw_int_nesting) if (wait_option != RAW_NO_WAIT) return RAW_NOT_CALLED_BY_ISR; if (p_q = 0) return RAW_NULL_OBJECT; if (p_void = 0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 软件英才网软件行业驰名招聘网站有需要请联系我们return RAW_NULL_POINTER; #en
11、dif block_list_head = &p_q-common_block_obj.block_list; RAW_CRITICAL_ENTER(); /*queue is full condition, there should be no received task blocked on queue object!*/if (p_q-msg_q.current_numbers = p_q-msg_q.size) if (wait_option = RAW_NO_WAIT) RAW_CRITICAL_EXIT(); return RAW_MSG_MAX; else /*system is
12、 locked so task can not be blocked just return immediately*/if (raw_sched_lock) RAW_CRITICAL_EXIT(); return RAW_SCHED_DISABLE; /*queue is full and SEND_TO_FRONT method is not allowd*/if (opt_send_method = SEND_TO_FRONT) RAW_CRITICAL_EXIT(); return RAW_QUEUE_FULL_OPT_ERROR; p_q-msg_q.blocked_send_tas
13、k_numbers+; raw_task_active-msg = p_void; block_way = p_q-common_block_obj.block_way; p_q-common_block_obj.block_way = RAW_BLOCKED_WAY_FIFO; /*there should be no blocked received task beacuse msg exits*/ raw_pend_object(&p_q-common_block_obj, raw_task_active, wait_option); p_q-common_block_obj.block
14、_way = block_way; RAW_CRITICAL_EXIT(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 软件英才网软件行业驰名招聘网站有需要请联系我们 raw_sched(); error_status = block_state_post_process(raw_task_active, 0); return error_status; /*Queue is not full here, there s
15、hould be no blocked send task*/*If there is no blocked receive task*/if (is_list_empty(block_list_head) p_q-msg_q.current_numbers+; /* Update the nbr of entries in the queue */if (opt_send_method = SEND_TO_END) *p_q-msg_q.write+ = p_void; if (p_q-msg_q.write = p_q-msg_q.queue_end) p_q-msg_q.write =
16、p_q-msg_q.queue_start; else if (p_q-msg_q.read = p_q-msg_q.queue_start) p_q-msg_q.read = p_q-msg_q.queue_end; p_q-msg_q.read-; *p_q-msg_q.read = p_void; /* Insert message into queue */ RAW_CRITICAL_EXIT(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年嵌入式操作系统内核原理和开发 2022 嵌入式 操作系统 内核 原理 开发
限制150内