剖析Linuxptp中ptp4l实现--OC

news2024/11/23 12:18:39

源码克隆地址:

git://git.code.sf.net/p/linuxptp/code

项目官网文档:

https://linuxptp.nwtime.org/documentation/

关于linuxptp的相关配置可以参考以下博文:

linuxptp/ptp4l PTP时钟同步配置选项

代码剖析

ptp4l的main函数在ptp4l.c中,命令行解析使用的是 getopt_long ,具体使用方法可以百度,这个是现成的命令行解析API。

可以看到解析不同命令行参数后都是调用的 config_set_int 函数设置,linuxptp中配置一般都是保存在 config.c 中的 config_tab 中:

关于配置项所代表的含义可以参考上文推荐的博文。

命令行中比较重要的是 -i ,也就是添加interface:

创建接口使用的是网卡名称,比如 -i eth0,此时就会创建一个名字是eth0的接口,源码如下:

在 interface_create 中注意,除了名字(name)还有ts_label也被设置为传入的网卡名称:

除去配置参数和接口创建,其实功能主体就是创建clock,和轮询创建clock时添加的文件描述符:

在 clock_create 中只看几个关键的地方,第一个是软硬件时间戳相关:

在clock创建的初始你会看到基本都是初始化 c->dds 这个结构体相关的配置,这里在协议原文中有:

其实dds就是defaultDS,这几个数据集都是协议明文规定的数据集,linuxptp中在ds.h中有所定义,详细内容可以参照协议原文第8章节PTP data sets。

在配置比如使用软件时间戳还是硬件时间戳,是onestep还是twostep时,会先根据设置得到一个网卡预期需要支持的模式,然后根据前面创建的interface,获取网卡的信息,再判断网卡是否支持:

再下面是确定使用哪个PHC(ptp hardware clock)的逻辑:

还有UDS(unix domain sockets)的配置:

剩下的就是clock本身一些杂项初始化,在这个函数末尾有最重要的port添加与初始化:

在添加port的时候,可以看到每个port申请了多少个fd:

从上图可以看到clock的port个数=interface个数+2

从上图可以看到,当没有添加过port的时候port个数是两个uds,每次添加一个port,实际是加了3个port,也就是添加一个port的时候,一共有5个port,每个port有 N_CLOCK_PFD 个文件描述符,这些文件描述符就是后续需要轮询的。N_CLOCK_PFD是12,其中除了包含下面11个fd,还有一个处理错误状态的定时器fd。

回到刚才的函数,port_open中还有一些port的参数设置,其中比较重要的有:

以及通过 transport_create 创建了传输实例:

根据传输类型有UDS/ETHERNET/IPV4/IPV6可选,最终trp就是一组包含发送接收等的函数指针合集:

比如IPV4:

port_open 中还有有限状态机(fsm)的设置:

需要注意,状态机的各种状态也是协议中所明文规定的:

具体内容请参照协议原文9.2.5章节。 

再有就是fault定时器也在这里被创建:

回到clock_create函数最后对port的初始化:

根据前面port_open中的源码,假如我们是E2E的OC,那么我们的 port_dispatch 函数是 bc_dispatch :

在 port_state_update 里我们根据 EV_INITIALIZE 事件对端口进行了初始化:

在 port_initialize 函数中,除了初始化一些参数配置,最重要的是创建了各种定时器fd:

拿IPv4来举例,319和320是固定的两个端口,它们就是通过 transport_open 函数打开:

这里event port用来接收event消息,general端口用来接收general消息:

详细信息可以参考协议原文7.3.3。

至此,所有配置都初始化完成了,后续就只剩下一直轮询之前添加的fd而已了。在main里有:

clock_poll 函数里面主要就是轮询fd,然后分发事件。 

假如还按照之前举的例子,E2E的OC的话,port_event实际是 bc_event 函数。

比如我们是master的话,sync同步包发送定时器时间到了我们就会:

在处理完定时器fd事件后,紧跟着就是接收来自两个fd的数据:

然后根据接收到的事件做不同处理,同时更新状态机状态。

先写到这儿,有时间再完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“学习嵌入式开发:明确目标,提升技能“

嵌入式领域涵盖广泛,不可能一次性掌握所有知识。因此,明确学习目标和方向非常重要。选择感兴趣且与职业发展相关的领域进行深入学习是明智之举。 嵌入式技术在不断发展,过去与现在存在差异。选择学习当前行业的主流技术和趋势是明智选择。掌…

基于STM32设计的人体健康监护系统(华为云IOT)

一、设计需求 1.1 设计需求总结 根据需求,要求设计一款基于 STM32 的人体健康监护系统。采用系统模块化思路进行,将多个数模传感器收集到的数据和操作指令一并送至 STM32 中心处理器进行处理分析。 该系统可以实时监测被测者的心率、体温以及周围环境的温度,也同时可以通…

生物信息学_玉泉路_课堂笔记_06 第六章 基因组学:遗传变异分析以及FGWAS

🍅 课程:生物信息学_玉泉路_课堂笔记 中科院_2022秋季课 第一学期 🍅 个人笔记使用 🍅 2023/7/21 课程回顾 第六章 基因组学:遗传变异分析以及FGWAS 第一节 SNP 与 Indel 的鉴定与分析 基本概念 参考基因组 和基因组…

tinkerCAD案例:9.Twist Earrings 扭耳环

tinkerCAD案例:9.Twist Earrings 扭耳环 In this lesson you learn how to create earrings by using cylinder shapes. Let’s get started! 在本课中,您将学习如何使用圆柱形制作耳环。让我们开始吧! 说明 Drag a Cylinder shape to the w…

为Android构建现代应用—— 练习状态管理

介绍 本章是一个应用上一章:设计原则中学到的概念的项目。 项目的目标包括以下实现: • 创建一个应用程序,该应用程序使用View作为真实来源。 • 修改应用程序,使其使用ViewModel作为真实来源。 • 将状态和事件进行分组&#x…

N型光伏电池技术“两头开花”,谁是诗和远方?

光伏产业已经进入大规模、市场化发展的新阶段。 近日,国家能源局公布了上半年全国电力工业统计数据,根据总装机容量,光伏装机已正式成为我国第二大电源装机,仅次于煤电。 作为新兴产业,光伏市场持续扩容总是伴随着技…

SpringMVC----(1)基础

SringMVC 1 SpringMVC简介2 SpringMVC入门案例2.1 入门案例2.2 入门案例工作流程2.3 bean加载控制2.4 PostMan工具 3 请求与响应3.1 请求映射路径3.2 Get和Post请求发送普通参数3.3 请求头的五种类型参数传递3.4 请求体的JSON数据传输参数3.5 日期型参数3.6 响应 4 REST风格4.1…

SpringCloud整合Nacos配置中心

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

NoSQL之Redis配置使用

目录 一、关系数据库与非关系型数据库 1.1.关系型数据库的概述 1.2关系型数据库的优缺点 1.2.1优点 1.2.2缺点 1.3.非关系型数据库的概述 二.关系数据库与非关系型数据库的区别 2.1数据存储方式不同 2.2扩展方式不同 2.3对事务性的支持不同 2.4非关系型数据库产生背景 2…

亚马逊攀岩绳EN892:2012+A1:2016安全带标准、攀岩安全带EN 12277:2015登山装备要求和ASTM F1772–17体育运动安全标准规范

如果您在亚马逊商城发布商品,则必须遵守适用于这些商品和商品信息的所有联邦、州和地方法律以及亚马逊政策(包括本政策)。 本政策适用的攀岩安全带 本政策适用于主要在攀岩或登山期间使用且使用者双脚不接触地面时使用的安全带。安全带是一种…

Xshell使用sftp传输文件

单击工具栏新建回话图标,在弹出的新建回话窗口中协议选择SFTP,输入主机名或ip地址,端口号22,单击连接,输入用户名和密码完成创建连接。 本地/远程目录设置:新建会话时在下图中SFTP中设置文件上传下载的本地…

基于vue+element 分页的封装

目录标题 项目场景:认识分页1.current-page2.page-sizes3.page-size4.layout5.total6.size-change7.current-change 封装分页:创建paging:进行封装 页面中使用:引入效果 项目场景: 分页也是我们在实际应用当中非常常见…

Nginx与Tomcat服务器的区别以及个人网站部署方案

- Nginx和Tomcat作用一样吗? 答:不完全相同。Nginx 和 Tomcat 都可以作为 Web 服务器,但它们的作用略有不同。 Nginx 是一个高性能的 Web 服务器和反向代理服务器。它的主要作用是提供静态文件服务、反向代理、负载均衡、缓存、SSL 加密等功…

《PyTorch深度学习实践》

文章目录 1.线性模型2.梯度下降算法3.反向传播3.1原理3.2Tensor in PyTorch 4.用PyTorch实现线性模型 1.线性模型 2.梯度下降算法 # 梯度下降x_data [1.0,2.0,3.0] y_data [2.0,4.0,6.0]w 3.0def forward(x):return x*w# 损失函数 def cost(xs,ys):cost 0for x,y in zip(x…

VR全景在酒店的发展状况如何?酒店该如何做营销?

现阶段,VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用,每天都有不少人通过VR全景展示来了解酒店的设施环境,而酒店也可以借此机会,详细展示自身优势,更大范围吸引顾客。 VR酒店拥有真实、立体的全…

某商业落地充电桩后台服务器通迅协议V4.9.

充电机智能终端与智能中心管理系统 通迅协议 目录 一、网络拓扑 4 1.1 功能界定 4 1.1.1 充电机智能终端 4 1.1.2 智能中心管理系统 4 1.2 接口定义 4 1.3 通信方式 4 1.4 通信规约 5 1.5 报文格式 7 1.6 关键命令 8 二、应用层 9 2.1 数据格式: 9 2.2…

全面解析Bootstrap排版使用方法(文字样式)

全面解析Bootstrap排版使用方法(文字样式) 一、段落 段落是排版中另一个重要元素之一。在Bootstrap中为文本设置了一个全局的文本样式(这里所说的文本是指正文文本): 1、全局文本字号为14px(font-size)。 2、行高为…

bash: /etc/profile: 权限不够

添加环境变量的时候显示没有权限 echo “export PATH”/usr/local/ARM-toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/:$PATH"" >> /etc/profile bash: /etc/profile: 权限不够 sudo chmod 777 /etc/profile echo “export PATH”/us…

Flink任务优化分享

Flink任务优化分享 1.背景介绍 线上计算任务在某版本上线之后发现每日的任务时长都需要三个多小时才能完成,计算时间超过了预估时间,通过Dolphinscheduler的每日调度任务看,在数据层 dwd 的数据分段任务存在严重的性能问题,每天…

安装requests模块及其他依赖库的完美解决办法

业务场景 导入requests库时报错,单独离线下载安装requests,发现仍然报错,问题在于requests库有其他依赖库。 WARNING: Retrying (Retry(total1, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnect…