欢迎来到天天文库
浏览记录
ID:9337034
大小:110.05 KB
页数:7页
时间:2018-04-28
《嵌入式操作系统内核原理和开发(实时系统中的定时器)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、软件英才网软件行业驰名招聘网站嵌入式操作系统内核原理和开发(实时系统中的定时器)关于定时器的内容,其实我们之前也讨论过,也书写过相应的代码,但是表达得比较晦涩,效率也比较低。所以我们这里重新再讲一下定时器的相关代码,看看嵌入式系统中的定时器是怎么实现的。在我们之前讨论线程延时的时候就使用hash的方法,将不同的线程归类到不同的延时队列当中,并且按照时间长短先后排列,这样在最短的时间内就可以寻找到最合适的线程了。本质上,线程延时和定时器的基本原理是一样的。唯一的区别就是,线程延时响应的优先级要高一些,而定时器一般由独立线程完成,rawo
2、s也是这么做的。[cpp]viewplaincopy1voidtimer_task(void*pa)2{3RAW_U16position;4LIST*timer_head_ptr;5LIST*iter;6LIST*iter_temp;7RAW_TIMER*timer_ptr;89timer_sem.count=0;1011while(1){1213/*timertaskwillbeblockedaftercallthisfunction*/14raw_semaphore_get(&timer_sem,RAW_WAIT_FOREVER)
3、;1516/*Disablethesystemschedulewedonotneeddisableinterruptsincenothingtodowithinterrupt*/17raw_disable_sche();1819/*calculatewhichtimer_head*/20raw_timer_count++;21position=(RAW_U16)(raw_timer_count&(TIMER_HEAD_NUMBERS-1));22timer_head_ptr=&timer_head[position];2324iter
4、=timer_head_ptr->next;2526while(RAW_TRUE){27/*iftimerexits*/28if(iter!=timer_head_ptr){29/*Mustuseiter_tempbecauseitermayberemovelater.*/30iter_temp=iter->next;有需要请联系我们软件英才网软件行业驰名招聘网站1timer_ptr=list_entry(iter,RAW_TIMER,timer_list);23/*iftimeout*/4if(raw_timer_count==ti
5、mer_ptr->match){56/*removeformtimerlist*/7timer_list_remove(timer_ptr);8/*iftimerisreschedulable*/9if(timer_ptr->reschedule_ticks){10/*Sortbyremaintime*/11timer_ptr->remain=timer_ptr->reschedule_ticks;1213timer_ptr->match=raw_timer_count+timer_ptr->remain;14position=(RA
6、W_U16)(timer_ptr->match&(TIMER_HEAD_NUMBERS-1));15timer_ptr->to_head=&timer_head[position];16timer_list_priority_insert(&timer_head[position],timer_ptr);1718}1920/*Anywaybothconditionneedtocallregisteredtimerfunction*/2122if(timer_ptr->raw_timeout_function){23timer_ptr-
7、>raw_timeout_function(timer_ptr->raw_timeout_param);2425}2627iter=iter_temp;28}2930else{3132break;3334}3536}37/*exitbecausetimerisnotexit*/38else{有需要请联系我们软件英才网软件行业驰名招聘网站12break;3}45}67raw_enable_sche();8}9}10由于基本原理和之前的线程延时是一样的,所以这里就不重复了。定时器的基本操作其实也不多,主要包括定时器创建、启动定时器、修改定
8、时器、关闭定时器、删除定时器共五个基本函数,大家可以和我一起慢慢看过来。[cpp]viewplaincopy11RAW_U16raw_timer_create(RAW_TIMER*timer_ptr,RAW_U8*nam
此文档下载收益归作者所有