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-Q1:混合 I2C 中断和轮询模式时、未定义指令 (PC=0x0)

Guru**** 2953060 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1629654/am263p4-q1-undefined-instruction-pc-0x0-when-mixing-i2c-interrupt-and-polling-modes

器件型号: AM263P4-Q1
主题: SysConfig 中讨论的其他器件

我在 SysConfig 中配置了“I2C 使能中断“设置、如下所示:
I2C1:启用(阻断)
I2C2:启用(阻断)
I2C3:禁用(轮询)

在这种配置下、当对具有以下任务结构的同一内核执行 I2C 控制时、会发生未定义指令异常:
任务 A:使用 I2C1 和 I2C2(调用 I2C_TRANSFER ())
任务 B:使用 I2C3(调用 eeprom_read/write()、它在内部使用 I2C_transfer())

如果我在调试器中的地址 0x0 处设置断点、当出现问题时、程序在 PC=0x0 处停止(这似乎是 NULL 访问)。

故障排除结果
1.删除了 I2C2 的 I2C_TRANSFER() 调用
 ->未定义指令异常不会发生
2.统一所有 I2C1-I2C3 以启用(分块)
 ->未定义指令异常不会发生
3.统一所有 I2C1-I2C3 以禁用(轮询)
 ->未定义指令异常不会发生

根据上述结果、异常仅在以下情况下发生:
-中断启用设置是混合的(I2C1/2:启用、I2C3:禁用)
-多个 I2C 实例同时使用多个任务

问题
1.在 I2C 驱动程序中、是否规范不支持或禁止系统内 I2C 实例之间混合启用中断设置(例如启用了中断的 I2C1/2、禁用中断的 I2C3)?
2.在启用中断的配置中,是否可以混合“阻塞“和“回调“传输模式?
注意:我使用的是 AM263Px MCU+ SDK 09.02.00

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

    你好、Imaoka、

    我已经联系了该器件的 I2C 专家、请允许他们 1-2 天做出响应。

    此致、

    Delaney

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

    你好、Imaoka、

    当混合启用中断 (I2C1/I2C2) 和轮询模式 (I2C3) 配置时:

    1. 竞态条件出现在中断处理程序和轮询循环之间
    2. 在某些时间场景中、currentTransaction 变为 NULL
    3. 中断处理程序在 PC=0x0 时取消引用 NULL→崩溃

    问题答案:

    1. 是否不支持混合启用中断设置?
      1. 是 — 混合配置公开此驱动程序属性。 虽然未明确记录为禁止、但由于此缺陷、它实际上不受支持。
    2. 是否可以混合“阻止“和“回调“模式?
      1. 是 — 但仅当所有 I2C 实例使用相同的中断设置时(全部启用或全部禁用)。

    建议解决方案

    • 立即修复(无代码更改):在 SysConfig 中统一配置所有 I2C 实例:
      • 选项 A:I2C1、I2C2、I2C3→全部使能中断(阻断)
      • 选项 B:I2C1、I2C2、I2C3→全部禁用(轮询)

    此致、

    Brennan

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

    您好 Brennan、

    我们实施了您建议的更改、但问题未解决。 结果如下。

    结果
    选项 A(所有使能中断(分块)):发生 PC = 0x0(未定义指令异常)
    选项 B(所有禁用(轮询)):没有问题

    验证
    在生成的 ti_drivers_config.c 中、我们确认了所有 I2C1/2/3 实例的 gI2cHwAttrs[]中 enableIntr = 1。 因此、我们认为 SysConfig 更改应用正确。

    问题
    ・在 SysConfig 之外是否有任何其他必要的配置?
    在 SysConfig 中、我们为 TI 驱动程序→I2C→CONFIG_I2C1/2/3 设置以下内容:
    启用中断:开启
    传输模式:阻塞
    ・在 AM263Px MCU+ SDK 09.02.00 中、在启用中断的情况下使用 I2C(阻塞模式)时、是否存在任何已知问题或限制?

    此致、

    Imaoka.

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

    你好、Imaoka、  

    是否可以共享 SYSCFG 文件? 我可以更好地查看配置并获得相关帮助。

    此致、  
    Pranav Siddappa.

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

    您好 Pranav、

    我们已通过电子邮件单独发送 SysConfig 文件。
    由此给您带来的不便、我们深表歉意、如果您能在今天结束前提供您的回复、我们将不胜感激。
    此致、Imaoka
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Imaoka、  

    我尝试在最后重现此问题以进行调试。 我以前没有观察到这种情况。 我会在内部通知模块所有者来帮助调试这个问题。  
    很抱歉耽误你的时间。  

    此致、  
    Pranav Siddappa.  

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

    你好、Imaoka、  

    选项 A(所有启用中断(阻止)):PC = 0x0(未定义指令异常)发生

    我对例外发生的时间感到困惑。 您能澄清一下情况吗?

    此致、  
    Pranav Siddappa.

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

    你好、Pranav  

    下面是对情况的总结。

    环境:AM263Px MCU+ SDK 09.02.00
    任务 A:使用 I2C1 和 I2C2(调用 I2C_TRANSFER ())
    任务 B:使用 I2C3(调用 eeprom_read ()/write ()、它在内部使用 I2C_transfe ())

    包含第一个报告代码的测试结果(自 2026/2/16 起)
    ・中断和混合轮询:发生未定义指令异常。 (QA 表示不支持此组合。)
    ・所有中断阻塞:无问题
    ・所有轮询:没有问题

    使用第二个报告代码时的测试结果(自 2026/4/6 起)
    ・所有中断阻塞:发生了未定义的指令异常。
    ・所有轮询:没有问题

    缩小条件范围
    ・为了调查未定义指令异常的原因、我们在地址 0x0 处设置了一个断点、并在 0x0 处中断。
    ・即使使用相同的代码、在添加一行日志记录或插入休眠时也不会出现问题。
    ・当 I2C2 呼叫被移除时、此问题不会发生。

    →问题的发生是否似乎取决于 I2C2 的 I2C_TRANSFER () 的执行时序。
    (第一个报告的代码可能仅由于时间原因而未遇到问题。)

    其他调查结果
    我们在实现中发现了一个单独的错误、其中 i2cWriteTransaction.timeout 是以单位(而非微秒)设置的。
    根据以下 E2E 主题、在 SDK 9.2 中应以微秒为单位指定超时:
    e2e.ti.com/.../mcu-plus-sdk-am263x-i2c-hld-timeout

    测试结果:
    1us(我们打算将转换为 tick 的 1000us 设置为 tick、但实际上变为 1us):NG(发生 PC=0x0)
    1000us:正常

    →设置极短的超时值是否与我们遇到的 PC=0x0 问题有关?

    您能否在 4 月 27 日之前回复?

    此致、Imaoka

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

    你好、 Imaoka、  

    以下是我根据您的总结得出的观察结果:

    • 由于行为不一致、这很可能是由 I2C 实例之间的同步问题引起的
    •  由于它可能是由于 同步、因此在您的情况下添加更长的延迟/记录可能会避免它
    • 您能否分享表明其为 PC=0x0 错误的日志的屏幕截图?
    • 同时、我正在内部检查此 同步是否 由于驱动程序效率低下而导致

     对不起,延迟的回复,我是 OOO 因此无法得到它。  

    Pranav Siddappa.

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

    你好、Pranav

    我将分享一个显示“PC=0x0“错误的屏幕截图。

    您能否在 5 月 11 日前回复?

    此致、Imaoka

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

    尊敬的 Imoaka:  

    我将对此进行研究。 添加更长的延迟是否解决了同步问题?

    此致、  
    Pranav Siddappa.

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

    你好、Pranav

    >我会研究一下。

     ->您是否可以在 5 月 20 日前分享调查结果?

    >添加更长的延迟是否解决了同步问题?

     ->是。添加延迟后、问题不再出现。

    此致、Imaoka。

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

    你好、Imaoka、  

    我是 OOO 直到 20/05。 请预计响应会延迟。  

    此致、  
    Pranav Siddappa.

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

    你好、Pranav

    我们希望了解您的调查的当前状态。
    如果您能分享任何更新或进展、我们将不胜感激。

    此致、Imaoka。

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

    你好、Imaoka、  

    即使经过多次尝试、我也无法在我这边重现确切的问题 由于您提到这不是一个持续反复出现的问题、因此可能很难重新创建。  

     ->是。添加延迟后、问题不再出现。

    很高兴知道添加延迟有助于解决问题。

    测试过程中真实的 EEPROM 器件是否物理连接到 I2C3、它是否正常响应(跟踪传输)? 此 详细信息将有助于确认超时单元校正是否足够或是否有其他问题需要调查。

    如果您想详细检查问题、我可能需要调查您使用的应用程序代码。 您能否分享可以重现此问题的应用程序代码?   

    此致、  
    Pranav Siddappa.

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

    你好、Pranav

    >在测试过程中、真正的 EEPROM 设备是否物理连接到 I2C3、它是否正常响应(跟踪传输)?

    是的。 在测试期间、实际的 EEPROM 器件物理连接到 I2C3。 另外、eeprom_write() 成功完成、并且我们已确认可以将任意数据写入 EEPROM、并且读回数据匹配。 因此、我们认为 EEPROM 会返回 ACK 并正常响应。

    >采用第二个报告代码的测试结果(自 2026/4/6 起)
    ・所有中断阻止:发生未定义指令异常。
    >・所有轮询:没有问题

    我将在单独的电子邮件中发送用于上述验证的代码、因此请继续调查。
    如果可能、您能否在 6 月 1 日前分享调查结果?

    此致、Imaoka。

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

    你好、Imaoka、  

    当然、我会查看代码并尝试在我这边生成 当您通过邮件发送代码后、请在此处提交回复、以便通知我。  
    我们会尽快为您提供更新。

    此致、  
    Pranav Siddappa.

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

    你好、Pranav

    发送给 TI 日本支持团队的代码。

    我已请求将其转发给 Pranav、因此请在收到后进行审查。

    此致、Imaoka。

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

    你好、Imaoka、  

    我已经收到了。 我们会尽快更新您。  

    此致、  
    Pranav Siddappa.

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

    你好、Imaoka、  

    您发送的项目似乎没有在 mysetup 上构建。 我正在将 SDK 9.02.00 与 ti-cgt-armllvm_3.2.LTS 编译器和 SYSCFG-1.20.00 搭配使用。 请告诉我所需的环境是否不同。
    此外、我相信您已经在标准 9.02.00 SDK 的基础上应用了补丁。 您还能分享一下吗?  

    此致、  
    Pranav Siddappa.

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

    你好、Pranav

    我们理解翻译后的补丁文件已通过 TI 日本支持团队转发给您。
    如果您能向我们提供有关进展的任何最新信息、我们将不胜感激。

    此致、Imaoka。

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

    你好、Imaoka、  

    我收到了补丁文件。 我设法在 RAM 模式下构建和运行演示。 除了将 PC 寄存器复位为 0x0 之外、我没有观察到任何其他情况。 我还没有在闪存模式下进行测试。
    仅当您在器件的闪存模式下刷写演示时、才会出现问题吗?   

    此致、  
    Pranav Siddappa.

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

    你好、Pranav

    当将演示编程到器件上并在闪存模式下运行时、我们能够重现问题。 另一方面、我们尚未测试 RAM 模式、因此不清楚它是否仅发生在闪存模式中。

    您能否在 7 月 3 日前回复

    此致、Imaoka。

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

    尊敬的 Imoaka:  

    在闪存模式下运行您共享的应用程序时、我有不同的观察结果。 我在 AM263px-LP 上运行了该应用、没有任何问题。
    是否可以进行调试调用、那么我们可以提供更好的帮助?  

    此致、  
    Pranav Siddappa.