- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式操作系统核原理和开发(实时系统中的定时器)
嵌入式操作系统内核原理和开发(实时系统中的定时器)
关于定时器的内容,其实我们之前也讨论过,也书写过相应的代码,但是表达得比较晦涩,效率也比较低。所以我们这里重新再讲一下定时器的相关代码,看看嵌入式系统中的定时器是怎么实现的。在我们之前讨论线程延时的时候就使用hash的方法,将不同的线程归类到不同的延时队列当中,并且按照时间长短先后排列,这样在最短的时间内就可以寻找到最合适的线程了。本质上,线程延时和定时器的基本原理是一样的。唯一的区别就是,线程延时响应的优先级要高一些,而定时器一般由独立线程完成,rawos也是这么做的。
[cpp] view plaincopy
void timer_task void *pa RAW_U16 position; LIST *timer_head_ptr; LIST *iter; LIST *iter_temp; RAW_TIMER *timer_ptr; timer_sem.count 0; while 1 /*timer task will be blocked after call this function*/ raw_semaphore_get timer_sem, RAW_WAIT_FOREVER ; /*Disable the system schedule we do not need disable interrupt since nothing to do with interrupt*/ raw_disable_sche ; /*calculate which timer_head*/ raw_timer_count++; position RAW_U16 raw_timer_count TIMER_HEAD_NUMBERS - 1 ; timer_head_ptr timer_head[position]; iter timer_head_ptr- next; while RAW_TRUE /*if timer exits*/ if iter ! timer_head_ptr /*Must use iter_temp because iter may be remove later.*/ iter_temp iter- next; timer_ptr list_entry iter, RAW_TIMER, timer_list ; /*if timeout*/ if raw_timer_count timer_ptr- match /*remove form timer list*/ timer_list_remove timer_ptr ; /*if timer is reschedulable*/ if timer_ptr- reschedule_ticks /*Sort by remain time*/ timer_ptr- remain timer_ptr- reschedule_ticks; timer_ptr- match raw_timer_count + timer_ptr- remain; position RAW_U16 timer_ptr- match TIMER_HEAD_NUMBERS - 1 ; timer_ptr- to_head timer_head[position]; timer_list_priority_insert timer_head[position], timer_ptr ; /*Any way both condition need to call registered timer function*/ if timer_ptr- raw_timeout_function timer_ptr- raw_timeout_function timer_ptr- raw_timeout_param ; iter iter_temp; else break; /*exit because timer is not exit*/ else break; raw_enable_sche ; 由于基本原理和之前的线程延时是一样的,所以这里就不重复了。定时器的基本操作其实也不多,主要包括定时器创建、启动定时器、修改定时器、关闭定时器、删除定时器共五个基本函数,大家可以和我一起慢慢看过来。
[cpp] view plaincopy
RAW_U16 raw_timer_create RAW_TIMER *timer_ptr, RAW_U8 *name_ptr, RAW_VOID *expiration_function RAW_U32 ,
文档评论(0)