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.

[参考译文] F29H85X-RTIN-EVM:SOM 上的 RTINT

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1496365/f29h85x-som-evm-rtint-on-f29h85x

器件型号:F29H85X-EVM-EVM SOM
主题:SysConfig 中讨论的其他器件

工具/软件:

我将 使用 FreeRTOS 将在 F28374D 上的裸机环境中开发的代码移植到 F29H85x。

我有3个任务:

  • FreeRTOS 每1ms 调用一次 main_task
  • 由 main_task 每20ms 通知一次 ZCD_Task
  • UART_DBG_TASK  由来自 UART Rx 中断的中断驱动通知发出通知。

我还使用3个中断:

  • timer1_INT 优先事项40
  • uart0_INT 优先事项250
  • EPWM0_ET_INT 优先事项30

所有中断 都配置为"INT"(它们使用软件栈、而不是硬件栈):一切正常!

然后、我尝试将 EPWM0_ET_INT 优先级从30更改为10; RTINT 阈值为20

几秒钟后、代码进入 Interrupt_defaultNMIHandler 并冻结。 以下是中断和任务优先级:

    1. timer1_INT 优先事项40
    2. uart0_INT 优先事项250
    3. EPWM0_ET_INT 优先事项10.
    4. timer2_INT 优先级255 (由 FreeRTOS 使用)
    5. FreeRTOS ZCD_TASK 优先级5
    6. FreeRTOS MAIN_TASK 优先级5
    7. FreeRTOS UART_DBG_TASK 优先级4"

有什么想法或建议?

谢谢

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

    尊敬的 Emanuale:

    运行 以下脚本时、您在 GEL 输出控制台中看到什么?  获得错误列表后、就可以利用错误聚合器、ESM 和相关的外设(例如 PIPE) TRM 章节来解码错误。

    BTW、您可以在 SysConfig 的 interrupts.txt 文件中找到中断及其关联配置的完整列表。 我个人使用它来可视化我正在处理的所有中断、尤其是在我修改其优先级时。

    此致、

    Aishwarya

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

    你(们)好

    在中停止执行时激活 ESM 后、我看到运行 GEL 脚本

    myNMI_ISR

    这是 interrupt.txt 内容:

    删除断点并继续执行代码、我看到:

    谢谢

    Emanuele

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

    Emanuele、

    由于它卡在 NMI 中、因此通常来说、请确保在运行代码之间重新启动 CPU、以使 CPU 脱离 ISR (不可中断)上下文。

    我认为这来自 Device_init ()中的"Device_errataWorkaroundNMIVectorFetch ()"函数。 如果您 使用的是 ERAD / EPWMXBAR、 请确保使用的实例不与此函数中的实例相同。  这可能是因为 中出现了一些错误 、然后当代码重新启动时、原始错误、然后 背靠背发生了与勘误权变措施相关的错误、从而导致 NMI。 我要在加载之间进行下电上电、以清除 ESM/错误聚合器、或使用 加载/运行示例之间的脚本清除错误。  

    此时、再次尝试加载代码并查看错误持续存在的情况、尤其是在逐步使用断点时。 在您的应用程序代码中、确保您的计时器和 ePWM ISR 正确计时、 因为这可能会导致溢出。  

    此致、

    Aishwarya

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

    您好、

    我有其他信息。

    正如我报告的那样、当我将 PWM ISR 的中断优先级从30更改为10 (低于 RTINT THR 20)时、代码会崩溃

    我将 ESM 模块添加到代码和 NMI ISR 中。

    然后添加了 NMI ISR 的代码。

    这是到达断点时看到的内容:

    活动事件为 ESM_EVENT_ErrorAggator_CPU1_HPERR

    CPU1_PR_ERROR_TYPE 显示为非法指令  

    CPU1_DR1_HIGHPRIO_ERROR_ADDRESS = 0xDEADDEAD 我认为这意味着什么…

    CPU1_DR1_HIGHPRIO_ERROR_ADDRESS = 0x200E9664 => ILLEGALZERO

    CPU1_PR_PC 指向地址0x100101ec

    你有什么想法吗?

    谢谢

    Emanuele

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

    您好、

    其他信息:查看映射文件、在 SDK 的 portasm.asm 文件中执行"profile2_end ()"指令时发生崩溃

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

    你(们)好

    其他实验结果(我不知道它们是否有用):

    如果我将上下文更改为 PWM ISR (从默认上下文0更改为上下文1)、则代码不会进入 NMI、但 PWM_ISR 始终不会得到处理、并且我会读取

    INT_EPWM1 -溢出、启用、 链路= 2、ISR = 0x20106AA0、优先级= 20、 ContextID = 1

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

    Emanuale、

    无需更改上下文、否则会导致 ISR 不会执行(稍后将再次解释此概念)。  

    您能否确认是否所有 ISR 都是通过 SysConfig 配置的、如果在 board.h 中、它们具有指示 ISR 是 INT 还是 RTINT 的编译器属性。 如果未通过 SysConfig 配置 ISR、则需要将这些 ISR 添加到应用程序代码中定义的位置。 您不需要在两个位置使用属性、只需一次即可(请参阅 此处)。 类似这样的东西...

    __attribute__((interrupt ("RTINT")))- RTINT 

    __attribute__((interrupt ("INT"))- INT 

    让我在最后进一步研究这一点、并尝试重现此问题。  

    此致、

    Aishwarya

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

    您好、

    我可以确认代码是使用 syscfg 配置的。

    我也尝试使用"attribute"、同样的结果:

    CPU1_PR_PC 提供端口 ISR_TICK (FreeRTOS)中使用的地址

    我不知道该怎么办。

    谢谢

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

    Emanuale、

    根据提供的信息、问题似乎可能与 FreeRTOS ISR 有关(可能全部是第三次)。 如错误聚合器所述、它指向其中一个 FreeRTOS ISR 中的非法指令、特别是".TI.INT"、这是 INT ISR 的退出指令。 由于此 ISR 是 RTINT、反汇编代码实际上应该注意"RET.PROT"。 同样、在 RTINT ISR 的开头、应该有"ISR1.PROT || ISR2.PROT"。  

    反汇编中不存在这些必要说明的原因可能是因为我在上一个关于属性的回答中所说的。 看起来这些 FreeRTOS ISR 函数原型 是在非 SysConfig 生成的文件中创建的、需要正确的中断中断属性。

    这也适用于需要"RTINT"编译器属性的 NMI 处理程序、该属性可能导致您看到的 PC 错误。 C29x CPU 参考指南 更详细地介绍了这些汇编指令及其重要性。 任何使用中断的 SW 示例都将展示如何设置这些中断。 请注意、首次声明 ISR 函数时只需要使用一次中断属性。  

    以下是有关上下文 ID 的更多信息: F29H850DM:上下文的校准

    此致、

    Aishwarya

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

    您好、  

    感谢您的回答:

    Timer1_ISR 不是用于 FreeRTOS 中的节拍的 ISR;FreeRTOS 使用 TIMER2。

    为确保 syscfg 生成 TIMER2 (由 FreeRTOS 使用)的初始化代码。 ISR 的代码是 SDK 1.0.0.0版中内核源代码的一部分。 BSL 代码。

    TIMER2中断的优先级为255、因此它是 INT 而不是 RTINT。

    RTINT 是具有优先级10的 PWM_ISR。

    现在、所有 ISR 都具有 __attribute__((interrupt ("")))属性。  

    我也将中断属性添加到 NMI、但结果相同

    此致

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

    Emanuale、

    您是否可以 离线共享您的代码、以便我进一步了解这一点? 谢谢你。

    此致、

    Aishwarya

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

    我想我可以分享固件、这是一个概念验证、它没有反映我们产品中使用的最终版本、但我需要验证我们之前是否有有效的 NDI。

    让我来看看我们的 TI FAE

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

    Emanuale、

    谢谢、我也会在结束时进一步研究这一点、看看我能否重现问题。

    此致、

    Aishwarya

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

    Emanuale、

    感谢您分享您的代码。 遗憾的是、由于缺少头文件、我无法构建示例、并且无法看到您的 ISR 实现、只有初始配置。 我可以看到中断配置、但下面是一些其他思路和设置:

    1. 为简单起见、我要删除 SysConfig 中的 ESM/NMI 配置、并依赖 Driverlib 提供的默认 NMI 处理程序。 发生错误时、只需运行 CCS 中的错误处理脚本、检查寄存器视图中的相关寄存器、并在默认 NMI 处理程序中使用"NmiStatus"结构。 请告诉我其中的值是否与以前不同。  
      1. 我看到、当在 SysConfig 中添加 ESM 时、您会在一个 RAM 地址处得到"非法指令"、该地址不应该有有效的代码、只有数据。 因此、我想确保错误是由于这些新添加的内容导致的、或者始终存在。  
    2. 验证 RTINT 矢量是否正确设置在矢量表(也称为 PIPE 寄存器)中、并指向正确的处理程序以及其他配置。
    3. 检查生成的汇编代码:在 EPWM0_ET_INT 处理程序配置为 RTINT 时查看为其生成的汇编代码、重点关注进入和退出序列、并确保这些代码相应地包含"ISR1.PROT || ISR2.PROT"和"RETI.RTINT"。 将其与 INT 版本进行比较、以发现任何显著差异。

      1. 验证上下文保存/恢复:确保为 RTINT aka 正确执行上下文保存和恢复操作。指令已存在且正确、我也可以帮助您查看这些操作。  
    4. 在测试用例中、如果您将 ePWM ISR 设置为 INT、并将其他 ISR 之一设置为 RTINT、则会出现与您第一次看到的相同问题吗?
    5. 如果您将所有中断配置为 RTINT、执行是否正常?

    我询问了这些测试用例、以了解它是与 RTINT 执行相关、还是与 RTINT 与 FreeRTOS 的交互方式相关。 我来 尝试在使用和不使用 FreeRTOS 的情况下重现问题。

    此致、

    Aishwarya

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

    你(们)好

    此时会编译固件。 必须使用闪存配置。

    我 在3台不同的 PC 上尝试了固件、并在每台 PC 上进行编译。

    请重试

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

    您好、我在 SharePoint 上添加了一个新的文档、我在其中回答了您以前的问题:  F29H85x 错误 analisys.docx

    我回答了除第2点以外的所有问题:请澄清如何做到这一点。

    我们还可以使用本文档交换更详细的信息。

    在任何情况下、SharePoint 中的代码都可以正常工作。 我在上一个答复中告诉过你、你必须这样做  使用闪存配置 。 RAM 配置已过时、并且未包含所需的所有文件夹路径。

    另一件事:我还尝试创建一个裸机版本的代码(删除 freeRTOS );通过这种方式代码工作。

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

    Emanuale、

    对于第2号、PIPE 寄存器是否会指示 ISR 指向正确的处理程序、链接等、也即 下面寄存器视图中的以下信息。  

    此外、我们知道代码在没有 FreeRTOS 的情况下可以正常工作 、因此在 FreeRTOS 实现中、您能否确认 任何任务中是否有任何浮点寄存器? 如果是、则需要在任务函数顶部声明。 这可能会影响代码的编译方式。

    此致、

    Aishwarya

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

    你(们)好  

    在 port.asm 文件中使用 freeRTOS portTICK_isr 补丁更新 SDK 后、代码将正常运行!

    该补丁解决了该问题。

    感谢您的支持