mult 和 shift
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相关推荐
- Linux时间子系统 clocksource(计算mult和shift)
Linux时间子系统 clocksource 原文地址:https://www.cnblogs.com/alantu2018/p/8448313.html 一.前言 和洋葱一样,软件也是有层次的,内核 ...
- linux cpu tsc,linux的TSC计算原理mult和shift-clocksource_cyc2ns
TSC即(Time Stamp Counter或Time Source Cycles) 1 用法 /** * cyc2ns - converts clocksource cycles to nanos ...
- Linux内核之时间系统
Linux内核之时间系统 1.Linux时间系统 (1)CMOS时钟 (2)系统时钟 (3)节拍数(jiffies) (4)墙上时间(xtime) 2.重要数据结构 (1)struct tk_read ...
- Linux时间子系统之三:时间的维护者:timekeeper
专题文档汇总目录 Notes: 原文地址:Linux时间子系统之三:时间的维护者:timekeeper 本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法 ...
- linux下编写时钟代码,Linux时间子系统之一:clock source(时钟源)【转】(示例代码)...
clock source用于为linux内核提供一个时间基线,如果你用linux的date命令获取当前时间,内核会读取当前的clock source,转换并返回合适的时间单位给用户空间.在硬件层,它通 ...
- 时钟源为什么会影响性能
前几天帮同事看问题时,意外的发现了时钟源影响性能的 case, 比较典型,记录一下.网上也有人遇到过,参考虾皮的[Go] Time.Now函数CPU使用率异常[1] 和 Two frequently ...
- Linux的使用和认识实验,通过一个小实验认识Linux vDSO
这里不再解释vDSO的概念,而直接谈其意义: vDSO类似一个信息公告板,用户可以直取所需,而无需为此办理任何手续. vDSO相当于内核直接暴露出来的一个C库,作为GLIBC的补充. - 类似gett ...
- linux时间子系统之,linux时间子系统(四)
2.3 系统调用 timekeeper提供一系列的系统调用,使得用户空间可以获取想要的时间.下面简单的介绍一下clock_gettime系统调用 SYSCALL_DEFINE2(clock_getti ...
- linux内核启用64位除法,关于内核中的乘法和除法。
关于内核中的乘法和除法. 作者:heziq 发布于:2015-5-6 22:02 前几天一直在看wowo的时间子系统,一直在思索mult和shift变量,为什么mult要尽量大,shift尽量小.这是 ...
最新文章
- 手动搭建的VGG16网络结构训练数据和使用ResNet50微调(迁移学习)训练数据对比(图像预测+前端页面显示)
- 开源人工智能使用卷积网格自动编码器生成3D面部
- SAP SD基础知识之文本确定(Text Determination)
- 在数据准备区中允许使用的数据结构有哪些, 各有什么优点?
- OpenWindow.document.write();
- 以30字符宽居中输出python字符串_Python3 字符串
- 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
- 研华外触发实验PCI1714板卡安装事项
- php医院数据库设计,检查我的数据库设计/ PHP / MySQL
- 一个连衣服都穿不整齐的人,代码也肯定写不整齐。
- noip2013提高组初赛(答案+选择题题目+个人分析)
- JavaScript 运算符优先级 - 汇总表
- 利用js文件获取视频文件详细信息 如帧速率、总比特率等
- itext7生成pdf页脚页码
- (重点)微服务核心研究之--编排
- 出版图书二维码,要如何制作呢?
- PCB LAYOUT高速信号走线指南
- 全球及中国生物敷料市场竞争态势与投资风险分析报告2022年
- tcpdump命令帮助和示例
- python中表示绝对值的函数_用于获取绝对值的用户定义函数
热门文章
- android 平面图app_Android 上超好用的图片处理 App
- Pr2020安装教程-软仓
- 网络模拟EVE-NG配置教程PPT
- 用javabean实现三角形的面积和周长以及判断是否构成三角形
- 重庆自考本科一般多久能拿证?
- python表格绘制斜线表头_在table表格中实现圆角效果
- 惠普HP LaserJet P4510 打印机驱动
- 干货分享 | 井通科技研发工程师蔡维佳:井通API及SDK开发实战
- 解决ssh远程连接服务器出现的中文乱码问题
- 荣誉系统排名是整个服务器,魔兽世界怀旧服:PVP荣誉系统简介,大元帅/高阶督军必备...