FSL 1588 PTPD简要分析!

本文详细介绍了1588v2协议的ptpd开源代码实现,包括主要文件的功能说明,如arith.c的时间格式转换、bmc.c的最佳主时钟选择等。同时深入探讨了socket编程在net.c中的应用,以及如何处理IEEE-1588协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:http://blog.chinaunix.net/uid-20721651-id-4334175.html
1588v2协议目前主要都是基于ptpd开源代码实现。下面是ptpd开源代码中的主要文件介绍:
arith.c
  Time format conversion routines and additional math functions 
bmc.c
Best master clock selection code 
constants.h
Default values and constants used in ptpdv2 
datatypes.h
Main structures used in ptpdv2 
display.c
General routines for displaying internal data 
fsl_1588.c
Adds Freescale QorIQ 1588 HW assist support in PTPd 
fsl_1588.h
Adds Freescale QorIQ 1588 HW assist support in PTPd 
protocol.c
The code that handles the IEEE-1588 protocol and state machine 
ptpd.c
The main() function for the PTP daemon 

dep/constants_dep.h
Plateform-dependent constants definition 
dep/datatypes_dep.h
Implementation specific datatype 
dep/msg.c
Functions to pack and unpack messages 
dep/net.c
Functions to interact with the network sockets and NIC driver 
dep/ptpd_dep.h
External definitions for inclusion elsewhere 
dep/servo.c
Code which implements the clock servo in software 
dep/startup.c
Code to handle daemon startup, including command line args 
dep/sys.c
Code to call kernel time routines and also display server statistics 
dep/timer.c
The timers which run the state machine 

ptpd.c很简单,在main function,启动ptp engine,定义ptpclock全局变量;
startup.c 主要处理启动时用户输入的相关配置选项;
net.c 很关键,初始化相关socket,收发相关的网络数据;(这个文件对于想学习linux socket编程的同学也是很好的借鉴材料)
protocol.c ptp protocol engine;

protocol() in protocol.c, ptp 1588 states machine;
在协议初始化完成以后,由doState()来完成每个协议阶段的处理。我们主要关注slave模式下的处理,handle(),处理1588报文的通用接口。
首先在handle中要监听端口,收包,其中有两个socket,event and general使用的select系统接口;

在select返回以后,使用netRecvEvent来收1588报文,先收event and general,两种报文不可能同一时刻到达,所以,收到的报文save在ptpClock结构中的msgIbuf中。
这里的netRecvEvent接口,如果使用硬件协助的方式来实现,是需要单独实现的。在fsl 1588中实现比较关键的一块是获取报文中的相关信息,然后调用硬件驱动fsl_1588_get_rx_time,获取报文接收时间。
general or event的报文收到后,开始处理报文,msgUnpackHeader,处理ptp报文相关报头信息。然后根据报头中的messageType分类处理报文。
到此,handle处理完毕。

检查timer是否expired,如果DelayReq timeout,开始处理DelayReq报文。在issueDelayReq中,会获取当前时间,将该事件pack进报文中,然后调用netSendEvent发送,注意这里的获取时间的操作,如果硬件支持是要切换到硬件模式的。我觉得这里有个问题,不应该在这里把硬件时间pack进报文,而是把空间预留出来在mac发包时,打上timestamp。

内核中打开config timestamp的选项,那么内核在处理1588报文是会将timestamp保存出来,供ptpd来使用。
内核中保存了这些timestamp了,但是是如何通过系统调用索引到的,这个机制待后面分析。
FSL(FMRIB Software Library)中,`design.mat` 文件是进行统计分析的关键部分,尤其是在使用 `randomise` 或其他基于 GLM(General Linear Model)的工具进行组水平分析时。该文件用于定义统计模型中的设计矩阵(design matrix),即描述实验条件、协变量以及组别之间的关系。 ### 设计矩阵的组成 `design.mat` 文件是一个文本文件,通常包含以下内容: - **第一行**:`/NumWaves`:表示设计矩阵中的列数,即模型中的回归变量数量。 - **第二行**:`/NumPoints`:表示设计矩阵中的行数,即受试者数量。 - **接下来的部分**:以 `/Matrix` 开始,后面是实际的矩阵数值。每一行对应一个受试者,每一列对应一个解释变量(例如组别、协变量、对比等)。 例如,一个简单的两组比较(组1和组2)的设计矩阵可能如下: ``` /NumWaves 2 /NumPoints 6 /Matrix 1 0 1 0 1 0 0 1 0 1 0 1 ``` 在这个例子中,第一列代表组1,第二列代表组2,共6个受试者,前3个属于组1,后3个属于组2。 ### 设计矩阵与 contrast (.con) 文件的配合使用 为了进行统计推断,还需要一个 `design.con` 文件来定义对比(contrasts)。例如,在上述两组比较中,若要测试组1与组2之间的差异,可以设置对比为 `[1 -1]`,表示组1减去组2的效果。 ### 在 Dual Regression 中的应用 在 Dual Regression 分析中,`design.mat` 文件用于对每个独立成分(ICA component)进行组水平统计推断。具体来说,在 stage 3 中,使用 `randomise` 对每个 ICA 成分进行统计建模,生成如 `dr_stage3_ic[#ICA]_tstat[#CON].nii.gz` 的统计图,其中 `#ICA` 表示 ICA 成分编号,`#CON` 表示对比编号。此外,经过多重比较校正后的显著性图像是 `corrp` 文件,表示 1 - p 值的图像。 ### 示例:两样本 t 检验的 design.mat 设置 假设你有 4 个受试者,前两个属于组 A,后两个属于组 B,可以构建如下 `design.mat` 文件: ``` /NumWaves 2 /NumPoints 4 /Matrix 1 0 1 0 0 1 0 1 ``` 对应的 `design.con` 文件可能如下: ``` /NumContrasts 1 /NumPerContrast 2 /Matrix 1 -1 ``` 这个对比表示组 A 与组 B 的差异。 ### 常见设计类型 - **单样本 t 检验**:仅一列全为 1,表示所有受试者的平均激活。 - **两样本 t 检验**:如上所述,两列分别代表两个组。 - **协变量分析(ANCOVA)**:添加额外列以控制协变量(如年龄、IQ 等)。 - **多因素设计**:如 2x2 设计,需要更复杂的矩阵设置。 ### 注意事项 - 确保设计矩阵是满秩的(full rank),否则无法估计所有参数。 - 使用 `fslmat` 或 MATLAB 等工具可以帮助生成和验证设计矩阵。 - 在运行 `randomise` 时,确保正确指定 `-d design.mat` 和 `-t design.con` 参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值