最近在研究GPSD相关信息,查阅到GPSD可以与NTPD相配合实现高精度时间同步功能,因此才涉及到此主题。

目前手头用的是Ublox F9P模块,UART输出NEMA数据,另外一个GPIO输出1PPS脉冲

首先看一张时序图:

1. NEMA中包含有时间信息,一般是秒级别,也有部分带有毫秒

2. 1PPS即每秒输出一个脉冲,图中以高电平触发为例(没画下降沿),接收及处理1PPS脉冲的时间也在ns级别

3. 因为NEMA是通过串口发送和接收,而且一次NEMA数据量也有KB级别大小,处理时间远比1PPS时间长

4. 通过NEMA中的秒级时间和1PPS脉冲相配合,即可实现高精度时间同步(ns级:依据1PPS的响应时间)

具体时间同步实现,以Linux为例,常用组合方式为:kenel pps.ko,GPSD,chronyd或者NTPD

首先Kernel pps.ko:

当前kernel是支持pps处理的,因为我用的ublox的pps是接到gpio的,所以选择gpio方式

1. kernel timer client 是内核软件模拟的pps信号,用于测试

2. pps client using gpio 是以gpio作为pps信号源

pps-gpio.c源码实现也比较简单,主要通过注册gpio中断,当gpio电平变化时,记录当前系统运行时刻,然后post event到用户空间。

因为使用了外部GPIO,因此在使用该模块之前,需要在dts中指定相关的gpio引脚,compatible 为 "pps-gpio"

static const struct of_device_id pps_gpio_dt_ids[] = {{ .compatible = "pps-gpio", },{ /* sentinel */ }};

配置后编译启动,查阅dmesg

root@imx8qxpmek:~# dmesg |grep pps
[    0.708441] pps_core: LinuxPPS API ver. 1 registered
[    0.713357] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    1.737515] pps pps0: new PPS source ktimer
[    1.741727] pps pps0: ktimer PPS source registered
[    1.747556] pps pps1: new PPS source pps.-1
[    1.751804] pps pps1: Registered IRQ 115 as PPS source
[  236.866057] pps pps1: unsupported capabilities (2)

此处, PPS0为内核模拟的pps信号,pps1  ublox模块的pps 信号

在应用层,使用ppstest工具可查看pps信号时间值(pps信号发生时刻的系统时间点)

root@imx8qxpmek:~# ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1591828917.828448156, sequence: 85791 - clear  0.000000000, sequence: 0
source 0 - assert 1591828918.852533634, sequence: 85792 - clear  0.000000000, sequence: 0
source 0 - assert 1591828919.876534727, sequence: 85793 - clear  0.000000000, sequence: 0
^C
root@imx8qxpmek:~#
root@imx8qxpmek:~# ppstest /dev/pps1
trying PPS source "/dev/pps1"
found PPS source "/dev/pps1"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1591828923.065352191, sequence: 87742 - clear  0.000000000, sequence: 0
source 0 - assert 1591828924.065348846, sequence: 87743 - clear  0.000000000, sequence: 0
source 0 - assert 1591828925.065347127, sequence: 87744 - clear  0.000000000, sequence: 0
source 0 - assert 1591828926.065348783, sequence: 87745 - clear  0.000000000, sequence: 0
^C

查看pps中断:

root@imx8qxpmek:~# date
Thu Jun 11 06:43:49 CST 2020
root@imx8qxpmek:~# cat /proc/interrupts |grep pps
115:      87851          0          0          0  gpio-mxc  16 Edge      pps.-1
root@imx8qxpmek:~# date
Thu Jun 11 06:43:53 CST 2020
root@imx8qxpmek:~# cat /proc/interrupts |grep pps
115:      87855          0          0          0  gpio-mxc  16 Edge      pps.-1

通过date时间打印,可以看到1s产生一次中断。

至此,pps配置完毕,接下来处理NEMA数据,使用gpsd

gpsd是一个支持多设备,多协议以及提供丰富工具集的专用gps信号处理服务。此处主要介绍起使用,不做编译以及功能详细说明。

通过gpsd -l可以查阅支持的gps协议或者说模块,我裁剪过,只保留NEMA和ublox,所以只显示两个

root@imx8qxpmek:~# ./gpsd -lNMEA0183
n       b       c       *       u-blox
# n: mode switch, b: speed switch, c: rate switch, *: non-NMEA packet type.
# Socket export enabled.
# Shared memory export enabled.
# Time service features enabled.

另外也可以看到,支持socket 和共享内存方式通讯,比如后续要用到的chronyd即是采用共享内存方式,同时也开启了时间服务,当然此处没有用,而是用chrony单独实现。

启动gpsd服务后,可以通过其提供的各种工具集获取gps状态,比如gpsmon:

接下来配置chrony,chrony为一个专用的时间服务程序,与NTPD类似

其配置为/etc/chrony.conf


leapsectz right/UTC
makestep 1.0 -1
rtcsyncrefclock PPS /dev/pps1 lock GPSD prefer refid PPS
refclock SHM 0 offset 0.0 delay 0.2 refid GPSDallow

driftfile - 根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中是最合理的,它会在重启后为系统时钟作出补偿,甚至可能的话,会从时钟服务器获得较好的估值。

rtcsync -指令将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。

allow / deny - 这里你可以指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器。
makestep - 通常,chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时步进调整系统时钟,但只有在因为chronyd启动时间超过指定限制(可使用负值来禁用限制),没有更多时钟更新时才生效

refclock driver parameter[:option]…​ [option]…​The refclock directive specifies a hardware reference clock to be used as a time source. It has two mandatory parameters, a driver name and a driver-specific parameter. The two parameters are followed by zero or more refclock options. Some drivers have special options, which can be appended to the driver-specific parameter using the : character.There are four drivers included in chronyd:PPSDriver for the kernel PPS (pulse per second) API. The parameter is the path to the PPS device (typically /dev/pps?). As PPS refclocks do not supply full time, another time source (e.g. NTP server or non-PPS refclock) is needed to complete samples from the PPS refclock. An alternative is to enable the local directive to allow synchronisation with some unknown but constant offset. The driver supports the following option:clearBy default, the PPS refclock uses assert events (rising edge) for synchronisation. With this option, it will use clear events (falling edge) instead.Examples:refclock PPS /dev/pps0 lock NMEA refid GPSrefclock SHM 0 offset 0.5 delay 0.2 refid NMEA noselectrefclock PPS /dev/pps1:clear refid GPS2

详细的各项配置可以参阅官方文档:https://chrony.tuxfamily.org/documentation.html

运行chronyd之后,可以看到时间同步过程:

root@imx8qxpmek:~# chronyd  -d -f /etc/chrony.conf
2020-06-10T17:00:41Z chronyd version 3.2 starting (+CMDMON +NTP +REFCLOCK +RTC -PRIVDROP -SCFILTER -SECHASH -SIGND +ASYNCDNS +IPV6 -DEBUG)
2020-06-10T17:00:41Z Initial frequency -116.709 ppm
2020-06-10T17:00:41Z Timezone right/UTC failed leap second check, ignoring2020-06-10T17:01:28Z Selected source PPS
2020-06-10T17:01:28Z System clock wrong by 34565.191649 seconds, adjustment started
2020-06-11T02:37:33Z System clock was stepped by 34565.191649 seconds

在客户端方面,使用ntpd测试如下:

root@OpenWrt:~# ntpd -d -n -p 192.168.3.1
ntpd: sending query to 192.168.3.1
ntpd: reply from 192.168.3.1: offset:+6152.992411 delay:0.008204 status:0x24 strat:1 refid:0x00535050 rootdelay:0.000015 reach:0x01
ntpd: sending query to 192.168.3.1
ntpd: reply from 192.168.3.1: offset:+6152.990378 delay:0.004154 status:0x24 strat:1 refid:0x00535050 rootdelay:0.000015 reach:0x03
ntpd: setting time to 2020-06-11 10:42:38.090639 (offset +6152.990378s)

至此以NEMA,1PPS,GPSD,chronyd 等在linux平台搭建的时间服务器完毕。

关于GPS的1PPS时间同步功能探索与测试相关推荐

  1. Angular属性绑定的功能探索

    Angular属性绑定的功能探索 Angular的属性绑定机制不起作用 探索 Angular的属性绑定机制不起作用 今天用Kendo UI for Angular的TreeList组件时发现了一个问题 ...

  2. 车载GPS/北斗定位模块罕见功能

    GPS定位导航功能,相信大家都或多或少有一定了解了,对于车载导航定位什么的也都了然于心,只是,安装一块GPS/北斗定位模块只能定位.导航貌似有点浪费,功能有些单样了. 其实,GPS/北斗定位模块的功能 ...

  3. 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器

    时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...

  4. 【转载】探索式测试基础系列—生活进阶曲

    在探索式测试落地实践中奏出了协奏曲后进入到高级阶段,如何在问题定位和经验积累中发挥作用,也可以理解为在生活达到非常和谐后,如何孕育一个后代并为其提供良好的环境,因此本章的名字叫做生活进阶曲,表明在本章 ...

  5. 读书笔记_探索式测试_混合探索式测试

    一.测试场景 1.讲述用户故事 2.描述需求 3.演示产品功能 4.演示集成场景 5.描述设置和安装 6.描述警告和出错情况 二.使用基于场景的探索式测试 1.通过场景操作引入变化:操作后得到的新场景 ...

  6. 探索式测试解密——无探索,不测试!

    提示:关注新浪微博:http://weibo.com/beyound507 精彩内容不错过. 摘要:软件测试就像是一场旅行,目的地往往不由我们来定.准备得再充分,也要一试方知好坏.通过圈地盘.找变量. ...

  7. 聊聊角色扮演探索式测试与肥皂剧模型

    这是鼎叔的第十一篇原创文章. 行业大牛和刚毕业的小白,都可以进来聊聊. 欢迎关注本人专栏和微信公众号<敏捷测试转型>,大量原创思考文章陆续推出. 鼎叔在MTSC-中国移动互联网测试开发大会 ...

  8. 探索式测试:通宵测试法

    前言 选择那些使软件满负荷运行的场景(或衍生场景),使用内存和网络,或者在其他方面消耗资源,时间一长,问题就会出现. 方法简介 在<<探索式测试>>一书中,对于通宵测试法的描述 ...

  9. 探索式测试--第四章(全局探索式测试法)--读书笔记

    本章的内容则是关于测试人员在全局方面所必须做出的各种决定,比如在考虑特性交互.数据流以及在应用程序的用户界面上如何选择不同路径来完成某个实际功能时.探索式测试人员在实际开始测试前,需要建立起这样一个全 ...

最新文章

  1. 开发者必备的15 个Web开发工具
  2. angular 兼容ie7 bootstrap2兼容ie6
  3. jQuery中ajax加载文本
  4. 数据结构与算法之归并排序
  5. python分代回收_python 垃圾回收——分代回收 和java有些区别 注意循环引用无法被回收...
  6. 计算机社团活动丰富多彩,描写社团丰富多彩的句子
  7. 解决Windows中PLSQL连接虚拟机中Oracle缓慢的问题
  8. iOS调用 AlipaySDK 支付宝找不到头文件openssl/rsa.h 的解决方案
  9. 【Computer Organization笔记02】指令系统、MIPS指令系统简介、THCO MIPS指令系统、THINPAD指令模拟器
  10. mysql 锁 行级_全局锁、表级锁、行级锁mysql 极客评论笔记
  11. 人工智能:模型与算法2搜索求解之启发式搜索
  12. Oracle11g的安装及删除
  13. 杠杆炒股亏盈计算方法?
  14. 数据可视化的实现技术和工具比较(HTML5 canvas(Echart)、SVG、webGL等等)
  15. 前端学习笔记(5)-ES6中promise、Generator、Module等使用场景
  16. MySQL第三方客户端工具
  17. CentOSnbsp;下mysqlnbsp;ERRORamp;n…
  18. Nodecache免费香港CDN加速DNS解析服务1T流量!
  19. 【产品经理三节课】第2章 用户分析入门
  20. 上架发布应用市场资料准备iOS和Androd

热门文章

  1. linux下×××postfix
  2. [转载] 计算机网络——OSI模型究竟忽悠了多少人
  3. Extension Method (확장 메서드)
  4. pandas(三) -- DataFrame的基本操作
  5. Redis三种集群模式介绍
  6. linux cat EOF使用示例
  7. Linux parted分区工具使用示例
  8. Scala数组和Java集合List的互转
  9. Hadoop sqoop数据导入导出工具安装
  10. Linux部署Ant Design Pro项目及nginx部署