分类: 系统运维
2014-03-12 16:59:34
原文地址:Vxworks tick理解 作者:DQ_zhang
每个操作系统都有一个定时器timer,它不是指晶振。
CPU的指令周期,也不是晶振的频率分之一,而是指晶振经时钟发生器出来的频率。
操作系统总是基于某个时钟节拍来跑的。。。这个节拍的得到往往是通过硬件时钟中断得到,一般来说这个中断的优先级就比NMI低一点点,比其他的都高。。这个中断是共给操作系统用的,操作系统用他来进行调度啊什么的各种处理。
而在vxWorks中的一个重要参数就是SYS_CLK_RATE这个参数,也就是系统时钟率。。。。它的含义是:系统时钟滴嗒在一秒钟之内发生多少次。比如说,你定义为60,那么系统时钟在1s中将发生60次中断,两次之间的时间差就是1/60s。发生中断后,操作系统可以进行任务切换啊什么的。也就是说,如果你有一个任务被挂起,则至少要过1/60s后被激活---其它中断除外啊。又假如你设置为1000,那么系统时钟1秒发生1000次中断,两个时间差就是1ms。。。而函数sysClkRateGet就是用来获取系统时钟率的,如果你没有调用sysClkRateSet()函数对系统时钟率进行重新设置的话,其返回值应该是你在config.h中定义的SYS_CLK_RATE宏的值。而函数taskDelay()是以tick数目为单位的,比如taskDelay(1)是指将调用该函数的任务延迟1个tick。。那么时间是多少呢,根据你的SYS_CLK_RATE的值,其实际时间不同,但具体时间是1/SYS_CLK_RATE。。。假如SYS_CLK_RATE是1000,那么就是1ms。。如果是60那么就大约是16.67ms。。。通常来讲,vxWorks手册建议不要将时钟率设得太高,否则它就由硬实时变得趋向于软实时了。。因为过高的时钟率使得内核调度频繁进入,可能导致一些低优先级的硬件中断不能得到及时响应。当然,也不要太担心,在x86系统中完全可以设置为1000,这样比较好使,1个tick就是1ms,跟Windows一样。呵呵。。。。。