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.

[参考译文] AM263P4:enet_lwip_cpsw 示例:当 CPU 利用率为高电平时、在初始化期间不触发 I2C ISR

Guru**** 2380860 points
Other Parts Discussed in Thread: SYSCONFIG, CCSTUDIO
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1507687/am263p4-enet_lwip_cpsw-example-i2c-isr-not-triggering-during-initialization-when-cpu-utilization-is-high

器件型号:AM263P4
主题中讨论的其他器件:SysConfigDP83869CCSTUDIO

工具/软件:

我有一个模拟公司项目场景的 TI 示例项目。

在现实世界中、这可能不太可能发生、但事实上、中断未触发可能表明中断设置不当、可能会导致后续出现错误。

基本上、我从 TI 的 enet_lwip_cpsw 工程开始、该工程设置了以太网。   我添加了 PWM0以运行@ 40kHz、并每2个周期(@20kHz)生成一次并中断。 ISR 会在 CPU 执行时间的50%内执行。  (此代码将移至运行控制代码的 nortos 内核并进入 ISR。  但现在它正在核心0上运行以进行测试)。

在 PWMISR 内部、A 引脚被切换并且很长的延迟被完成。

另请注意、PWM 在初始化期间配置为向上/向下计数模式、因此 PWM 和 ISR 将非常提前执行。

运行此代码时、Enet 初始化失败、而尝试读取 I2C EEPROM 以获取 MAC 信息。    

EnetBoard_getMacAddrList 调用 eeprom_read() 2次。  I2C_EEPROM_MAC_CTRL_OFFSET 成功、但 I2C_EEPROM_MAC_DATA_OFFSET 在 I2C_TRANSFER ()中的 SemaphoreP_PEND 期间失败。

下面是从两个调用 eeprom_read ()的寄存器的一些捕获:

  1. 在 SemaphoreP_PEND 之前的 EEPROM_Read (I2C_EEPROM_MAC_CTRL_OFFSET)。
  2. 在 SemaphoreP_PEND 之后进行 EEPROM_Read (I2C_EEPROM_MAC_CTRL_OFFSET)。
  3. 在 SemaphoreP_PEND 之前的 EEPROM_Read (I2C_EEPROM_MAC_DATA_OFFSET)。   !!!  永远不会超过 SemaphoreP_PEND
  4. 暂停的 CPU 以捕获 I2C 寄存器。

我很惊讶 I2C 无法第二次触发。  想知道它是否与溢出的 I2C ISR 有关。

请提供任何帮助以确定确切的原因以及如何解决这种情况。   我担心它与中断设置有关、稍后会成为间歇性问题。

此致。

==================== 如何重现问题=======================

  1. 加载项目: mcu_plus_sdk_am263px_10_01_00_31\source\networking\enet\core\examples\lwip\enet_lwip_cpsw\am263px-cc\r5fss0-0_freeRTOS
  2. 覆盖.sysconfig 和 main.c 文件。
  3. 运行工程
  4. 请参阅下面的非工作输出

e2e.ti.com/.../1106.test.zip

=================================== LOGS=====================

当 Enet 读取 EEPROM 时、如果 PWM ISR 未使用50% CPU 利用率、则为###工作输出

正在启动 NULL 引导加载程序...
kpi_data:[bootloader_profile]引导介质:未定义
kpi_data:[bootloader_profile]引导映像大小:0 KB
kpi_data:[bootloader_profile]当前核心:
kpi_data:[bootloader profile] System_init:378us
kpi_data:[bootloader profile] Drivers_open:50us
kpi_data:[bootloader profile] LoadHsmRtFw:8584us
kpi_data:[bootloader profile] SBL end:3043us
kpi_data:[bootloader_profile] SBL 总用时:12057us

引导加载程序执行完成为空...
=========================
Enet LWIP 应用
=========================
EnetAppUtils_reduceCoreMacAllocation:将 CoreID:0的 Mac 地址分配从4减少到2
链路状态已更改。 PHY:0x0、状态:向上
打开 MAC 端口2
EnetPhy_bindDriver:PHY 0:OUI:080028型号:0f 版本:03 <->'D-P83869':确定
PHY 0处于活动状态
在启动 lwIP 时、本地接口 IP 启用了 DHCP
[LWIPIF_LWIP] NETIF 初始化成功
主机 MAC 地址-0:70:ff:76:1f:61:88
[LWIPIF_LWIP] Enet 已成功启动
[0] status_callback==up、本地接口 ip 为0.0.0.0
UDP 服务器侦听端口5001
Cpsw_handleLinkUp:端口2:链路接通:1Gbps 全双工
MAC 端口2:链路接通
[0] link_callback==up
5. 69s : CPU 负载= 3.63 %

###当 Enet 读取 EEPROM 时、如果 PWM ISR 使用50%的 CPU 利用率、则输出不工作

### LWIP INIT 在尝试读取 I2C EEPROM 时停止

正在启动 NULL 引导加载程序...
kpi_data:[bootloader_profile]引导介质:未定义
kpi_data:[bootloader_profile]引导映像大小:0 KB
kpi_data:[bootloader_profile]当前核心:
kpi_data:[bootloader profile] System_init:378us
kpi_data:[bootloader profile] Drivers_open:50us
kpi_data:[bootloader profile] LoadHsmRtFw:8584us
kpi_data:[引导加载程序配置文件] SBL end : 3042us
kpi_data:[bootloader_profile] SBL 总用时:12054us

引导加载程序执行完成为空...
=========================
Enet LWIP 应用
=========================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Huey、

    这一点我已经开始研究。 我将很快分享一个更新。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Huey、

    虽然我仍在努力根本解决这种情况(可能存在一些问题、即在进入高优先级 PWM 中断之前中断位未清除)、但我确实需要一种权变措施。

    如果您没有从 EEPROM 读取 MAC 地址的硬性要求、您也可以从 SYSCFG Enet (CPSW)手动分配 MAC 地址。 这样可以避免 EEPROM 读取、并绕过该问题。 仅在没有从 EEPROM 读取 MAC 地址的硬性要求时才起作用。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也可以从第4个图像看、ICSR 寄存器的值显示接收端(0x1C18)有 I2C 溢出。 如果可能、您一次可以尝试降低 PWM ISR 的频率、以便 CPU 有更多空闲时间处理 I2C 中断。 我在这里怀疑 CPU 没有足够的时间来处理中断并达到超限。 只是一个猜测,可能是不正确的。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Huey、

    我尝试在 AM263PX-CC 上重现问题。 我无法观察到 Enet 初始化失败。

    实验1 (40KHz、时基周期= 2500):

    实验2 (4kHz、时基周期= 25000):  

    -我做了配置文件,并确保 ISR 是否正在执行25us 类似上面共享的屏幕截图,即使这样,我没有遇到问题。

    -我还与一些来自 controlSS 团队的专家进行了交谈,他们成功地在非常高的频率下运行了 ePWM (作为 OBC 参考设计的一部分,是500kHz 至800kHz )。我在以更高的速度运行 ePWM 时没有看到任何问题

    只是为了确保没有对电路板进行硬件修改? 我一直在问、因为我还无法重现这个问题。  

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shaunak、请更新图片、它们看起来像断开的链接。

    我已恢复了示例项目、它看起来像是发行版编译工作、但调试仍然无法正常工作。  以下是重新创建失败的工程的更新说明。

    使用 CCS 20.1.1.8和 MCU SDK 10.2.0.15

    1. 导入 enet_lwip_cpsw 示例
    2. 右键点击以下文件、然后点击"Exclude from Build"
      1. main.c 和 example.syscfg
    3. 将以下文件解压到工程中
      1. se_main.c 和 se_example.syscfg
      2. e2e.ti.com/.../se_5F00_files.zip
    4. 将构建配置更改为 Debug
    5. 构建并运行工程
    6. 控制台应卡在"ENET LWIP APP"接头处
    7. GPIO65/HSEC 86/Breakout J21_18应显示代码进入 PwmISR ()时的波形。  此值应该为50% (版本更小、因此不存在时序问题)

    LMK (如果重现 I2C 溢出问题时出现问题)。  谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Huey、

    我能够使用上述步骤重现问题、谢谢。 我现在正在研究它、

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Huey、

    我进行了一些性能分析实验、并分享了下面的结果。

    1.昨天我重现了你的问题,在同一个 enet init 中运行失败。 我点击了 I2C_Transfer 函数一次、但稍后无法到达该断点。 我尝试了分析您 main.c 文件中用于执行 GPIO 切换的 PwmISR 函数。 平均而言、我看到 PwmISR 每50us 命中一次断点(这与您上面分享的波形一致)。

    2.根据上述观察结果、可以清楚地看到所有其他 I2C 事务都需要在我们拥有的25us 窗口内完成。 我还尝试了对 I2C_Transfer 函数进行性能分析。 在以太网初始化期间、I2C_TRANSFER 断点总共达到33倍、一些事务花费的时间更长、其他事务不长。 要使以太网初始化完成、所有这些 I2C 事务必须成功完成。 这些事务用于从 EEPROM 获取 MAC 地址以及在 AM263Px-CC 上配置 MAC 端口2 IO 扩展器(下面随附了函数调用栈)。

    现在、2次后续 I2C 传输之间的时间 如下(配置自 CCSTUDIO 内部时钟)

    从上述 I2C_TRANSFERS 分析中、突出显示了该问题。 在 I2C 事务完成之前、会接收到 PWM 高优先级中断、并且 I2C 事务保持不完整、从而在 I2C 端达到溢出。  

    我已经恢复了示例项目、它看起来像是发行版编译工作、但调试仍然不起作用。

    上面共享的所有分析都是通过调试构建完成的。 版本构建针对代码的速度和大小进行了优化。 您确实看到版本构建正常工作(以太网和 PWM ISR)。 这符合我们的猜测、即 I2C 事务没有足够的时间完成、而高优先级 PWM ISR 会使其中断、并导致以太网初始化在系统级别出现故障。 在版本编译的情况下、代码将被优化、我假设 I2C 事务不需要很长时间(如调试编译的情况中所示)。 由于此版本编译正常工作、或者如果您确保有足够的空闲时间(当前空闲时间为25us)、则应用程序正常工作。

    现在、从 PWM 的角度来看、这并不意味着 AM263Px 不能以更高的频率运行。 如前所述、在一些参考设计和测试中、我们在500kHz 至800kHz 的范围内进行了测试(确保 ISR 较小且确定性)。 只有在初始化过程较长(例如 Debug Build 中的以太网)时、才会出现该问题。 仅在这种情况下、您才会观察到组合(以太网+ PWM)系统发生故障。

    如何进一步减少 I2C 开销?

    1.使用以太网时、可通过 SYSCFG/分配 MAC 地址或覆盖以太网代码以不从 EEPROM 读取 MAC addr、从而进一步减少 I2C 调用。

    2.设计定制电路板时、没有复杂的 IO 扩展器将减少一些 I2C 开销

    如果您有任何其他问题、请告诉我

    此致、
    Shaunak