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.

[参考译文] AM64X-ADVANCE-SW:在 R 内核中使用中断平稳关断实现

Guru**** 2667985 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1591324/am64x-advance-sw-graceful-shutdown-implementation-in-r-core-using-interrupt

器件型号:AM64X-ADVANCE-SW
主题: SysConfig 中讨论的其他器件

您好、

我将 AM642 EVM 与 MCU+ SDK 11.1.0.17 (R5F 上的 FreeRTOS、TI-Clang 4.0.1.LTS) 和 Linux 6.12.35 (PREEMPT_RT) 配合使用。 一个 R5F 内核运行 CT/GPIO 任务、该任务使用通过 SysConfig 配置的 VT 中断(ADC DRDY 引脚)、该中断调用Sciclient_gpioIrqSet()/Sciclient_gpioIrqRelease()

在 Linux 中、我使用以下命令停止核心:

echo stop > /sys/class/remoteproc/remoteproc13/state

在 R5F 端,我处理 RP_MBOX 关闭通知和设置gShutdown = 1u。 我的所有 RPMsg 接收/传输任务和 CT/WFI VT 环路在时中断gShutdown == 1u、发送关闭确认、关闭驱动程序、然后转到 WFI。 在 CT/CIT VT 代码中、我还:

  • 断开上的读取循环gShutdown

  • 在此循环之后、清除 GPIO 组中断状态。

  • 调用 HwiP_destruct(&gGpioHwiObject);

  • 调用Board_gpioDeinit();它调用 SysConfig 生成的Sciclient_gpioIrqRelease()

停止工作、但当我重新启动时:

echo start > /sys/class/remoteproc/remoteproc13/state

新固件在中崩溃Sciclient_gpioIrqSet()

root@am64xx-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc13/trace0
[r5f0-0] 0.001295s : [IPC RPMSG ZEROCOPY] Nov 25 2025 12:43:25
[r5f0-0] 0.001390s : [Error] Sciclient event config failed!!!
[r5f0-0] 0.001413s : ASSERT: 0.1411s: syscfg/ti_drivers_config.c:Sciclient_gpioIrqSet:155: FALSE failed !!!

因此、当内核重新启动时、GPIO 事件路由看起来仍然被视为“正在使用“。

问题:

  1. AM64x 释放此 GPIO→R5F 中断以便Sciclient_gpioIrqSet()在 Remoteproc 停止/启动周期后成功的正确方法是什么?

  2. Sciclient_gpioIrqRelease()在关机期间从我的 RTOS 任务调用是否足够、或者这是否应该以不同的方式进行(例如,在特定的 deinit 挂钩中或使用额外的 RM 步骤)?

  3. 是否有任何示例显示 R5F 上的 GPIO 中断使用情况并remoteproc从 Linux 重复停止/启动?

谢谢、
闪亮

提供
MCU_PLUS_SDK_am64x_11_1_0_17

Linux 版本
Linux am64xx-EVM 6.12.35-g0116b922b9b3-dirty #28 SMP_PREEMPT_RT 11 月 19 日 11:53:19 IST 2025 AArch64 GNU/Linux
编译器版本  

TI-Clang 4.0.1.LTS  

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

    您好、闪亮、

    嗯、这是一个好问题。 我之前没有尝试过使用 GPIO 中断缓慢关闭和重新启动 MCU+代码。

    我看到 ipc_rpmsg_echo_linux 的 AM64x 存储库版本和 ipc_rpmsg_echo_linux 的 AM62/62P/62A 存储库版本的关断代码有一些差异。 多年来、AM62x 存储库中的 Linux IPC 示例受到了越来越多的关注、这可能是我们可以参考的更好示例:

    AM64x 存储库: https://github.com/TexasInstruments/mcupsdk-core/blob/next/examples/drivers/ipc/ipc_rpmsg_echo_linux/ipc_rpmsg_echo.c 
    AM62x 存储库: https://github.com/TexasInstruments/mcupsdk-core-k3/blob/k3_main/examples/drivers/ipc/ipc_rpmsg_echo_linux/ipc_rpmsg_echo.c 

    我将重点介绍这些电子职位之间的几个设计差异、然后我会将您的问题发送给我们团队中具有更多 MCU+体验的另一位成员、以便发表进一步评论。

    在 AM62x 示例中、我们看到

    1) 在最后一个任务即将删除自身 (gRecvTaskExitCounter) 之前、有逻辑可确保驱动程序不会被取消初始化。 这样可以确保在仍有其他任务依赖这些驱动程序时、我们不会取消驱动程序初始化。

    2) 除了 Drivers_close()、我还看到调用 System_deinit ()

    3) 有其他的差异,可能是或可能不是有趣的你

    如果 AM62x 示例代码修复了行为、请告知我们、我将提交错误以更新示例的 AM64x 版本。

    此致、

    Nick

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

    您好、Nick、

    感谢您的详细说明并向我提供 AM62x 示例。

    我更新了 AM64x R5F 应用、使其遵循与ipc_rpmsg_echo_linux AM62x 存储库中相同的关断模式、特别是:

    • 我添加了类似的逻辑gRecvTaskExitCounter、以便Drivers_close()(和)System_deinit()仅在最后一个任务即将退出时才被调用。

    • 在进入 WFI 之前、我确保关断流程与 AM62x 示例匹配。

    完成这些更改后、带 GPIO 中断和远程处理的平稳停止/启动在 AM64x 上正常工作。

    是的、使用 AM62x 示例作为参考解决了我的问题。 如果可以按照您的建议在 SDK 中更新 AM64x 示例、那将会非常有用。

    再次感谢您的支持!

    此致、
    闪亮

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

    您好、闪亮、

    感谢您确认您能够让事情正常工作! 我已针对 AM64x 代码库提交了一个错误 、以移植到 AM62x 上有意义的改进、并链接回您的线程、以便开发人员可以将此对话作为参考。

    此致、

    Nick