SylixOS高精度时钟分析
2017-10-25 17:37
316 查看
1.Tick工作原理简介
Tick工作原理其实就是硬件定时器的工作原理,1个系统tick就代表一个定时器硬件中断。定时器的工作原理很简单,就是内部有一个递减的计数器,当减到0时产生一个中断,如图 1-1所示:图 1-1定时器工作原理
假设定时器模块的输入频率是1MHz,系统定义的1S内tick数是100,也就是100Hz,可以计算出递减计数器要设置的值为1MHz/100Hz=10000。可以看出递减计数器相当于一个分频器,输入端每来一个脉冲,其值就减去1,当减到0时产生一个中断,同时其值自动重载成10000,如此循环下去。
2.系统获取时间操作
系统获取时间相关接口是基于tick来工作的,但是这是有误差的,如图 2-1所示:图 2-1系统获取时间
虚线表示下一个tick中断还未产生,如果此时来获取时间,获取到的时间只是之前tick累计的时间。假设tick中断产生时刻和获取时间那一时刻之间的跨度是4ms,那么获取的时间就有4ms的误差,高精度时钟就是为了消除这种误差而诞生的。
3.高精度时钟原理
3.1基本原理
上述误差产生的根本原因是没有将tick中断产生时刻和获取时间那一时刻之间的跨度更新到时间里去,如果计算出这段时间并加到获取的时间里去就可以校正获取的时间了。结合图 1-1和图 2-1,基本的校正原理如下所述:1个tick时间等价于递减计数器的初始值,假设是10000,也就是说递减10000次相当于过了一个tick时间
用1000 * 1000 * 1000 / 10000得到递减一次的时间,单位是ns
用计数器初始值减去获取时间那一时刻计数器中的值,就得到了获取时间时刻计数器已经递减的次数
用递减一次的时间 *递减的次数,就得到tick中断产生时刻和获取时间那一时刻之间的时间跨度
3.2特殊情况
当系统是多核时,系统产生一个由CPU0来处理的tick中断,当CPU0还没有更新整个系统的tick数时,这时CPU1来获取时间,按照基本原理的计算之后还要加上一个tick的时间才是正确的。
4.代码展示
程序清单 4-1VOID bspTickHighResolution (struct timespec *ptv){REGISTER UINT32 uiCntCur, uiDone;uiCntCur = (UINT32)timerGetCnt(4);uiDone = GuiFullCnt - uiCntCur;
/**检查是否有 TICK中断请求*/if (rSRCPND & BIT_TIMER4) {/**这里由于 TICK没有及时更新,所以需要重新获取并且加上一个 TICK的时间*/uiCntCur = (UINT32)timerGetCnt(4);uiDone = GuiFullCnt - uiCntCur;
if (uiCntCur != 0) {uiDone += GuiFullCnt;}}
ptv->tv_nsec += (LONG)((Gui64NSecPerCnt7 * uiDone) >> 7);if (ptv->tv_nsec >= 1000000000) {ptv->tv_nsec -= 1000000000;ptv->tv_sec++;}}GuiFullCnt表示递减计数器的初始值,也就是产生1个tick时间的计数值;Gui64NSecPerCnt7表示递减一次的时间,但是这个时间被扩大了128倍,目的是为了提高计算精度
uiDone表示获取时间时刻计数器已经递减的次数,uiCntCur表示获取时间时刻计数器当前值
if (rSRCPND & BIT_TIMER4)用于特殊情况的判断,条件成立表示系统的tick数还没来得及更新,不成立表示系统的tick数已经被更新
当uiCntCur=0时,表示tick中断刚刚产生,这时uiDone就已经代表一个tick的计数值,所以就无需再加上一个tick的计数值了
最后将修正后的时间赋值给tv_nsec成员
相关文章推荐
- SylixOS高精度时钟分析
- SylixOS高精度时钟分析
- mips64高精度时钟引起ktime_get时间不准,导致饿狗故障原因分析【转】
- mips64高精度时钟引起ktime_get时间不准,导致饿狗故障原因分析
- mips64高精度时钟引起ktime_get时间不准,导致饿狗故障原因分析
- TMS320F28335 时钟分析3
- SylixOS 之epoll异常分析
- imx53 时钟dpll分析
- 关于高精度时钟
- S3C2440时钟分析
- Linux 时钟模块分析1
- Exynos4412时钟体系分析
- STM32的时钟系统分析
- 数字集成电路设计-10-关于采用两级触发器实现双时钟域信号同步方法的分析与验证
- TMS320F28335 时钟分析3
- contiki系统分析六:时钟
- tiny6410裸机实验第3章--------------系统时钟(原理图分析)
- linux中C语言获取高精度时钟gettimeofday函数
- SylixOS中AHCI驱动框架分析
- SylixOS中MTD调用底层接口流程分析