免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2050 | 回复: 6
打印 上一主题 下一主题

[时钟管理] 请教一下关于时钟源的问题 [复制链接]

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-18 17:57 |只看该作者 |倒序浏览
struct clocksource结构体中的read成员用来从寄存器中读取cycle,使用下列的公式计算时间
t = (cycle * mult) >> shift;
clocksource结构体中还一个成员max_idle_ns,表示最长的可以不被更新的时间,超过这个时间之后在计算t的时候会发生溢出

我的问题是,随着时间的推移,cycle的值是不断增大的,mult和shift都是常熟,溢出与否和max_idle_ns这段时间内时间是否更新没有任何关系啊

懂这里的兄弟帮忙解答一下,多谢!!

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-06-18 20:19 |只看该作者
大热天的,跪求来一个传道解惑的朋友

论坛徽章:
0
3 [报告]
发表于 2014-06-19 01:37 |只看该作者
不太懂,等高手出来!

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 2014-06-19 09:40 |只看该作者
我可能没太说清楚,我直接把网上这段博客贴过来,我的困惑是是否溢出取决于read函数的返回值,cycle是随着时间不断增加的,并不是获取之后就清0的。


时钟源本身不会产生中断,要获得时钟源的当前计数,只能通过主动调用它的read回调函数来获得当前的计数值,注意这里只能获得计数值,也就是所谓的cycle,要获得相应的时间,必须要借助clocksource的mult和shift字段进行转换计算。
1.3  mult和shift字段
因为从clocksource中读到的值是一个cycle计数值,要转换为时间,我们必须要知道驱动clocksource的时钟频率F,一个简单的计算就可以完成:

    t = cycle/F;

可是clocksource并没有保存时钟的频率F,因为使用上面的公式进行计算,需要使用浮点运算,这在内核中是不允许的,因此,内核使用了另外一个变通的办法,根据时钟的频率和期望的精度,事先计算出两个辅助常数mult和shift,然后使用以下公式进行cycle和t的转换:

    t = (cycle * mult) >> shift;

只要我们保证:

    F = (1 << shift) / mult;

内核内部使用64位进行该转换计算:
[cpp] view plaincopy

    static inline s64 clocksource_cyc2ns(cycle_t cycles, u32 mult, u32 shift)  
    {  
            return ((u64) cycles * mult) >> shift;  
    }  

从转换精度考虑,mult的值是越大越好,但是为了计算过程不发生溢出,mult的值又不能取得过大。为此内核假设cycle计数值被转换后的最大时间值:10分钟(600秒),主要的考虑是CPU进入IDLE状态后,时间信息不会被更新,只要在10分钟内退出IDLE,clocksource的cycle计数值就可以被正确地转换为相应的时间,然后系统的时间信息可以被正确地更新。当然最后的结果不一定是10分钟,它由clocksource_max_deferment进行计算,并保存max_idle_ns字段中,tickless的代码要考虑这个值,以防止在NO_HZ配置环境下,系统保持IDLE状态的时间过长。在这样,由10分钟这个假设的时间值,我们可以推算出合适的mult和shift值。

论坛徽章:
0
5 [报告]
发表于 2014-06-20 08:28 |只看该作者
我的理解是,上面clocksource_cyc2ns的参数cycles是delta时间, 就是说,
假设clocksource的频率是1000HZ, 当前cycle是5000, 那么过了10秒后,cycles是5000 + 10000,
delta是10000,然后根据clocksource_cyc2ns(10000)算出纳秒数, 再把纳秒数加到xtime之类的墙上时间。

溢出指的是delta时间,即max_idle_ns就是根据clocksource_cyc2ns(maxt_clock_delta)算出来保证不溢出的时间。
不知道我说清楚没有

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
6 [报告]
发表于 2014-06-20 10:11 |只看该作者
没说清楚啊,再详细点
回复 5# chenyu105


   

论坛徽章:
0
7 [报告]
发表于 2014-06-22 17:50 |只看该作者
个人看法,max_idle_ns应该是指距离上一次读取clocksource的最大时间间隔,,clocksource对应一个硬件计数器,假如是32位的计数器,计数器的频率是50Mhz,那么计数器的计数值每过20ns加1,为了防止下一次无法读取出正确的计数值(这种情况是:假如上一次读的计数值是5000,计数值持续增加到32位计数器溢出,然后又从0开始计数,然后计数值又增加到了>=5000,如果这个时候进行下一次读 计数值,就不知道读取的计数值是从 5000直接加上来的,还是经过了计数器N次溢出后从0加上来的。)。。。就应该设置max_idle_ns = (2^32)*20ns =1.43分钟。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP