嵌入式Linux 时间同步 gpsd+chrony

2023-05-16

嵌入式Linux 时间同步 gpsd+chrony

嵌入式Linux系统,外接GPS设备,系统通过NMEA数据和pps进行时间同步,同时将本系统作为时间同步服务器。

一、基本原理

​ NMEA中获取UTC时间的yymmddhhmmss,然后使用pps的秒脉冲对串口或者网路传输的延时进行校正。但是其中Linux检测pps信号的延时无法校正。
在这里插入图片描述

二、内核配置

1.PPS端口设备树

a.设备树添加pps节点

pps {
	compatible = "pps-gpio";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_pps>;
	gpios = <&gpio5 0 GPIO_ACTIVE_HIGH>;
	status = "okay";
};

b.设备树pinctl添加gpio信息

	pinctrl_pps: ppsgrp {
		fsl,pins = <
			MX6UL_PAD_SNVS_TAMPER0__GPIO5_IO00	0x1b0b1
		>;
	};
2.内核选项配置

a.pps相关配置

CONFIG_PPS=y
CONFIG_PPS_DEBUG=y
CONFIG_PPS_CLIENT_KTIMER is not set
CONFIG_PPS_CLIENT_LDISC=y
CONFIG_PPS_CLIENT_GPIO=y
CONFIG_GPIO_SYSFS=y
3.buildroot根文件系统配置

a.gpsd和chrony相关配置

BR2_PACKAGE_GPSD_CLIENT_DEBUG=y
# BR2_PACKAGE_GPSD_OLDSTYLE is not set
BR2_PACKAGE_GPSD_PROFILING=y
BR2_PACKAGE_GPSD_NTP_SHM=y
BR2_PACKAGE_GPSD_PPS=y
# BR2_PACKAGE_GPSD_USER is not set
# BR2_PACKAGE_GPSD_GROUP is not set
# BR2_PACKAGE_GPSD_FIXED_PORT_SPEED is not set
# BR2_PACKAGE_GPSD_MAX_CLIENT is not set
# BR2_PACKAGE_GPSD_MAX_DEV is not set
BR2_PACKAGE_GPSD_RECONFIGURE=y
BR2_PACKAGE_GPSD_CONTROLSEND=y
# BR2_PACKAGE_GPSD_SQUELCH is not set
BR2_PACKAGE_PPS_TOOLS=y
BR2_PACKAGE_CHRONY=y

注意:PPS_TOOLS一定要选上,否则chrony中的refclock PPS驱动不被编译

三、gpsd配置和使用

1.gpsd参数配置
gpsd -n udp://127.0.0.1:6600 /dev/pps2

udp://127.0.0.1:6600 指定GNSS数据来源。带有前缀“udp://”的 URI,后跟主机名、冒号和端口号。守护进程将打开一个套接字侦听到达指定地址和端口的 UDP 数据报,这将被解释为好像它们是由串行设备发出的。示例: udp://127.0.0.1:5000

tcp://127.0.0.1:6600 指定GNSS数据来源。带有前缀“tcp://”的 URI,后跟主机名、冒号和端口号。守护进程将打开一个到指定地址和端口的套接字并从中读取数据包,这些数据包将被解释为好像它们是由串行设备发出的。示例: tcp://data.aishub.net:4006

gpsd -D 5 -N -n /dev/ttymxc2 /dev/pps2

-D 5 输出5级log

-N 前台运行

-n 在轮询与其关联的任何 GPS 之前,不要等待客户端连接(chrony配合时必选参数)

gpsd -n /dev/ttymxc2 /dev/pps2

/dev/ttymxc2 指定GPS设备串口,传感器连接到的串行或 USB 设备的普通 Unix 设备名称。示例:/dev/ttyUSB0

/dev/pps2指定pps设备,PPS 源所连接的 PPS 设备的普通 Unix 设备名称。设备名称必须以“/dev/pps”开头,并且本地串行或 USB GPS 设备也必须可用。示例: /dev/pps0

四、chrony配置和使用

1.chrony.conf
makestep 0.1 3						//若系统时间与基准时间相差大于0.1s,直接跳变系统时间,仅限前3个时钟周期
rtcsync								//允许系统时间同步rtc时间,Linux每11min同步一次
allow								//允许设备作为时间同步服务器
leapsectz right/UTC					//瑞秒相关设置
driftfile /var/lib/chrony/drift		//指定var/lib/chrony/drift存储时间补偿增减率,每次开机增减率有效前使用存储值
dumpdir /var/run/chrony				//指定测量历史记录存储目录,测量历史用于计算补偿增减率。启动读取后删除

refclock PPS /dev/pps0 refid PPS lock GPSD prefer precision 1e-7 poll 2	//指定硬件PPS为优先时间源
refclock SHM 0 refid GPSD precision 1e-1 offset 0.9999 delay 0.2 poll 2	//指定硬件GPS为时间源
2.chrony参数配置
chronyd -f /etc/chrony.conf

五、调试总结

1.gpsd+chrony基本原理

gpsd从串口或者网络读取gnss数据并进行解析,将解析结果以UNIX socket或者共享内存等方式输出

chrony从UNIX socket或者共享内存取得解析后的gnss和pps信息,两者结合,校正系统时间

注意:chrony校正时并不会使系统时间跳变,通过拨快或者拨慢的方式(控制时间增减率)达到时间校正的目的

2.gpsd+chrony配合注意事项

a.以下内核或者根文件系统选项必须配置

CONFIG_PPS=y
CONFIG_PPS_CLIENT_LDISC=y
CONFIG_PPS_CLIENT_GPIO=y
CONFIG_GPIO_SYSFS=y
BR2_PACKAGE_PPS_TOOLS=y

b.以 root 身份运行gpsd

c.gpsd必须在 -n 模式下运行,这样即使没有客户端处于活动状态,时钟也会更新

d.与 chronyd 对话不需要 gpsd 配置。chronyd 是使用文件 /etc/chrony.conf 或 /etc/chrony/chrony.conf 配置的。检查您的配置文档以获取正确的位置

e.最后请注意,chronyd 需要在 gpsd 之前启动,以便在 gpsd 启动之前准备好套接字。

f. chronyd 连接到 gpsd

​ i.使用套接字方法让 chronyd 连接到 gpsd,请在您的 chrony.conf 文件中添加以下几行。套接字被命名为 /run/chrony.XXXX.sock。其中 XXXX 被 gpsd 使用的设备名称的基本名称替换。如果您的接收器在 /dev/ttyS0 上输出串行数据,则相应的套接字是/run/chrony.ttyS0.sock。如果您的 PPS 在 /dev/pps0 上,那么对应的套接字是 /run/chrony.pps0.sock。

将 XXXX 替换为设备串行端口的基本名称,通常是 ttyS0、ttyACM0 或 ttyAMA0。
将 YYYY 替换为您的 PPS 设备的基本名称,通常是 pps0。

refclock SOCK /run/chrony.XXXX.sock refid GPS precision 1e-1 offset 0.9999
refclock SOCK /run/chrony.YYYY.sock refid PPS precision 1e-7

​ ii.使用基本的 ntpd 兼容 SHM 方法让 gpsd 连接到 chronyd。要使用它而不是套接字,请将这些行添加到基本的 chrony.conf 文件中:

server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 2.us.pool.ntp.org
server 3.us.pool.ntp.org

driftfile /var/lib/chrony/drift

allow

# set larger delay to allow the NMEA source to overlap with
# the other sources and avoid the falseticker status
refclock SHM 0 refid GPS precision 1e-1 offset 0.9999 delay 0.2
refclock SHM 1 refid PPS precision 1e-7

您需要在 SHM 1 行上添加“precision 1e-7”,因为 chronyd 无法从 SHM 结构中读取精度。在不知道 SHM 1 上 PPS 的高精度的情况下,它可能不会对其数据给予足够的重视。

3.手动调试命令
su -										//获取root权限
killall -9 gpsd chronyd						//清除已经启动的gpsd和chrony进程
chronyd -f /etc/chrony.conf					//启动chrony指定从/etc/chrony.conf读取配置文件
sleep 2
gpsd -n /dev/ttymxc0 /dev/pps0				//指定从/dev/ttymxc0串口获取GNSS数据
sleep 2

chronyc tracking							//检查时间是否同步
chronyc sources								//检测时间源状态

六、参考文档

1.GPSD Time Service HOWTO,gpsd官方介绍如何使chrony和gpsd协作文档(此次调试的关键文档)

2.GPSD官方文档

3.chrony官方文档

4.CSDN博客对chrony详解教程

5.引用linxu时间同步原理介绍

6.引用linxu时间同步原理介绍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux 时间同步 gpsd+chrony 的相关文章

  • SPARC体系下硬浮点编译故障分析

    问题说明 之前extension版的app工程都是用的软浮点编译的 xff0c 在增加姿控算法库后 xff0c 统一改用硬浮点运行 xff0c 发现之前一个浮点数解析不对了 xff0c 排查发现和工程编译选项有关 xff0c 为软浮点时正常
  • SylixOS下DNS配置

    SylixOS下支持DNS xff08 域名解析 xff09 服务 xff0c 既可以通过域名地址来访问网络地址 测试 先进行一个域名解析的测试 xff1a 由上图可知 xff0c 在其他网络配置正确的情况下 xff0c SylixOS可以
  • SylixOS 教培官网上线

    4月末翼辉创建的包括SylixOS教培在内的文档中心已上线 今天SylixOS教培又上线了 Shell 命令手册 和 IDE 使用手册 方便大家学习和查阅SylixOS相关知识点 SylixOS教培官网 https docs acoinfo
  • SylixOS App 运行时出现“vprocRun() error: can not find entry function.”错误提示原因及解决方法

    针对只使用静态库 xff0c 不使用共享库的业务场景 xff0c 如果libsylixos Output目录下的 libvpmpdm so文件被删除 xff0c SylixOS App程序将自动连接libvpmpdm a文件 xff0c 这
  • 【无标题】

    环境变量 xff08 environment variables xff09 是一组键值对 xff08 key 61 value xff09 列表 xff0c 每一项键值对为一个环境变量 xff0c 分环境变量名和环境变量值 xff0c 两
  • c#爬虫-1688官网自动以图搜图

    背景 在1688有个功能 xff0c 就是上传图片 xff0c 就可以找到类似的商品 如下 网址 xff1a https www 1688 com 这时候 xff0c 我们可以使用程序来代替 xff0c 大批量的完成图片上传功能 实现思路
  • 关于大端序和小段序

    Most Significant Byte 指多字节序列中具有最大权重的 字节 wiki中的解释 xff1a Most Significant Bit 是指一个n位 二进制数字中的n 1位 xff0c 具有最高的权值 与之相反的称之为最低有
  • 使用Project进行项目管理

    文章目录 1 Project可以做哪些 xff1f 1 1 功能清单1 2 本文将会涉及到的内容 2 常见操作2 1 设置 xff1a 自动任务2 2 设置 xff1a 任务的时间格式2 3 日历设置 xff1a 项目开始时间2 4 日历设
  • 进销存小程序(一)项目整体功能和设计

    文章目录 1 设计目标2 功能点说明2 1 首页2 2 登陆2 2 1 微信用户和当前用户绑定的过程2 2 2 获取用户信息 2 3 创建店铺2 4 加入店铺2 5 创建商品2 6 商品信息修改2 7 入库管理2 8 出库管理2 9 库存盘
  • Tomcat的appBase,docBase,path关系

    文章目录 1 结论在最前面2 server xml关于appbase和context配置2 1 war包在webapps目录下 xff1b appbase 61 34 webapps 34 xff1b 无context配置2 2 war包在
  • ubuntu 18.04 LTS 安装搜狗输入法

    首先安装 fcitx xff0c 再安装搜狗输入法 一 检测是否安装fcitx 首先检测是否有 fcitx xff0c 因为搜狗拼音依赖fcitx 在终端中输入 fcitx xff0c 检查 fcitx 是否已有 fcitx 提示 xff1
  • Activiti之一:部署activiti-admin、activiti-app、activiti-rest

    文章目录 各组件版本下载部署将war包放入tomcat 访问 在网上查找activiti相关资料 xff0c 发现对于activiti rest的使用很少 xff0c 而官网对于api的支持还是比较多的 xff0c 如果考虑的是一个纯粹的工
  • 基于mongodb的动态表单实现

    文章目录 1 项目背景2 术语表3 技术选型4 概要设计4 1 逻辑架构图4 2 系统覆盖图 5 详细设计5 1 元数据样例及说明5 2 关于uuid 6 接口清单6 1 表单管理模块6 1 1 从excel导入表单元数据6 1 2 表单元
  • 10.9.1-Dataway+Echarts动态图表方案

    文章目录 1 技术选型2 实现方案2 1 方案介绍2 2 方案实现 xff08 demo xff09 2 2 1 使用echarts绘制html静态页2 2 1 1 选择合适的图表2 2 1 2 下载html demo 2 2 2 使用Da
  • 11.1-股票基金历年收益率计算

    文章目录 1 计算目标2 关键问题3 获取交易日历4 逻辑编写 1 计算目标 我们想知道 xff0c 一只股票标的 xff0c 在之前的几年中 xff0c 每一年的年化收益率是多少 xff1f 如果将每年的年化收益率进行求和汇总 xff0c
  • java代理实现爬取代理IP

    仅仅使用了一个java文件 xff0c 运行main方法即可 xff0c 需要依赖的jar包是com alibaba fastjson xff08 版本1 2 28 xff09 和Jsoup xff08 版本1 10 2 xff09 如果用
  • 使用proguard进行javaweb代码混淆

    背景 xff1a 公司需要将软件打包出售 xff0c 此时需要进行代码混淆和一些加密要求 调研 xff1a 目前此类实现包含软件和硬件实现 xff1b 硬件实现是使用类似加密狗usb工具进行防护 xff0c 应用系统通过与加密狗交互 xff
  • 使用说明-Postman-带cookie请求、文件上传

    Postman进行文件上传 选择post方式 xff0c 地址是http 192 168 102 213 7240 foa system upload Headers部分不要填写任何内容 对照后台的接口 xff0c 配置postman 选择
  • CentOS7下使用docker,完成Jenkins镜像、tomcat镜像制作和启动

    最终的目的 xff0c 是为了完成docker环境的Jenkins搭建使用 xff0c 并从gitlab上获取代码 xff0c 打出war包 xff0c war包通过目录挂载的方式 xff0c 在tomcat容器中使用 xff0c 总体思路
  • C# HttpWeb POST请求封装

    用于发送POST请求 xff0c 可以发送各种POST参数 传送文件 xff0c 返回结果 下载文件 说明如下 xff1a span class hljs keyword public span span class hljs keywor

随机推荐

  • [ROS学习笔记]ROS中使用激光雷达(RPLIDAR)

    RPLIDAR是低成本的二维雷达解决方案 xff0c 由SlamTec公司的RoboPeak团队开发 xff0c 本次学习用的是RPLidar A1型号激光雷达 xff0c 它能扫描360 xff0c 6米半径的范围它适合用于构建地图 xf
  • Ubuntu 18.04 配置国内源

    安装Ubuntu 18 04后 xff0c 使用国外源太慢了 xff0c 修改为国内源会快很多 修改阿里源为Ubuntu 18 04默认的源 备份 etc apt sources list 备份 cp etc apt sources lis
  • VS2010 断点失效解决方案 (VC)

    遇到几次断点失效的问题 xff0c 下面的方法都用了一下 xff0c 不清楚是哪个方法起作用了 一 菜单 调试 选项和设置 调试 常规 要求源文件与原始版本完全匹配 取消这个功能 二 菜单 编辑 高级 设置选定内容的格式 把打不上断点的那个
  • stm32学习

    波特率 xff1a 每秒传送的位数 DMA Direct Memory Access xff0c 直接内存存取 是所有现代电脑的重要特色 xff0c 它允许不同速度的硬件装置来沟通 xff0c 而不需要依赖于 CPU 的大量中断负载 否则
  • 经纬高坐标系转到东北天坐标系

    经纬高坐标系转到东北天坐标系 基本思路 xff1a 首先把经纬高 xff08 大地坐标系 lla llh xff09 转到直角坐标系 xff08 地心地固直角坐标系 xff08 ECEF xff09 xyz xff09 然后再转为局部坐标系
  • Ubuntu20.04 配置D435i相机

    文章目录 一 安装使用 InterRealSenseD435i SDK21 注册服务器的公钥2 安装3 安装开发者和调试包4 测试SDK2 二 安装realsense ros1 创建工作空间2 源码安装3 编译 xff1a 三 安装kali
  • java打卡-day3 变量和数据类型

    变量和数据类型 基本数据类型分类 4类8种 整数型 byte 占一个字节 128到127short 占两个字 215 215 1int 占四个字节 231 231 1long 占八个字节 263 263 1 浮点型float 占四个字节 3
  • 【行人惯性导航】关于行人导航中IMU位姿推导的知识点及相关代码

    IMU姿态惯性推导 本文是我上学期间写得 xff0c 之前已经在另一个博客发布过 xff0c 如今转至此发布 最近从事行人惯性导航的研究 xff0c 本人也是一个小白 xff0c 其中看了很多文献 xff0c 有很多个人思考很费时间的地方
  • nuttx操作系统的移植以及下载

    1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root 64 ubuntu apt get install gcc arm none eabi 编译器 3 kconfig f
  • MPI集群环境搭建

    我在前面两篇博客中简要介绍了为什么要并行计算以及MPI的一些学习心得 xff0c 接下来我们正式开始MPI的学习之路 我们知道MPI是分布式内存编程 xff0c 所以这篇博客会详细讲解MPI集群环境的搭建过程 一 准备工作 选择Linux版
  • python 练习 tcp 服务器与客户端发、接信息,pycharm

    背景 win8 1 pycharm 2021 3 1 python 3 9 7 自带idle vs code 1 64 2 现象 1 代码不知道如何在idle 和 vs code中运行 xff0c 总是在运行客户端代码后 已先运行服务器代码
  • VSCode配置终端为cmd命令行程序的操作步骤

    步骤1 xff1a 依次点击菜单栏的 终端 新建终端 步骤2 xff1a 按图中红色箭头的方向和方框所示 xff0c 依次点击 步骤3 xff1a 点击图中红框处的command product xff0c 下次再启动时的VSCode终端就
  • VC/C++ 发送post请求

    前面我搭建了一个servlet xff0c 响应get post请求 xff0c 网页端已经实现get post请求 xff0c 这个时候我用c 43 43 编辑的程序也想发送post请求 xff0c 于是 xff0c 有了下面这段代码 s
  • Python subprocess模块解析

    在学习这个模块前 xff0c 我们先用Python的help 函数查看一下subprocess模块是干嘛的 xff1a DESCRIPTION This span class hljs keyword module span allows
  • Java与C/C++的性能对比

    写这个主题是因为若干时间前一时头脑发热 xff0c 写了这个帖子 xff08 http www iteye com topic 857722 xff09 xff0c 现在看来这个帖子很幼稚 xff0c 尤其是二楼 61 61 xff0c 后
  • char数组与char指针的区别与联系

    字符串 xff08 char xff09 与字符数组 xff08 char 区别 在C语言中 xff0c 对字符串的操作主要有两种方式 xff1a 一是字符数组 char xff0c 二是使用字符指针 char 接下来最这两种所使用的情况做
  • Ubuntu系统火狐浏览器无法上网方案解决

    在国内google浏览器无法直接使用 xff0c 我们安装ubuntu系统自带的火狐浏览器在设置中选择的事google上网 xff0c 所有大家网络连接没问题 xff0c 就是无法上网 解决问题如下 xff1a 第一种 xff1a 重新安装
  • 解决ROS常遇到的Couldn’t find executable named报错解决

    解决办法 xff1a 将执行文件打开权限允许作为程序执行文件
  • ROS学习(一)ROS Noetic安装及环境配置

    文章目录 前言0 ROS Installation Options1 Installation1 1 Configure your Ubuntu repositories1 2 Setup your sources list1 3 Set
  • 嵌入式Linux 时间同步 gpsd+chrony

    嵌入式Linux 时间同步 gpsd 43 chrony 嵌入式Linux系统 xff0c 外接GPS设备 xff0c 系统通过NMEA数据和pps进行时间同步 xff0c 同时将本系统作为时间同步服务器 一 基本原理 NMEA中获取UTC