Reading notes about mult and shift pairs
Author:
Yang
Honggang(Joseph) <eagle.rtlinux@gmail.com>
Kernel Version: Linux 3.0.4

===================================================================================================================

关于mult和shift这一对儿值,在内核代码中有X处存在。

clocksource,clock_event_device, timekeeper,cyclecounter, clock_data

下面,我们先了解一下它在clocksource中的应用。

clocks_calc_mult_shift()函数用来根据具体应用参数计算mult 和 shift值。我们从这里开始入手分析。

/* clocks_calc_mult_shift - calculatemult/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

* @maxsec: guaranteed runtimeconversion range in seconds

* The function evaluates theshift/mult pair for the scaled math

* operations of clocksources andclockevents.

* @to and @from are frequency valuesin HZ. For clock sources @to is

* NSEC_PER_SEC == 1GHz and @from isthe counter frequency. For clock

* event @to is the counter frequencyand @from is NSEC_PER_SEC.

* The @maxsec conversion rangeargument controls the time frame in

* seconds which must be covered by theruntime conversion with the

* calculated mult and shift factors.This guarantees that no 64bit

* overflow happens when the inputvalue of the conversion is

* multiplied with the calculated multfactor. Larger ranges may

* reduce the conversion accuracy bychosing smaller mult and shift factors.

*/

void

clocks_calc_mult_shift(u32 *mult, u32*shift, u32 from, u32 to, u32 maxsec)

{

u64 tmp;

u32 sft, sftacc= 32;

/*

* Calculate the shift factor whichis limiting the conversion

* range:

*/

tmp = ((u64)maxsec * from) >>32; [1]

while (tmp) { ……[*]

tmp >>=1;

sftacc--;

} [-1]

/*

* Find the conversion shift/multpair which has the best

* accuracy and fits the maxsecconversion range:

*/

for (sft = 32; sft > 0; sft--){[2]

tmp = (u64) to << sft;

tmp += from / 2;

do_div(tmp, from);

if ((tmp >> sftacc) ==0)[3]

break;

}

*mult = tmp;

*shift = sft;

}

在分析这段代码的原理之前,先看如下的关系式。

假设时钟频率为freq,那么时钟周期为1/freq秒,即 1/freq * NSEC_PER_SEC 纳秒。

cyc个时钟的ns数为,

ns = cyc *(NSEC_PER_SEC / freq) ……[a]

实际计算时,由于内核不支持浮点运算,只支持整数的除法运算,会带来很大精度损失,所以对上面式子进行变换,如下

ns = (cyc * ((NSEC_PER_SEC << N)/ freq) >> N ……[b]

mult = (NSEC_PER_SEC << N) / freq

N=shift

那么,

ns = (cyc * mult) >> shift ……[c]

下面开始分析上面代码:

下面分析,基于

clocks_calc_mult_shift(&cs->mult,&cs->shift, freq,

NSEC_PER_SEC, sec);

调用实例。

首先,[1]得到可能使用mult,shift来处理的最大的cyc

解释如下,

由式子[a],

因为maxsec为可以用来使用mult,shift转化的最大的时间范围(单位为:秒),这个是已知的。

有,

maxsec= CYC / freq

可以推出,

CYC= maxsec * freq

所以,我们的结论是[1]处代码的作用是得到可以使用mult,shift来转化的最大的cyc值。

[*]处的while循环用来得到CYC最多可以左移多少位,能够保证不出现64位溢出。

结果保存在sftacc中。//ns = ((cyc << N) * NSEC_PER_SEC/freq) >> N

然后,[2]找到能够得到最好转换精度的mult,shift值对。

shift值,在符合32位整数时,越大越好。

解释如下,

tmp = (to << sft) / from

= (NSEC_PER_SEC << sft) /freq

其实,tmp即为mult

但是,可以有多个mult,shift对,但是只有一对是最佳的。

由式子[c]可以找到转化精度好的标准,

如果, mult>> (sftacc+x), x为大于1的整数,那么,显然,cyc的最大限将会减小,

如果, mult>> (sftacc – x), x 为大于1的整数,那么,显然,cyc在数比较小的情况下,经过

[c]转换的结果将为0,那么会影响转换精度。

所以,好的标准就是,

能够满足(mult>> sftacc == 0)的最大mult定位最终的mult,对应的shift也可以得到。

mult 和 shift相关推荐

  1. Linux时间子系统 clocksource(计算mult和shift)

    Linux时间子系统 clocksource 原文地址:https://www.cnblogs.com/alantu2018/p/8448313.html 一.前言 和洋葱一样,软件也是有层次的,内核 ...

  2. linux cpu tsc,linux的TSC计算原理mult和shift-clocksource_cyc2ns

    TSC即(Time Stamp Counter或Time Source Cycles) 1 用法 /** * cyc2ns - converts clocksource cycles to nanos ...

  3. Linux内核之时间系统

    Linux内核之时间系统 1.Linux时间系统 (1)CMOS时钟 (2)系统时钟 (3)节拍数(jiffies) (4)墙上时间(xtime) 2.重要数据结构 (1)struct tk_read ...

  4. Linux时间子系统之三:时间的维护者:timekeeper

    专题文档汇总目录 Notes: 原文地址:Linux时间子系统之三:时间的维护者:timekeeper 本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法 ...

  5. linux下编写时钟代码,Linux时间子系统之一:clock source(时钟源)【转】(示例代码)...

    clock source用于为linux内核提供一个时间基线,如果你用linux的date命令获取当前时间,内核会读取当前的clock source,转换并返回合适的时间单位给用户空间.在硬件层,它通 ...

  6. 时钟源为什么会影响性能

    前几天帮同事看问题时,意外的发现了时钟源影响性能的 case, 比较典型,记录一下.网上也有人遇到过,参考虾皮的[Go] Time.Now函数CPU使用率异常[1] 和 Two frequently ...

  7. Linux的使用和认识实验,通过一个小实验认识Linux vDSO

    这里不再解释vDSO的概念,而直接谈其意义: vDSO类似一个信息公告板,用户可以直取所需,而无需为此办理任何手续. vDSO相当于内核直接暴露出来的一个C库,作为GLIBC的补充. - 类似gett ...

  8. linux时间子系统之,linux时间子系统(四)

    2.3 系统调用 timekeeper提供一系列的系统调用,使得用户空间可以获取想要的时间.下面简单的介绍一下clock_gettime系统调用 SYSCALL_DEFINE2(clock_getti ...

  9. linux内核启用64位除法,关于内核中的乘法和除法。

    关于内核中的乘法和除法. 作者:heziq 发布于:2015-5-6 22:02 前几天一直在看wowo的时间子系统,一直在思索mult和shift变量,为什么mult要尽量大,shift尽量小.这是 ...

最新文章

  1. 手动搭建的VGG16网络结构训练数据和使用ResNet50微调(迁移学习)训练数据对比(图像预测+前端页面显示)
  2. 开源人工智能使用卷积网格自动编码器生成3D面部
  3. SAP SD基础知识之文本确定(Text Determination)
  4. 在数据准备区中允许使用的数据结构有哪些, 各有什么优点?
  5. OpenWindow.document.write();
  6. 以30字符宽居中输出python字符串_Python3 字符串
  7. 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
  8. 研华外触发实验PCI1714板卡安装事项
  9. php医院数据库设计,检查我的数据库设计/ PHP / MySQL
  10. 一个连衣服都穿不整齐的人,代码也肯定写不整齐。
  11. noip2013提高组初赛(答案+选择题题目+个人分析)
  12. JavaScript 运算符优先级 - 汇总表
  13. 利用js文件获取视频文件详细信息 如帧速率、总比特率等
  14. itext7生成pdf页脚页码
  15. (重点)微服务核心研究之--编排
  16. 出版图书二维码,要如何制作呢?
  17. PCB LAYOUT高速信号走线指南
  18. 全球及中国生物敷料市场竞争态势与投资风险分析报告2022年
  19. tcpdump命令帮助和示例
  20. python中表示绝对值的函数_用于获取绝对值的用户定义函数

热门文章

  1. android 平面图app_Android 上超好用的图片处理 App
  2. Pr2020安装教程-软仓
  3. 网络模拟EVE-NG配置教程PPT
  4. 用javabean实现三角形的面积和周长以及判断是否构成三角形
  5. 重庆自考本科一般多久能拿证?
  6. python表格绘制斜线表头_在table表格中实现圆角效果
  7. 惠普HP LaserJet P4510 打印机驱动
  8. 干货分享 | 井通科技研发工程师蔡维佳:井通API及SDK开发实战
  9. 解决ssh远程连接服务器出现的中文乱码问题
  10. 荣誉系统排名是整个服务器,魔兽世界怀旧服:PVP荣誉系统简介,大元帅/高阶督军必备...