欢迎来到天天文库
浏览记录
ID:9338575
大小:94.50 KB
页数:6页
时间:2018-04-28
《嵌入式操作系统内核原理和开发(延时操作)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、软件英才网软件行业驰名招聘网站嵌入式操作系统内核原理和开发(延时操作)延时操作是操作系统中经常遇到的一种情形。延时的原因很多,有的时候是为了等待外设芯片处理结束,有的时候是为了暂时释放cpu的使用权,有的就是为了希望在一段时间获取资源,如果没法在单位时间内获取,放弃等待。但是不管怎么说,延时都是操作系统必不可少的一个工作。下面我们就看看延时是怎么实现的,[cpp]viewplaincopy1staticvoidtick_list_priority_insert(LIST*head,RAW_TASK_OBJ*task_ptr)2{
2、3RAW_U32val;45LIST*q,*start,*end;6RAW_TASK_OBJ*task_iter_temp;78start=end=head;9val=task_ptr->tick_remain;101112for(q=start->next;q!=end;q=q->next){1314task_iter_temp=list_entry(q,RAW_TASK_OBJ,tick_list);1516/*sortedbyremaintime*/1718if((task_iter_temp->tick_match-ra
3、w_tick_count)>val){19break;20}21}2223list_insert(q,&task_ptr->tick_list);242526}272829voidtick_list_insert(RAW_TASK_OBJ*task_ptr,RAW_U32time)3031{32LIST*tick_head_ptr;3334RAW_U16spoke;35有需要请联系我们软件英才网软件行业驰名招聘网站1if(time){23task_ptr->tick_match=raw_tick_count+time;4task
4、_ptr->tick_remain=time;56spoke=(RAW_U16)(task_ptr->tick_match&(TICK_HEAD_ARRAY-1));7tick_head_ptr=&tick_head[spoke];89tick_list_priority_insert(tick_head_ptr,task_ptr);1011task_ptr->tick_head=tick_head_ptr;1213}1415}16延时的代码其实不是很多,所以我在这里把最重要的两个函数给粘贴到这里了。因为每个线程都有可能延时,那
5、么怎么处理这些线程之间的关系就是我们需要做的事情了。我们看到了,我们直接用tick_match表示线程需要等待的那个时间点就可以了。当然,tick是不断增加的,我们可以把尾数相同的线程按照高低顺序排列在一起,这样在对应的tick到来的时候,就直接按照尾数查找就可以了,tick_list_priority_insert就是干了这么一件事情。那么,tick什么时候到期呢?到期又该怎么处理呢,我们接着往下看,[cpp]viewplaincopy17voidtick_list_update(void)18{1920LIST*tick_h
6、ead_ptr;21RAW_TASK_OBJ*p_tcb;22LIST*iter;23LIST*iter_temp;2425RAW_U16spoke;2627RAW_SR_ALLOC();2829RAW_CRITICAL_ENTER();30有需要请联系我们软件英才网软件行业驰名招聘网站1raw_tick_count++;2spoke=(RAW_U16)(raw_tick_count&(TICK_HEAD_ARRAY-1));3tick_head_ptr=&tick_head[spoke];4iter=tick_head_ptr
7、->next;56while(RAW_TRUE){78/*searchallthetimelistifpossible*/9if(iter!=tick_head_ptr){1011iter_temp=iter->next;12p_tcb=list_entry(iter,RAW_TASK_OBJ,tick_list);1314/*Sincetimelistissortedbyremaintime,sojustcamparetheabsolutetime*/15if(raw_tick_count==p_tcb->tick_match
8、){1617switch(p_tcb->task_state){18caseRAW_DLY:1920p_tcb->block_status=RAW_B_OK;21p_tcb->task_state=RAW_RDY;22tick_list_remove(p_tcb
此文档下载收益归作者所有