自我上次发表以来已经六个星期了,没有任何答复。 我回来询问这个问题、因为我的权变措施有局限性。 为什么这个帖子被锁定而没有提供响应?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
自我上次发表以来已经六个星期了,没有任何答复。 我回来询问这个问题、因为我的权变措施有局限性。 为什么这个帖子被锁定而没有提供响应?
您好、Tom、
您可以尝试 lwip 演示中使用的代码吗? 文件是 attachede2e.ti.com/.../2526.emac.c
/*首次用填充的 BD 写入 HDP */
if (txch->active_tail =NULL){
/*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32)(ACTIVE_HEAD)、(uint32) EMAC_CHANNELNUMBER);
}
/*
*将 BD 连接起来。 如果 DMA 引擎已经到达链的末尾、
*将设置 EOQ。 在这种情况下、应再次写入 HDP。
*
否则{
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
CURR_BD = txch->ACTIVE_TAIL;
/*等待 EOQ 位被置位*/
/*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
/*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
while (EMAC_BUF_DESC_EOQ!=(EMACSwizleData (CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOQ))
{
}
/*在 TXHDP0变为零之前不要写入它*/
/*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
/*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
while ((((uint32) 0U!=*((uint32 *) 0xFCF78600U)))
{
}
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
CURR_BD->NEXT =(EMAC_TX_BD_t *) EMACSwizleData ((UINT32) ACTIVE_HEAD);
/*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
if (EMAC_BUF_DESC_EOQ =>(EMACSwizzleData (CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOQ)){
/*写入标头描述符指针并启动 DMA */
/*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32)(ACTIVE_HEAD)、(uint32) EMAC_CHANNELNUMBER);
}
}
您好、QJ Wang、
我对您的回答感到困惑、因为我不要求您进行任何类型的测试。
我有以下问题仍未得到解答:
您提供的示例代码为什么等待 TX0HDP 为0? TRM 没有提到需要这样做、因此我想理解这一点。
是否可以附加到 TX 描述符列表? 如果是、如何实现? TRM 表示这是可能的、但我无法可靠地做到这一点。 提供的示例代码等待任何先前的传输完成、因此不会附加到列表中。
谢谢、
Tom
您好、Tom、
可以、您可以在现有列表中附加一个新的 TX 描述符。 此新描述符必须为 NULL 终止。
如果下一个描述符指针为零、则当前缓冲区是队列中的最后一个缓冲区。 在将描述符添加到活动发送列表之前、SW 应用程序必须设置此值。
pNext 的值不应在描述符位于活动的发送队列中时改变、除非其当前值为 NULL。 如果 pNext 指针最初为 NULL、并且需要排队等待发送的数据包更多、软件应用程序可能会更改此指针、以指向新附加的描述符。
EMAC 将使用新的指针值并继续执行下一个描述符、除非 pNext 值已经被读取。 软件可以通过检查队列结束(EOQ)条件标志来检测这种情况。 当检测到 EOQ 时、应用程序可能会提交新的列表(TX0HDP=0)。
说实话、我没有测试在链接列表中添加新描述符的功能。
您好、Tom、
我执行了 EMAC 环回测试。 一个数据包被附加到一个现有数据包中、并且附加的数据包被成功传输。 附件是我的测试项目(CCS)。
接收到的数据包位于0x08001500 (现有数据包)和0x08001AEA (附加)。
现有数据包:总长度为470、每个缓冲区为94字节。
附加的数据包:总长度为470、每个缓冲区为94字节。 但有效载荷是不同的。
e2e.ti.com/.../5657.TMS570LS3137_5F00_EMAC_5F00_LPBK_5F00_PacketAppend.7z
您好 QJ、
附加到列表的想法是允许软件向 EMAC 添加消息而不停止软件。 因此、附加到列表中包含两个部分。 第一部分是将新数据包添加到缓冲区描述符列表中。 你已经指出了这个部分。 第二部分是根据需要更新标头描述符指针。 如果需要、对于不停止软件的想法很重要。 如果软件需要等待/停止当前列表完成、则添加的数据包只是一个新的数据包、而不是一个附加的数据包。
如果您在第1517行只看到几行、您可以看到该行在当前列表完成之前停止软件。 根据 TRM、这不是必需的、因此为什么这条线会出现? 在1530行下面再看几行代码、代码会检查硬件是否仍在处理列表。 这是根据 TRM 进行的、以确保添加的数据包数据添加到列表后硬件仍在运行。 此处的想法是、如果硬件已完成现有列表、则需要重新启动硬件以处理新数据。 如果硬件仍在运行、则当硬件到达列表中的那一点时、应处理添加的数据。
我复制了以下相关代码行。 有关的行以绿色突出显示、而我的问题和评论以红色突出显示。
/*
*将 BD 连接起来。 如果 DMA 引擎已经到达链的末尾、
*将设置 EOQ。 在这种情况下、应再次写入 HDP。
*
否则{
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
CURR_BD = txch->ACTIVE_TAIL;
/*等待 EOQ 位被置位*/
/*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
/*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
为什么这里会这样呢? TRM 没有提到这一点。
while (EMAC_BUF_DESC_EOQ!=(CURR_BD->FLAGS_pktlen & EMAC_BUF_DESC_EOQ))
{
}
/*在 TXHDP0变为零之前不要写入它*/
/*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
/*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
为什么这里会这样呢? TRM 中未提及这一点。
while ((((uint32) 0U!=*((uint32 *) 0xFCF78600U)))
{
}
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
CURR_BD->NEXT = ACTIVE_HEAD;
/*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
TRM 中提到了这种检查、但由于我要询问的上述代码、检查将始终为真。
if (EMAC_BUF_DESC_EOQ =>(CURR_BD->FLAGS_pktlen & EMAC_BUF_DESC_EOQ)){
/*写入标头描述符指针并启动 DMA */
/*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
/*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32)(ACTIVE_HEAD)、(uint32) EMAC_CHANNELNUMBER);
此致、
Tom
您好 QJ、
由于我们无法获得一致的结果、并且我不希望 EMAC 被中断驱动、因此我更喜欢不要花更多时间查看此代码。
我对我发送给您的不是中断驱动的代码的结果感兴趣。 我从您的数字 FAE 听说过您重复了我在使用此代码时看到的问题。 由于我们似乎对该代码具有一致的结果、而这正是我尝试使用的代码、因此我更愿意确定此代码出现问题的原因。 BTW、如果我只是在代码循环时添加相同类型的停止、则此代码正常工作。 您可以查看代码文件并进行评论吗?
谢谢、
Tom
我将 HDK Enet 连接到我的 PC、以便可以使用 Wireshark 查看发送的内容。 以下内容从之前的电子邮件粘贴到 FAE 中、但有一个图像没有通过。 我将尝试附加它。
要生成并查看问题,请执行以下操作。
一些说明/意见/解释:
谢谢、
Tom