嵌入式操作系统内核原理和开发(延时操作).doc_第1页
嵌入式操作系统内核原理和开发(延时操作).doc_第2页
嵌入式操作系统内核原理和开发(延时操作).doc_第3页
嵌入式操作系统内核原理和开发(延时操作).doc_第4页
嵌入式操作系统内核原理和开发(延时操作).doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件英才网 软件行业驰名招聘网站嵌入式操作系统内核原理和开发(延时操作) 延时操作是操作系统中经常遇到的一种情形。延时的原因很多,有的时候是为了等待外设芯片处理结束,有的时候是为了暂时释放cpu的使用权,有的就是为了希望在一段时间获取资源,如果没法在单位时间内获取,放弃等待。但是不管怎么说,延时都是操作系统必不可少的一个工作。下面我们就看看延时是怎么实现的,cpp view plaincopy1 static void tick_list_priority_insert(LIST *head, RAW_TASK_OBJ *task_ptr) 2 3 RAW_U32 val; 4 5 LIST *q,*start, *end; 6 RAW_TASK_OBJ *task_iter_temp; 7 8 start = end = head; 9 val = task_ptr-tick_remain; 10 11 12 for (q = start-next; q != end; q = q-next) 13 14 task_iter_temp = list_entry(q, RAW_TASK_OBJ, tick_list); 15 16 /*sorted by remain time*/ 17 18 if (task_iter_temp-tick_match - raw_tick_count) val) 19 break; 20 21 22 23 list_insert(q, &task_ptr-tick_list); 24 25 26 27 28 29 void tick_list_insert(RAW_TASK_OBJ *task_ptr, RAW_U32 time) 30 31 32 LIST *tick_head_ptr; 33 34 RAW_U16 spoke; 35 36 if (time) 37 38 task_ptr-tick_match = raw_tick_count + time; 39 task_ptr-tick_remain = time; 40 41 spoke = (RAW_U16)(task_ptr-tick_match & (TICK_HEAD_ARRAY - 1) ); 42 tick_head_ptr = &tick_headspoke; 43 44 tick_list_priority_insert(tick_head_ptr, task_ptr); 45 46 task_ptr-tick_head = tick_head_ptr; 47 48 49 50 51 延时的代码其实不是很多,所以我在这里把最重要的两个函数给粘贴到这里了。因为每个线程都有可能延时,那么怎么处理这些线程之间的关系就是我们需要做的事情了。我们看到了,我们直接用tick_match表示线程需要等待的那个时间点就可以了。当然,tick是不断增加的,我们可以把尾数相同的线程按照高低顺序排列在一起,这样在对应的tick到来的时候,就直接按照尾数查找就可以了,tick_list_priority_insert就是干了这么一件事情。 那么,tick什么时候到期呢?到期又该怎么处理呢,我们接着往下看,cpp view plaincopy52 void tick_list_update(void) 53 54 55 LIST *tick_head_ptr; 56 RAW_TASK_OBJ *p_tcb; 57 LIST *iter; 58 LIST *iter_temp; 59 60 RAW_U16 spoke; 61 62 RAW_SR_ALLOC(); 63 64 RAW_CRITICAL_ENTER(); 65 66 raw_tick_count+; 67 spoke = (RAW_U16)(raw_tick_count & (TICK_HEAD_ARRAY - 1) ); 68 tick_head_ptr = &tick_headspoke; 69 iter = tick_head_ptr-next; 70 71 while (RAW_TRUE) 72 73 /*search all the time list if possible*/ 74 if (iter != tick_head_ptr) 75 76 iter_temp = iter-next; 77 p_tcb = list_entry(iter, RAW_TASK_OBJ, tick_list); 78 79 /*Since time list is sorted by remain time, so just campare the absolute time*/ 80 if (raw_tick_count = p_tcb-tick_match) 81 82 switch (p_tcb-task_state) 83 case RAW_DLY: 84 85 p_tcb-block_status = RAW_B_OK; 86 p_tcb-task_state = RAW_RDY; 87 tick_list_remove(p_tcb); 88 add_ready_list(&raw_ready_queue, p_tcb); 89 break; 90 91 case RAW_PEND_TIMEOUT: 92 93 p_tcb-block_status = RAW_B_TIMEOUT; 94 p_tcb-task_state = RAW_RDY; 95 p_tcb-block_obj = 0; 96 tick_list_remove(p_tcb); 97 /*remove task on the block list because task is timeout*/ 98 list_delete(&p_tcb-task_list); 99 add_ready_list(&raw_ready_queue, p_tcb); 100 break; 101 102 103 case RAW_PEND_TIMEOUT_SUSPENDED: 104 105 p_tcb-block_status = RAW_B_TIMEOUT; 106 p_tcb-task_state = RAW_SUSPENDED; 107 p_tcb-block_obj = 0; 108 tick_list_remove(p_tcb); 109 /*remove task on the block list because task is timeout*/ 110 list_delete(&p_tcb-task_list); 111 break; 112 113 114 115 case RAW_DLY_SUSPENDED: 116 117 p_tcb-task_state = RAW_SUSPENDED; 118 p_tcb-block_status = RAW_B_OK; 119 tick_list_remove(p_tcb); 120 break; 121 122 default: 123 124 #if (CONFIG_RAW_ASSERT 0) 125 RAW_ASSERT(0); 126 #endif 127 128 break; 129 130 131 iter = iter_temp; 132 133 134 /*if current task time out absolute time is not equal current system time, just break because timer list is sorted*/ 135 else 136 137 break; 138 139 140 141 142 143 144 /*finish all the time list search */ 145 146 else 147 148 break; 149 150 151 152 153 RAW_CRITICAL_EXIT(); 154 155 这个函数是在时钟中断的时候被调用的,根据函数的先后顺序,看看函数实现了哪些功能, (1)自增raw_tick_count; (2)根据尾数获取tick队列的头指针; (3)开始循环迭代处理延时线程; a)如果没有没有延时线程,循环跳出; b)如果线程的终点tick和当前tick不匹配,跳出循环,因为tick都是排序好的,所以后面的tick肯定不满足要求; c)如果当前tick满足要求,根据线程状态进行处理,主要分为延时、阻塞超时、延时挂起、阻塞超时挂起四种状态; d)获取下一个延时线程,观察是否满足要求,如果是继续回到c,否则退出循环。 (4)函数返回,继续时钟中断的剩余操作。 最后,我们补充一下关于有限时间等待的知识。就像以前关于互斥操作的内容一样,其实某些情况下,我们是有时间限制的。一段时间没有获取资源,我们就不希望等待了,所以这里的延时操作还包括这部分的内容,我们看看阻塞函数的相关代码就明白了。cpp view plaincopy156 RAW_U16 raw_pend_object(RAW_COMMON_BLOCK_OBJECT *block_common_obj, RAW_TASK_OBJ *task_ptr, RAW_U32 timeout) 157 158 159 #if (CONFIG_RAW_ASSERT 0) 160 161 if (timeout = 0) 162 RAW_ASSERT(0); 163 164 165 #endif 166 167 task_ptr-block_obj = block_common_obj; 168 169 170 if (timeout = RAW_WAIT_FOREVER) 171 172 173 task_ptr-task_state = RAW_PEND; 174 175 176 /*task is blocked with timeout*/ 177 else 178 179 tick_list_insert(task_ptr,timeout); 180 181 task_ptr-task_state = RAW_PEND_TIMEOUT; 182 183 184 185 /*Remove from the ready list*/ 186 remove_ready_list(&raw_ready_queue, task_ptr); 187 188 if (block_common_obj-block_way = RAW_BLOCKED_WAY_FIFO) 189 190 list_insert(&block_common_obj-block_list, &task_ptr-task_list); 191 192 193

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论