电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Linu系统时间不准问题分析

6页
  • 卖家[上传人]:公****
  • 文档编号:493698279
  • 上传时间:2024-02-07
  • 文档格式:DOCX
  • 文档大小:68.30KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、Linux系统时间不准问题分析CPU: PowerPC P1020RDB-PCOS: Linux-2.6.35问题:系统跑一段时间后,执行date和hwclock分别获取系统时钟和rtc时钟,出现差异, 差异为sysclk时间比rtc每分钟慢0.6秒。误差是比较人了。一. 问题分析1. 转换误差2. 时钟不稳定3. 时钟频率不对二. 结构分析卜面是CPU内部的核心时钟组成Note: The logic circuits shown depict functional relationships only; they do not represent physical implementation details.Figure 4-7. RTC and Core Timer Facilities Clocking Options如上,Core Time Base (TBU+TBL)是一个时钟计数器,里面存放的cycles随着CCB Clock分 频出来的时钟一直递增,cycles =系统时间怕乙DEC作为时钟事件的中断触发,按照时钟频率递减,减到0后产生Decrementer Event

      2、爭件, 可以在中断触发时由程序写入初始值,也可以设置为Auto-Reload DECAR的值。这一块还没 具体分析有什么用。上图中的RTC并没有使用。当前系统参数外部时钟 =66.0MCCB Clock= 400MSYSCLK= 800M从CCB 8分频出来给Core Time Base和DEC的时钟为50M接下来来看一下Linux系统内时间管理的内容clock source用于为linux内核提供一个时间基线,实际上就是一,个时间相关的结构体,如 果你用linux的date命令获取当前时间,内核会读取当前的clock source,转换并返回合适的 时间单位给用户空间。在硬件层,它通常实现为一个由固定时钟频率驱动的计数器(上面的 TimeBase),计数器只能单调地增加,直到溢出为止。系统启动时,内核通过硬件RTC获得 当前时间,并设置到计数器内,在这以后,内核通过选定的时钟源更新实时时间信息(墙上 时间),而不再读取RTC的时间。clock source可以有多个,系统启动时会检查所有clock source,然后将精度最好的时钟源设 为当前时钟源。每个时钟源的精度由驱动它的时钟频

      3、率决定,可以用如下命令查看clocksource:roott:home#cat/sys/devices/system/clocksource/clocksourceO/available_c locksource timebase roott:home#cat /sys/devices/system/clocksource/clocksourceO/curre nt_clocksource timebase看一下我们系统中timebase时钟源的定义time.c (arch/powerpc/kernel) static struct clocksource clocksource_timebase = .n ame .rating .flags.mask .shift .mult .read=“timebase 蔦= 400,=CLOCK_SOURCES_CONTINUOUS,=CLOCKSOURCE_MASK(64),= 22,=0,/* To be filled in */=timebase.read,.read = timebase_read,该函数就是读取TB的计数值 time

      4、base_read是通过汇编来实现的。static cycle_t timebase_read(struct clocksource *cs)return (cycle_t)get_tb();static inline u64 get_tb(void)return mftb();#define mftbu()(unsigned long rval; asm volatile(mftbu %0 : =r (rval); rval;)三. 具体分析1 转换误差 现在我们可以获取到cycles的计数值,也知道了 HZ=50M,那么根据公式很容易就得到系统 时间了。times_elapse = cycles_interval / frequency但是,因为内核中使用除法不太方便,所以将这个公式转换成了乘法与移位操作 times_elapse = cycles_interval * mult shift关于这个转换有个专门的内核函数,可以由frequency和精度值计算出mult和shift 后面再贴。从上面clocksource_tiniebase的定义己经看到shift=22 mult=O

      5、(后续计算)了,看一下mult 的计算。在clocksourcejnit函数中找到mult的初始化clock-mult = clocksouiXQ-hz2mult(tb_tickS-pQr_SQC” clock-shift);打印出来这个值为clock-mult =83886080现在shift和mult的值都有了,那我们来验证一下转换的误差就以 times_elapse = Is 为例,则 cyclesjnterval = frequency = 50000000按照公式:times_elapse = cyclesjnterval * mult shift (50000000*83886080)221000000000L= Is由此可见,将除法转换成乘法并未带来误差。2耐钟频率不对前面的计算都是按照CCB Clock 8分频50M来计算,但是这个50M是否准确?那就看看这个50M到底从哪来的timenit (/arch/powerpc/kernel/time.c)-ppc_md.calibrate_decr(); = generic_calibrate_decr(void)-get_

      6、freq(Htimebase-frequency: 1, &ppc_tb_freq)此处获取到的ppc_tb_freq = 50Mget_freq是从设备树中读取的,但实际的设备树中并没有timebase-frequency这个选项最终找到 uboot 中 fdt.c (arch/powerpc/cpu/mpc85xx)void ft_cpu_setup(void *blob, bd_t *bd)do_fixup_by_prop_u32(blob,device_type,/ cpu, 4,timebase-frequency, get_tbclk(), 1);由 do_fixup_by_prop_u32 将 get_tbclk()的值填入timebase-frequency,原来是 uboot 创建了 这个选项,继续查找50M的来历,看看get_tbclk函数今#ifndef CONFIG_SYS_FSL_TBCLK_DIV#define CONFIG_SYS_FSL_TBCLK_DIV 8# endifunsigned long get_tbclk (void)unsigned lo

      7、ng tbclk.div = CONFIG_SYS.FSL.TBCLK.DIV;return (gd-bus_clk + (tbclk.div 1) / tbclk_div;-get_clocksgd-bus_clk = sy s J nf o .f r e qSy st e m B u s;Tget_sysnfounsigned long sysclk = CONFIG.SYS_CLK_FREQ sysl nfo-freqSystemBus = sysclk;syslnfo-freqSystemBus *= (in_be32(&gur-rcwsr0j) 25) & Oxlf;上面代码可以看出get_tbclk()的原始值是从CONFIG_SYS_CLK_FREQ得来的 cp u_pl020.h(include/configs)中的定义#define CONFIG_SYS_CLK_FREQ 66666666而实际上外部时钟是66.0M,原来是配置文件指定错了。系统实际参数外部时钟 =66.0MCCB Clock=396MSYSCLK=792MDDR=396Mppc_tb_freq=49

      8、500000clock-mult=84733414clock-shift=22重新计算一下转换误差:times_elapse = cyclesjnterval * mult shift (49500000*84733414)22999999998L误差为每秒2ns,已经很小了附:内核中由除法转换成乘法的函数clocksource.c(kernel/time)/* clocks_calc_mult_shift - calculate mult/shift factors for scaled math of clocks* mult:pointer to mult variable* shift:pointer to shift variable* from: frequency to convert from* to:frequency to convert to* min sec: guaranteed run time conv ersion range in seconds* The function evaluates the shift/mult pair for the s

      9、caled math* operations of clocksources and clockevents* to and from are frequency values in HZ. For clock sources to is* NSEC_PER_SEC = 1GHz and from is the counter frequency. For clock* event to is the counter frequency and from is NSEC_PER_SEC* The minsec conversion range argument controls the time frame in* sec onds which must be covered by the run time conv ersio n with the* calculated mult and shift factors This guarantees that no 64bit* overflow happens when the input value of the conversion is* multiplied with the calculated mult factor. Larger ranges may* reduce the conversion accuracy by chosing smaller mult and sh

      《Linu系统时间不准问题分析》由会员公****分享,可在线阅读,更多相关《Linu系统时间不准问题分析》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.