linuxptp中输出的打印主要由clock_stats_display
完成。
该函数的执行频率为每2^(-logSyncItv)次同步执行一次,相当于1秒1次。
pr_info("rms %4.0f max %4.0f "
"freq %+6.0f +/- %3.0f "
"delay %5.0f +/- %3.0f",
offset_stats.rms, offset_stats.max_abs,
freq_stats.mean, freq_stats.stddev,
delay_stats.mean, delay_stats.stddev);
- offset_stats.rms为这一秒钟以来每次同步算出的clock_offset的root mean square(均方根,不仅能反映平均值,还能反映整组数据的离散程度)。单位为ns。
- offset_stats.max_abs为这一秒以来绝对值最大的clock_offset。
- freq_stats.mean为每次同步计算出的freq adjust合起来的平均值。单位为ppb。
- freq_stats.stddev为freq adjust的standard deviation(标准差,反映一组数据的离散程度)
- delay_stats.mean为算出的delay的平均值。单位为ns。
- delay_stats.stddev为算出的delay的标准差。
Linuxptp中计算freq adjust默认使用的函数是pi_sample
。
它接收这几个参数:
-
struct servo *servo
用于维护上下文信息的结构体 -
int64_t offset
计算出的clock offset,单位是ns -
uint64_t local_ts
即协议中的t2,单位是ns -
double weight
一般为1,无特殊目的则无需关注 -
enum servo_state *state
函数的输出值之一,表示clock servo的state
其输出值的单位为ppb(parts per billion,即10^-9)。
比如,log中freq的值为 -50000,意思就是将slave的freq调整了-0.005%。
freq adjust主要的计算思路是(offset2 - offset1) / (local_ts2 - local_ts1)。
其他涉及到PID控制的部分就不多解释了,保持文章的简单易读。
网友评论