嵌入式操作系统内核原理和开发(延时操作)

上传人:wt****50 文档编号:33013481 上传时间:2018-02-13 格式:DOC 页数:6 大小:94.50KB
返回 下载 相关 举报
嵌入式操作系统内核原理和开发(延时操作)_第1页
第1页 / 共6页
嵌入式操作系统内核原理和开发(延时操作)_第2页
第2页 / 共6页
嵌入式操作系统内核原理和开发(延时操作)_第3页
第3页 / 共6页
嵌入式操作系统内核原理和开发(延时操作)_第4页
第4页 / 共6页
嵌入式操作系统内核原理和开发(延时操作)_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《嵌入式操作系统内核原理和开发(延时操作)》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发(延时操作)(6页珍藏版)》请在金锄头文库上搜索。

1、 软件英才网 软件行业驰名招聘网站有需要请联系我们嵌入式操作系统内核原理和开发(延时操作) 延时操作是操作系统中经常遇到的一种情形。延时的原因很多,有的时候是为了等待外设芯片处理结束,有的时候是为了暂时释放 cpu 的使用权,有的就是为了希望在一段时间获取资源,如果没法在单位时间内获取,放弃等待。但是不管怎么说,延时都是操作系统必不可少的一个工作。下面我们就看看延时是怎么实现的,cpp view plaincopy static void tick_list_priority_insert(LIST *head, RAW_TASK_OBJ *task_ptr) RAW_U32 val; LIS

2、T *q,*start, *end; RAW_TASK_OBJ *task_iter_temp; start = end = head; val = task_ptr-tick_remain; for (q = start-next; q != end; q = q-next) task_iter_temp = list_entry(q, RAW_TASK_OBJ, tick_list); /*sorted by remain time*/ if (task_iter_temp-tick_match - raw_tick_count) val) break; list_insert(q, vo

3、id tick_list_insert(RAW_TASK_OBJ *task_ptr, RAW_U32 time) LIST *tick_head_ptr; RAW_U16 spoke; if (time) 软件英才网 软件行业驰名招聘网站有需要请联系我们 task_ptr-tick_match = raw_tick_count + time; task_ptr-tick_remain = time; spoke = (RAW_U16)(task_ptr-tick_match tick_head_ptr = tick_list_priority_insert(tick_head_ptr, ta

4、sk_ptr); task_ptr-tick_head = tick_head_ptr; 延时的代码其实不是很多,所以我在这里把最重要的两个函数给粘贴到这里了。因为每个线程都有可能延时,那么怎么处理这些线程之间的关系就是我们需要做的事情了。我们看到了,我们直接用 tick_match 表示线程需要等待的那个时间点就可以了。当然, tick是不断增加的,我们可以把尾数相同的线程按照高低顺序排列在一起,这样在对应的 tick到来的时候,就直接按照尾数查找就可以了,tick_list_priority_insert 就是干了这么一件事情。那么,tick 什么时候到期呢?到期又该怎么处理呢,我们接着往

5、下看,cpp view plaincopy void tick_list_update(void) LIST *tick_head_ptr; RAW_TASK_OBJ *p_tcb; LIST *iter; LIST *iter_temp; RAW_U16 spoke; RAW_SR_ALLOC(); RAW_CRITICAL_ENTER(); 软件英才网 软件行业驰名招聘网站有需要请联系我们 raw_tick_count+; spoke = (RAW_U16)(raw_tick_count tick_head_ptr = iter = tick_head_ptr-next; while (R

6、AW_TRUE) /*search all the time list if possible*/ if (iter != tick_head_ptr) iter_temp = iter-next; p_tcb = list_entry(iter, RAW_TASK_OBJ, tick_list); /*Since time list is sorted by remain time, so just campare the absolute time*/ if (raw_tick_count = p_tcb-tick_match) switch (p_tcb-task_state) case

7、 RAW_DLY: p_tcb-block_status = RAW_B_OK; p_tcb-task_state = RAW_RDY; tick_list_remove(p_tcb); add_ready_list( break; case RAW_PEND_TIMEOUT: p_tcb-block_status = RAW_B_TIMEOUT; p_tcb-task_state = RAW_RDY; p_tcb-block_obj = 0; tick_list_remove(p_tcb); /*remove task on the block list because task is ti

8、meout*/ list_delete( add_ready_list( break; case RAW_PEND_TIMEOUT_SUSPENDED: p_tcb-block_status = RAW_B_TIMEOUT; p_tcb-task_state = RAW_SUSPENDED; 软件英才网 软件行业驰名招聘网站有需要请联系我们 p_tcb-block_obj = 0; tick_list_remove(p_tcb); /*remove task on the block list because task is timeout*/ list_delete( break; case RAW_DLY_SUSPENDED: p_tcb-task_state = RAW_SUSPENDED; p_tcb-block_status = RAW_B_OK; tick_list_remove(p_tcb); break; default: #if (CONFIG_RAW_ASSERT 0) RAW_ASSERT(0); #endif break;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 机械理论及资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号