主题中讨论的其他器件:C2000WARE
大家好!
这将是一个更长的帖子。 对此深表歉意。
在过去的几天里,我一直在尝试确定 CM 挂起的原因。 这是在启动后3小时左右发生的。
我们的 CM 通过以太网交换机通过以太网与 Linux SOM 通信。 在多个器件上进行了多次测试。 始终相同:大约3小时的运行时间和 CM 已耗尽。
跟踪此问题的第一个方法是在 CM 上启用入口挂钩以获取最后一个函数的地址。 然后、我们编写了一段软件、在运行时的 LCD (在 CPU1上)上显示该地址。
因此,在 Ethernet_genericISRCustom () ISR 例程(来自 TI ENET 示例的源代码)上,CM 冻结。
侧注:TI 提供了两个不同的 Ethernet_genericISR 例程:一个用于 driverlib (名为 Ethernet_genericISR)、另一个用于 lwIP 示例(名为 Ethernet_genericISRCustom)。
我们最初使用后者。
因此、无需深入讨论在例程中执行的操作、我切换到了 driverlib 版本。
其效果完全相同:运行大约3小时后、CM 死亡、并滞留在 Ethernet_genericISR 中。
好的。 现在、让我们尝试确定导致进入 ISR 的原因。 有多个可能的中断源、它们被逻辑或视为用于生成 ISR 标志。
TRM 中有两个显示来源的图(图43-8和43-9)。
这些数字的解码并非易事、因为没有给出可供查找的寄存器名称、而只是较短的信号名称。
我一直在努力逐个消除可能的来源。 我启动了一个调试会话、在"Registers"窗口中查找相关的寄存器和使能标志。
不幸的是、结果表明、"Registers"窗口中缺少某些寄存器。 唯一能看到它们的方法是使用内存浏览器。
我还试图在连接调试器的情况下抓住确切的时刻、但正如您可以想象的那样、这令人烦恼。 我能够确定 DMA_MACIS 寄存器中的 Interrupt_Status 位已设置、因此肯定有一些中断源。
我检查并消除了几乎所有除了一个来源:与门与 MMDIS 和 MMCIE 信号。
我在 TRM 中搜索了使能信号:MMCIE。 单次出现、在图 43-8. 这会使事情复杂化。 我们有使能信号、该信号未在手册中进行记录。
好的、让我们看看 MMCIS 位和寄存器说明(MAC_MCIS Interrupt_Status 寄存器)。
还有相应的 MAC_MAC Interrupt_Enable 寄存器、但 th 位(应使能)为"保留"。 查看 MAC_MAC_CRC Interrupt_Enable 寄存器的内容时、它是0x00000000 -什么都没有启用。 好的、我想、TRM 中有一个错误、但是位被归零、所以这个桥臂上没有被启用的中断。
我错了。
不可否认的事实是、由于某种原因、CM 会进入 Ethernet_genericISR 并从不离开。 或者确切地说:它进入、检查某些标志、然后退出、只是立即再次进入、无限期阻止整个内核。
完全是偶然的,我注意到在初始化例程的 Enet 下面的片段:
// // Disable the MAC Management counter interrupts as they are not used // in this application. // HWREG(Ethernet_device_struct.baseAddresses.enet_base + ETHERNET_O_MMC_RX_INTERRUPT_MASK) = 0xFFFFFFFF; HWREG(Ethernet_device_struct.baseAddresses.enet_base + ETHERNET_O_MMC_IPC_RX_INTERRUPT_MASK) = 0xFFFFFFFF;
嗯... 它们出于用途而被禁用。 但 TX 呢? 为什么未屏蔽 TX? 如果(不小心)在发送定义数量的数据包或字节后出现中断、该怎么办?
宾果!
中断的原因是其中一个 TX 数据计数器的值达到了范围的一半、即发送了0x80000000字节。 在我们的案例,它是大约3小时的操作- 2千兆字节的数据。
我添加了这条魔法线:
HWREG(Ethernet_device_struct.baseAddresses.enet_base + ETHERNET_O_MMC_TX_INTERRUPT_MASK) = 0xFFFFFFFF;
问题解决了。
这花费了我几天的时间进行调试、几个紧张的夜晚、我阅读了超过500页的以太网手册、只是为了准确找出这一行代码。
好的、我们在驱动程序示例中漏掉了一行代码。 发生了。
但不幸的是、这并不是所有内容。
为什么从地球上说 Ethernet_genericISR 无法处理所有的中断源? 好的、我想向 TI 工程师提出这个问题。
为什么我们有两个不同的 Ethernet_genericISR 例程? 它们之间存在重大差异。 使用哪一个?
手册中有不一致的地方、缺少 MCIE 中断使能位。
我认为最好的处理器应该有更好的以太网驱动程序。
期待可解决此问题的 C2000Ware 改进版新版本。 在 MMCIE 位已经消失的地方等待一个答案。
C2000 MCU 的所有开发人员祝您好运。
此致、
安迪