嵌入式操作系统内核原理和开发(消息队列)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
首先,我们还是看看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搞定。