contiki系统分析六:时钟
contiki系统提供了一系列的时钟库,可以供contiki系统或者用户态的程序调用.
时钟库包括时钟到期检查.在调度时钟时低功耗的模块被唤醒,实时的任务调度.
定时器也可以让执行具体的事情过程中进入休眼状态.
contiki包抱一个时钟模块,但是有多个时钟模型:timer, stimer, ctimer, etimer, rtimer.不同的时钟有不同的作用.有的定时器运行时间长,但是间隔时间短,有的间隔时间长,但是运行时间短.有些能用于中断的上下文中(rtimer),但是有些不行.
定时器模块提供系统时钟,并且可以短时间的阻塞CPU.整个时钟库就是基于定时器来做的.
timer和stimer是提供了最简单的时钟操作,即检查时钟周期是否已经结束.应用程序需要从timer中读出状态,判断时钟是否过期.两种时钟最大的不同在于,tmiers是使用的系统时钟的ticks,而stimers是使用的秒,也就是stimers的一个时钟周期要长一些.和其它的时钟不同,这两个时钟能够在中断中安全使用.可以用到低层的驱动代码上.
etimer库主要提供的是事件时钟(event timer),在一个时钟周期后,contiki系统可以使用这个时钟做事件调度.主要用在contiki进程当系统的其它功能工作或休眼时,这个进程在等待一个时钟周期.
ctimer库主要用于回调时钟(callback timers),主要用一个时钟周期完了之后,去调度回调函数.当其它进程进入工作或者休眼状态时,这个进程仍然可以等待ctimer.由于ctimer本来就是当一个时钟周期结束时,去调用一个函数并且执行.ctimer运用的场合一般在没有明显的进程的地方,比如协议的执行时可以用到ctimer.ctimer可以通过rime协议栈去管理通讯是否超时的.
rtimer库主要是用来调度实时任务的.可以用到任何运行的contiki进程中,用时钟调度的方式去让实时任务运行.rtimer可用在对时间要求极严的的场合,比如无线电模块要在不延时的情况下开启或者关闭.
timer模块实现文件core/sys/timer.c,对应的头文件是用来外部调用的.
contiki的timer是用来提供定时器的基本设置重启,清零.或者是检查时间到期.应用程序必须去主动检查定时器是否过期,不能自动的的获得过期的消息.
timer模块用clock_time()来获得当前的系统时间.但是对于不同的MCU,读取定时器的方法会有所有同,所以这个函数对不同的MCU有一套不同的定义.
比如CC2530芯片,clock_time()的实现在cpu/cc253x/dev/clock.c中,是contiki的系统时钟.
timer结构体定义在core/sys/timer.h中,同样,其它的不同类弄的模块都有符合自身功能的一个结构体的定义.
struct rtimer { rtimer_clock_t time; rtimer_callback_t func; void *ptr;};
函数指针定义
typedef void (* rtimer_callback_t)(struct rtimer *t, void *ptr);
这个timer不再是一个链表,只是一个timer,去提供实时性的需求.
rtimer本来就是用做contiki的实时任务的.有自己的时钟模块.利用rtimer_time来得到当前的系统时钟.然后用RTIMER_SECOND表示每一分钟的tick数.这儿的时钟跟timer模块用的晶振不一样.这已经是CPU上的时钟了.在CC2530上,利用CLKCONCMD寄存器,设置成500KHz的时钟.由于分频置TICKSPD[2:0]设的32MHz,也就是说RTIMER_SECOND设置成 500KHz/32Hz 为15625U,定义在cpu/cc253x/rtimer-arch.h中.是属于体系结构相关的代码.
和contiki中的其它时钟库不一样.rtimer要保证实时任务的优先级,并且立即执行.主要是大部分的函数都不具备优先执行权,所以用rtimer去优先执行是可取的.如果放在中断安全的一些函数中例如process_poll()中执行的话,与其它非优先级的进程一起执行的话,容易产生冲突,造成非优线程只能异步去执行.
有两种类型的实时任务.一种是硬实时任务,一种是软实时任务.其中硬实时任务的优先级要高点,
rtimer与其它的timer不一样的是,它在平台这一层只是提供了三个接口.
rtimer_init, rtimer_set, rtimer_run_next这三个接口.但是这三个接口的实现是严重依赖于MCU的特性的.
其中主要调用了rtimer_arch_schedule,在cc2530中是把时钟的模式先捕获,捕获完了做输出比较.
rtimer的具体实现现在还是分析的相当明白.需要对cc2530的定时器模式和工作流程做好分析之后,才能回过头来看rtimer 具体作用.