2015-10-15 110 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和 因子來降低轉換精度。