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.

[参考译文] AM2732:AM2732中断嵌套异常

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1369017/am2732-am2732-interrupt-nesting-exception

器件型号:AM2732

工具与软件:

当一个低优先级 IRQ 中断继续执行时、一个高优先级中断只能被中断一次

Premise:系统中只有两个不同的优先级周期定时器可以中断 IRQ1和 IRQ2、而 IRQ1的优先级高于 IRQ2;

Operation:在 IRQ1中执行相对较长的延迟、以确保 IRQ2在延迟周期;内可被多次触发

现象:无论 IRQ2延迟事件持续多长时间、IRQ1在 IRQ2延迟期间只能触发一次中断;

这种现象不符合对中断嵌套的传统理解。 如果 AM2732对该器件有特殊要求、请进行说明。 否则、请协助解释这种现象的原因和解决方法。 谢谢。

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

    大家好、

    在回答大家的问题之前、我先回答几个问题。

    您的实验是如何进行的?

    您使用的硬件平台(AM273x EVM)是什么?

    您正在使用哪个版本的 MCU+ SDK (09.02.00.52是最新版本)?

    您使用的是 FreeRTOS 还是 NORTOS?

    通常、如果嵌套中断受到支持、高优先级中断可以中断低优先级中断处理。 但是、如果没有正确退出高优先级 ISR (中断屏蔽或没有 EOI)、那么之后可能无法正确处理较高优先级的中断。

    此致、

    Ming

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

    感谢您的回答。 我将逐一回答您的问题。


    1.我在低优先级 IRQ2中进入了"while (1)"循环、没有让 IRQ2退出。 我等待高优先级 IRQ1中断、然后在 IRQ1的中断服务函数中使用变量"Irq1_Cnt"进行计数。 最后、我发现 Irq1_Cnt 的值为1、因此 IRQ1可以中断 IRQ2、但只能中断一次。


    2.我使用的平台是 AM273x EVM。


    3&4. 我没有使用任何 SDK 相关代码进行中断处理。 我们针对这个芯片改编了 AUTOSAR OS、驱动中断、保护场景、恢复场景、输入中断等等 确认中断以及退出中断、所有这些都是由我们自己实现的。


    附件:我发现当 IRQ1不能中断 IRQ2时、观察 VIM 寄存器时、PRIIRQ 中显示的相应中断为 IRQ1、而 ACTIRQ 中显示的中断为 IRQ2;
    注意:IRQ1对应的中断编号为109、中断优先级为2
    IRQ2的中断编号为13、中断优先级为3
    下面随附了相应的现场屏幕截图:https://i.afbcs.cn/vCfGru

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

    大家好、

    首先要检查的是程序状态寄存器的 I 位

    另一个要检查的寄存器是 IRQ 屏蔽寄存器。 确保 IRQ1未被屏蔽

    请检查以下寄存器的值:

    #define VIM_STS (j)(0x404U +(((j)>> 5)和0xFU)* 0x20U)
    #define VIM_INT_EN (j)(0x408U +(((j)>> 5)& 0xFU)* 0x20U)
    #define VIM_INT_DIS (j)(0x40CU +(((j)>> 5)& 0xFU)* 0x20U)

    此致、

    Ming

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

    感谢您的答复:
    我已经确认 CPSR i 的值为0、该值属于使能全局中断状态;
    针对高优先级 IRQ1 (中断源109)的相应寄存器如下:
    与 IRQ1对应的 VIMsTS 寄存器的位为1 (VIMsTS_3=0x00002000);
    与 IRQ1对应的 VIP_EN_SET (VIP_INT_1N)寄存器的位为1 (VIP_EN_SET_3=0x00002000);
    对应于 IRQ1的 VIP_EN-CLR (VIP_INT-DIS)寄存器的位为1 (VIP_EN-CLR-3=0x00002000);

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

    大家好、

    AM273x 勘误表(www.ti.com/.../swrz101)中对此进行了记录 、并提供了权变措施:

    此致、

    Ming

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

    我使用上述方法无法实现、
    您能否提供相应的驱动程序或测试例程

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

    大家好、

    当您说"我无法使用上述方法实现它"时、您是说您不能实施该变通办法、还是该变通办法未按预期运行?

    遗憾的是、我们手头没有解决方法的驱动程序和测试程序。

    解决勘误表的想法是避免背对背相同的中断。 为了实现这一目的、通过在每个 ISR 中设置中断请求寄存器来虚拟最高优先级中断。

    当然、最简单的做法是确保 IRQ1在 IRQ2 ISR 中不会发生多次。 为了实现这一点、可以将冗长的处理从 ISR 迁移至高优先级任务、从而使所有 ISR 非常简短快速。 不管怎样、这始终是一种良好的做法。

    此致、

    Ming  

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

    大家好、这些天我一直在尝试使用 AM273x 勘误手册中所述的方法来修复硬件问题。 但是、我们在测试后发现、虽然原来的问题已经解决、但会导致新的问题。 我们发现有些中断没有得到正确回应。

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

    大家好、

    您能否再详细阐述一下"有一些中断没有得到正确响应"。

    此致、

    Ming

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

    您好、完成上述中断嵌套测试后、我导致系统退出 IRQ2。 此时、我发现其他中断 IRQ3 (优先级低于 IRQ2的中断) 无法接收正常响应。 然而、在中断嵌套测试之前、IRQ3能够正常运行。 我观察到与 IRQ3对应的 VIM_STS 寄存器、发现无法正确设置相应的位、但成功设置了 VIM_EN_SET、并且与 IRQ3对应的外设中断标志也可以正常设置。

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

    大家好、

    VIM_STS (intNum)是 VIM_RAW (intNum)和  VIM_EN (intNum)。 如果未设置 VIM_STS (intNum)且设置了 VIM_EN (intNum)、则必须清除 VIM_RAW (intNum)。 唯一  可以清除 VIM_RAW(intNum)的地方是 Hwip_clearInt ()。 请确保 在处理 IRQ2、IRQ1和 IRQ0 (最高优先级虚拟 IRQ)时从未调用 HWIP_clearInt (IRQ3)。

    此致、

    Ming

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

    您好:
    我确信没有其他方法可以清除 VIM_STS、因为我们使用的是 RTI 模块、该模块会触发周期计时器中断。 我们发现 RTI 计数器运行正常、比较器也可以正常刷新、并且与 RTI 模块对应的中断标志位 RTIINTFLAG 也可以正常设置、但无法触发中断。 我们无法理解这种情况的原因。

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

    大家好、

    您能否共享您的 CCS 项目和源代码、以便我们能够再现同样的效果?

    此致、

    Ming  

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

    您好 Ming Wei,源码《ProgramSC1_20240329_2》已经上传,请检查 confirm.e2e.ti.com/.../AM273x_EE9598980D59B073_.pdfe2e.ti.com/.../AM273x_EE9598980D59B073_.docxe2e.ti.com/.../ProgramSC1_5F00_20240329_5F00_2.zip

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

    Hi Current、

    非常感谢您的源代码和文档。 我会在 AM273x EVM 上对其进行测试、下周早些时候与您联系。

    此致、

    Ming  

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

    Hi Current、

    我已经在 AM273x EVM 上测试了您的代码。 它不会 QM和Core0 Os_Init ()、因此 Core0_TEST_App1_Task_5ms_Δ t_test_App1_Task_10ms_QM 为零。

    在研究代码后、我看到了两个问题:

    1. 您实施 i2162变通办法的方式值得怀疑。 您 在 主 IRQ 处理程序 Os_Arch_Irq 中调用了 Os_Arch_Irq eventmyNest()。 在 Os_Arch_Irq myNest()中、为虚拟 IRQ (76)设置中断标志、然后将其清除。 我不确定这是实施权变措施的正确方式。 以下是我对该权变措施的理解:

    a.将 Os_Arch_Isr 中的 IRQ76设置 Table_Os 为 dummyIrq76Handler、在该过程中会清除中断标志

    b.  Os_Arch_Irq 中设置的虚拟 IRQ (76)的中断标志、该标志将触发 IRQ76并调用 dummyIrq76Handler  

    c.然后、到当前 IRQ (IRQ76除外)的过程将继续。

    2.我不明白以下的订书在 Os_Arch_Irq my541():

    获取中断向量。 */
    irqVecValue =*(Volatile UINT32*)(OS_ARCH_VIM_BASE_ADDR + OS_ARCH_VIM_IRQVEC);
    /*写入任意值以允许下一个中断。 */
    *(Volatile UINT32*)(OS_ARCH_VIM_BASE_ADDR + OS_ARCH_VIM_IRQVEC)= irqVecValue;

    此致、

    Ming

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

    Ming 您好:
    我将对你的疑问作出以下答复。
    1.我们当前的解决方案是严格遵循 TI 提供的勘误手册中所述问题对应的权变措施(i2162)。 每个步骤可与 TI 提供的解决方案进行比较。 如果您对我们的方法有疑问、我们希望收到您的驱动程序例程以解决问题。
    2.关于"1. ABC"、那么您是否希望实际触发 IRQ (76)中断并执行中断回调程序? 但是、TI 提供的解决方案明确指出中断不需要输入特定的中断回调、甚至可以屏蔽。
    3.您提出的问题"2"对应于"变通办法"中的步骤3和5。 如果您有任何疑问、可以阅读本手册或为我们提供相应的解决方案。
    谢谢你。

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

    尊敬的 Renjia:

    我将联系为此勘误表编写变通办法的人员、并要求提供此变通办法的测试代码。 我们下周早些时候会给您回复  

    此致、

    Ming

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

    尊敬的 Renjia:

    最后、我成功地运行了您的测试程序。 我以前无法运行测试程序的原因是 AM273x EVM 未正确初始化。 我正在使用 C:\ti\mcu_plus_sdk_am273x_09_02_00_52\tools\boot\sbl_prebuild\am273x-evm\default_sbl_qspi.cfg 来刷写 QSPI 闪存。 当我更改为使用 C:\ti\mcu_plus_sdk_am273x_09_02_00_52\tools\boot\sbl_prebuild\am273x-evm\default_sbl_null.cfg 以刷写 QSPI 闪存、从闪存进行引导(以初始化 AM273x SOC 并使用 CCS 加载程序)时、您的测试程序会正常运行。

    第一次暂停后的屏幕截图:  

    第二次暂停后的屏幕截图:

     Core0_TEST_App1_Task_5ms_QM 和 Core0_TEST_App1_Task_10ms_QM 都可以继续计数。 OTestStatus 为 OS_TEST_SUCCESS。

    请检查 SOC 初始化。 请参阅 QSPI 闪 存详细信息的 URL:AM273x MCU+ SDK:闪存 Hello World 示例(TI.com)

    此致、

    Ming

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

    Ming 您好:
    我又用硬件开发板在手中再做测试、这个现象还是非常异常的。 根据您的测试结果、差异是否可能是由我们的硬件不一致引起的? 我将拍摄我硬件的照片并发送给您。 我希望你能帮我。

    谢谢你。

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

    尊敬的 Renjia:

    我注意到 EVM 与 EVM 有两个不同之处:

    1.您使用的是"无引导"模式。 我使用 QSPI 引导模式。 如何初始化 SOC? (使用 GEL 文件?) 请尝试将 SBL_NULL 与 QSPI 引导模式配合使用并加载程序。

    我的 EVM 有 HS-EVM FS 器件、但您的 EVM 有 GP 器件、但我认为这不会导致任何问题。 我很快会在 GP EVM 上尝试相同的测试。

    我们的两个 EVM 都是修订版 C

    此致、

    Ming

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

    尊敬的 Renjia:

    我使用 GP 器件在 AM273x EVM 修订版 C 上测试了您的应用。 结果与 HS-LVDS FS 器件相同。 根据结果、如果您使用 QSPI 引导模式(QSPI 闪存中具有 SBL_NULL)、那么您的程序应该已经能够正常工作。

    此致、

    Ming

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


    Ming 您好:
    该问题是否与芯片批次有关

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

    尊敬的 Renjia:

    我不这么认为。 您是否已在 QSPI 闪存和 QSPI 引导模式下尝试使用 SBL_NULL?

    此致、

    Ming

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

    尊敬的 Ming:
    抱歉、由于个人原因、在此期间我无法正常工作、因此我现在只回复您。 我不知道如何使用 QSPI 引导模式、希望您能帮助我。 我不知道为什么不同的引导模式会带来如此大的差异、您是否可以使用无引导模式来帮助测试它。

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

    尊敬的 Renjia:

    请按照以下 URL 的"使用 QSPI 存储器中刷写的二进制文件进行 SOC 初始化"一节中所述的步骤进行操作:

    AM273x MCU+ SDK:其他详细信息

    它 详细介绍了如何使用 QSPI 引导模式。

    此致、

    Ming

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

    尊敬的 Ming:

       我已成功下载文档中所述的 SBL-NULL 文件。 但我无法成功连接到它。 即使芯片已复位、也无法连接。 这可能是什么原因。谢谢!

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

    李耿、您好!

    请从 ccxml 文件(目标配置文件)的 CS_DAP_0中删除所有 gel 文件:

    此致、

    Ming

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

    尊敬的 Ming:

       感谢您的支持。 问题实际上不再出现。 但问题的真正原因尚不清楚。 无引导模式使用 GEL 文件进行引导、在 QSPI 引导模式下、使用 default_sbl_qspi.cfg 文件和 default_sbl_null.cfg 文件之间有何区别? 他们做了什么?

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

    您好、耿、

    无论如何不建议使用 No Boot 模式。 它与 CCS 的 AM273x CSP 有着某种关联。

    default_sbl_qspi.cfg 会将两个映像刷写到 QSPI 闪存中、即 SBL_QSPI 和应用程序映像、即 ROM 引导加载程序(RBL)--> SBL_QSPI -->应用程序映像、因此应用程序代码最终将在 R5F 内核上运行。 根据所执行的应用程序映像、R5F 内核可能不可连接。  

    另一方面、default_sbl_null.cfg 仅将 sbl_null 闪存到闪存 RBL --> sbl_null。 ESBL_null 会使所有内核脱离复位状态、并将它们放入 WFI 环路、以便所有内核可用于连接。

    此致、

    Ming