主题中讨论的其他器件:HALCOGEN
我已经描述了与此 主题中相同的 EMAC 硬件竞态条件。
如果您在测试中使用 LwIP、则不会看到此问题、因为 LwIP EMAC 驱动程序已实施解决方法、即在添加到链之前等待 EOQ。
在实践中、此延迟会占用大量时间(在我们的实时系统中使用的时间太多)。 我们解决的权变措施是、当新的 CPPI 描述符链接到活动的 CPPI 描述符时、我们启用数据包完成中断。 然后、当数据包完成时、中断触发、如果 EMAC 已停止、ISR 将重新启动。
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.
我已经描述了与此 主题中相同的 EMAC 硬件竞态条件。
如果您在测试中使用 LwIP、则不会看到此问题、因为 LwIP EMAC 驱动程序已实施解决方法、即在添加到链之前等待 EOQ。
在实践中、此延迟会占用大量时间(在我们的实时系统中使用的时间太多)。 我们解决的权变措施是、当新的 CPPI 描述符链接到活动的 CPPI 描述符时、我们启用数据包完成中断。 然后、当数据包完成时、中断触发、如果 EMAC 已停止、ISR 将重新启动。
具有 lwIP 演示的 HALCoGen EMAC 驱动程序/v00.03.00/TMS570LC43x/HALCoGen-TMS570LC43x/SOURCE /HL_EMAC.c:1427
/*等待 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) { }
[报价用户="QJ Wang "]当软件应用程序看到 EOQ 标志集时,应用程序可以在此时通过将新列表指针写入启动该过程的相同 HDP 来提交新列表或附加列表中错过的部分。
问题是软件应用程序何时可以看到 EOQ 标志被置位。 LwIP 解决方案是在 EOQ 被置位前暂停、但这种延迟对于我们的实时应用来说太大了-等待的特征似乎是数据传输的时间、对于一个1500字节的帧@ 100Mbps 将是120us。
我们找到的唯一解决方案是在数据包传输中断时检查 EOQ。
我附加了一个补丁文件。
嗯、我不确定你的项目为什么使用 hdkif.c、当我使用 RM57x/build-RM57x 时、它使用 HL_EMAC.c、但下面是 hdkif.c 信息:
hdkif.c 中的注释表明我所关注的代码被称为变通办法(第329行注释)
hdkif.c @第327行
否则{ CURR_BD = txch->ACTIVE_TAIL; /* TODO:(这是一种权变措施)等待 EOQ 位置位*/ while (EMAC_BUF_DESC_EOQ!=(hdkif_swingle_data (CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOQ)); /* TODO:(这是一种权变措施)在 TXHD0变为零之前不要写入 TXHDP0 */ while (0!=*((UINT32 *) 0xFCF78600); CURR_BD->NEXT = hdkif_swinging_TxP (ACTIVE_HEAD); if (EMAC_BUF_DESC_EOQ =>(hdkif_swimming_data (CURR_BD->flags_pktlen)& EMAC_BUF_DESC_EOQ)){ /*写入标头描述符指针并启动 DMA */ EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(unsigned int)(active_head)、0); }
补丁:
@@@@ lwIP 演示的 HALCoGen EMAC 驱动程序/v00.03.00/lwip-1.4.1/ports/HDK/netif/hdkif.c "2018-11-14 13:55:86521.364850 -0800 +++"HALCoGen EMAC 驱动程序带有 lwIP 演示/v00.03.008/lwik/lwip.1.4+1.4+14:1h/lwik-0800/lw13:314.0800+14:24/lwif 3k/lwif -0800+1.4k/lwif -0800+++14:24/lwif -0800+14:24/ *将 BD 连接起来。 如果 DMA 引擎已经到达链的末尾、 *将设置 EOQ。 在这种情况下、应再次写入 HDP。 // -否则{ + else if (EMAC_BUF_DESC_EOQ =>(hdkif_swingle_data (CURR_BD->flags_pktlen)& EMAC_BUF_DESC_EOQ)}{ CURR_BD = txch->ACTIVE_Tail; -/* TODO:(这是一种权变措施)等待 EOQ 位被设置*/ - while (EMAC_BUF_DESC_EOQ!=(hdkif_swiming_data (CURR_BD->flags_pkkEOen)和 EMAC_BUF_DEV_TOQ); /* TODO:(这是一种权变措施)在 TXHD0变为零之前不要写入 TXHDP0 */ while (0!=*((UINT32 *) 0xFCF78600); CURR_BD->NEXT = hdkif_swinging_TxP (ACTIVE_HEAD);