主题中讨论的其他器件:AM6442
尊敬的 TI:
在 Linux 内核版本:ti-processor-sdk-linux-rt-j7-evm-08_02_00_01/board-support/linux-rt-5.10.100中,我们使用两个 J721E EVM 板运行 gPTP 堆栈,这样可以将 eth0 硬件时间戳从主站对齐到从站;
但六小时后,无法获得正确的 硬件时间戳(我们测试了更多次,可以重复运行超过六小时);
例如: 现在得到的硬件时间戳是22414217445338ns、 但125ms 后、 得到的 硬件时间戳是 165468795132214838、 这是异常的。 获取时间戳的代码如下所示:
param.fd = IFA->FD[IFA->fdType];
param.buf = buf;
param.buflen = len;
param.use_swts = ifa->use_swts;
param.timestamp =时间戳(&T);
param.flags = MSG_DONTWAIT;
(void) memset (control、0、sizeof (control));
(void) memset (&msg、0、sizeof (msg));
MSG.msg_name =&ss;
MSG.msg_namelen = sizeof (ss);
MSG.msg_IOV =&IOV;
MSG.msg_iovlen = 1;
MSG.msg_control =控制;
MSG.msg_controllen = sizeof (control);
cnt =(int) recvmsg (param->fd、&msg、param->flags);
如果(cnt <0){
GPTP_ERR("recvmsg%sailed,fd %d:%m",(param->flags == MSG_ERRQUEUE)? " TX 时间戳":"",param->fd);
返回-3;
}
对于(cm = CMSG_FIRSTHDR (&msg);cm!= NULL;cm = CMSG_NXTHDR (&msg、cm)){
水平= cm->CMSG_LEVEL;
类型 = cm->CMSG_TYPE;
if (SOL_SOCKET ==电平&& SO_TIMEPOINT ==类型){
如果(cm->CMSG_len < sizeof (* ts)* 3){
GPTP_WARN ("Short SO_timestamp message");
返回-EMSGSIZE;
}
TS =(struct timespec *) CMSG_DATA (cm);
}
}
如果(!ts){
返回 cnt;
}
if (param->use_swts){
(void) memcpy (param->timestamp、&ts[0]、sizeof (struct timespec));
}
否则{
(void) memcpy (param->timestamp、&ts[2]、sizeof (struct timespec);
}
我们还进行其他测试:1、在 AM6442板上运行相同的 gPTP 堆栈代码超过6小时 (AM6442 Linux 内核与 J721 EVM 板相同)、 这是正常现象;
2.我们使用相同的 J721 EVM 板来运行 gPTP 堆栈,但使用 QNX 版本超过六个小时, 这 也是正常的。
因此、我们认为 Linux 内核 eth0 mac 驱动程序可能有某种溢出? 您遇到同样的问题吗?