2015-10-15 84 views
2

我想在Linux中将基于CPU计数器寄存器值的循环转换为纳秒。如何将循环转换为纳秒

我可以看到Linux提供了相同的cyc_to_ns()/ clocksource_cyc2ns api。

这两个API都需要传递三个参数。

例如:

cyc_to_ns(U64 CYC,U32多重峰,U32移);

现在我确实有cyc(CPU计数器寄存器)值,但没有mult和shift的值。

任何人都可以指出,我应该如何计算这两个值(mult和shift)?

+0

''cyc_to_ns'是[静态](http://lxr.free-electrons.com/source/kernel/time/sched_clock.c?v=4.1#L91)用于Linux内核实现。除了使用它以外,你是如何做的? – Tsyvarev

+0

我需要从我的函数之一调用这个api的三个必需的参数。我现在可以与我有前两个论点,但我该如何计算第三个参数.i.e“shift”? –

+0

*您的功能将在哪里实施?在'kernel/time/sched_clock.c'文件中? 'cyc_to_ns'不能在这个文件之外使用。 – Tsyvarev

回答

0

clocksource提供辅助计算multshift值:

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

@至和@from在HZ频率值。对于时钟源@to是 NSEC_PER_SEC == 1GHz,@from是计数器频率。对于时钟 ,事件@to是计数器频率,@from是NSEC_PER_SEC。

@maxsec转换范围参数控制 秒内的时间范围,运行时转换必须用 计算的倍数和移位因子来覆盖。这保证当转换的输入值为 乘以计算的多因子时,不会发生64位的 溢出。较大的范围可能通过选择较小的mult和 因子来降低转换精度。