主题中讨论的其他器件:HALCOGEN
您好!
在 HalCoGen 生成的以太网驱动程序中、我发现了一个严重问题。 问题是在代码中测试 DMA 引擎采用的 NULL 指针。
简称为 HL_EMAC.c 文件中的 EMAC_BUF_DESC_EOQ 标志 以下是 TRM 的一部分:
32.2.6.4.9队列结束(EOQ)标志
置位时、该标志表示相关描述符是发送队列中的最后一个描述符
发送器已经停止。 该标志最初由清除
软件应用程序、然后再将描述符添加到发送队列中。 该位在时由 EMAC 置位
EMAC 确定描述符是给定数据包的最后一个(EOP 标志被置位)、并且没有
发送列表中的更多描述符(下一个描述符指针为 NULL)。
软件应用程序可以使用该位来检测相应的 EMAC 发送器的时间
通道已停止。 当应用程序向发送附加数据包描述符时、这很有用
EMAC 已拥有的队列列表。 请注意、此标志仅在 EOP 描述符上有效。
这包含明显的请求、即在将片段添加到传输队列之前、SW 必须清除此标志。 但当前代码没有执行它。
详细信息:
使用此描述符进行操作有两个部分。 一个是开始发送(函数 EMACTransmit)、另一个是在发送完成后(函数 EMACTxIntHandler)
EMACTransmit 仅为第一个片段数据包设置所有标志。 当一个数据包有多个存储器片段时、当前代码只会在最后一部分添加 EOP 标志。 其他标志保持不变。 第一个和最后一个之间的所有片段也没有变化(如果存在)。
EMACTxIntHandler 清除许多标志、但从不清除 EOQ 标志。
问题是上层使用生成多个片段数据包。 对于 LwIP、这种情况并不少见。 所有片段描述符将反复使用。 经过一段时间后、许多片段在加入队列之前具有 EOQ 正数是正常的。 我们有比赛、SW 可能比参赛者快、在本例中、EOQ 的测试结果具有错误的正电位。 导致传输时在卷中丢失不能忽略的数据包。
此代码(包括问题)可能会围绕所有 Hercules 系列 MCU 共享。
Jiri Dobry
PS:您是否有计划为此创建更好的代码? 它有许多疯狂的部分。 例如、在"中断函数"内汇集"无限"循环。 或将幻数 0xFCF78600转换为指针。 (在"安全"代码中? WTF?)
坦率地说、我希望其他没有源代码和没有其他选项(闪存驱动器)的 Hercules 代码具有更好的质量。