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.

[参考译文] 66AK2H12:如何为 ARM SMP 安装我自己的异常处理程序?

Guru**** 2540720 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/597583/66ak2h12-how-can-i-install-my-own-exception-handler-for-arm-smp

器件型号:

首先、我要为 ARM (A15) SMP (使用了 SYSBIOS)安装我自己的异常处理程序。

我找到了在 DSP 内核中安装异常处理程序的方法(下面的文章)、但  我在 ARM 内核中找不到方法。

https://e2e.ti.com/support/embedded/tirtos/f/355/t/281252

其次、 当 SMP 中的 ARM 内核发生异常时、如何停止其他 ARM 内核?

我认为我可以 向异常处理程序中的其他 ARM 内核发出 IPC 中断。

如果其他内核收到 IPC 中断、它们可以在中断处理程序中停止。 (例如使用无限循环)。

有可能吗?

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

    我已通知软件团队。 他们的反馈将在此处发布。

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

    您好、Jiyoon、

    [引用用户="Jiyoon OH"]

    器件型号 :66AK2H12

    首先、我要为 ARM (A15) SMP ( 使用了 SYSBIOS)安装我自己的异常处理程序。

    [/报价]

    在 SMP 模式下运行时有一个例外挂钩数组。 您可以为每个内核提供异常挂钩函数(或为所有内核提供相同的函数)。

    这是 CDOC:

    http://downloads.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/bios/sysbios/6_50_01_12/exports/bios_6_50_01_12/docs/cdoc/ti/sysbios/family/arm/exc/Exception.html#exc.Hook.Funcs

    [引用用户="Jiyoon OH"]

    其次、 当 SMP 中的 ARM 内核发生异常时、如何停止其他 ARM 内核?

    我认为我可以 向异常处理程序中的其他 ARM 内核发出 IPC 中断。

    如果其他内核收到 IPC 中断、它们可以在中断处理程序中停止。 (例如使用无限循环)。

    有可能吗?

    [/报价]

    是的、这是一种实现方法。 您可以使用 Hwi_raiseSGI() API 在其他内核上生成 SGI。 请注意、SYS/BIOS 使用前 N 个 SGI、其中 N 是内核数。 此外、请注意、另一个内核在进入无限循环之前将执行几条指令。

    如果目标是仅在调试时停止另一个内核、则可以尝试以下操作:

     -在 CCS 中设置包含所有 A15的同步组。 设置此项后、当其中一个内核停止时、所有其他内核也将停止。

     -在异常处理程序中添加断点指令。 当其中一个内核引发异常时、处理程序将按 bkpt 指令并停止。 同步组功能将强制所有其他内核停止。

    最棒的

    Ashish

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

    Ashish Kapania、感谢您的回答。

    我在下面补充一些问题。  

    1。

    实际上、我还想在 A15中发生异常时停止 C66内核、反之亦然。
    在这种情况下,我是否仍然可以使用 Hwi_raiseSGI()?  
    我在 TI 网站上找不到有关 Hwi_raiseSGI()的信息。
    请告诉我在哪里可以找到相关信息。

    2.  

    当检测到一些错误以获取上下文信息并调用异常处理程序时、我想进行异常处理。  

    例如、函数会检查输入参数、如果参数无效、则在此时获取上下文信息会成为例外。

    在这种情况下、如何进行例外处理?

    3.

    当内核中发生异常时、我想获取所有内核(A15和 C66内核)的上下文信息(例如寄存 器)。  

    我认为我可以使用 IPC 中断通知其他内核发生异常。

    但我不知道其他内核当时如何获取自己的上下文信息。

    在这种情况下、我可以做什么?

    提前感谢您。

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

    [引用用户="Jiyoon OH"]

    1。

    实际上、我还想在 A15中发生异常时停止 C66内核、反之亦然。
    在这种情况下,我是否仍然可以使用 Hwi_raiseSGI()?  
    我在 TI 网站上找不到有关 Hwi_raiseSGI()的信息。
    请告诉我在哪里可以找到相关信息。

    [/报价]

    Hwi_raiseSGI()只能用于在 A15子系统内引起中断。 对于中断 C66x 内核、您将需要使用 IPC API。

    [引用用户="Jiyoon OH"]

    2.  

    当检测到一些错误以获取上下文信息并调用异常处理程序时、我想进行异常处理。  

    例如、函数会检查输入参数、如果参数无效、则在此时获取上下文信息会成为例外。

    在这种情况下、如何进行例外处理?

    [/报价]

    您为什么不禁用中断并从错误检测功能打印所有上下文寄存器、而不是诱导人为异常?

    [引用用户="Jiyoon OH"]

    3.

    当内核中发生异常时、我想获取所有内核(A15和 C66内核)的上下文信息(例如寄存 器)。  

    我认为我可以使用 IPC 中断通知其他内核发生异常。

    但我不知道其他内核当时如何获取自己的上下文信息。

    在这种情况下、我可以做什么?

    [/报价]

    您可以查看异常模块源代码来确定如何读取 CPU 上下文寄存器并打印/记录它们。 对于 A15、异常模块位于 src/ti/sysbios/family/ARM/exc 包中。 对于 C66x、它位于 src/ti/sysbios/family/c64p 封装中。 这是否回答了您的问题?

    最棒的

    Ashish

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

    感谢您的回答。 您的回答对我很有帮助。

    关于上述问题3),请回答。

    3-1)

    当一个内核上发生异常时(让我们将其称为"异常内核")、我可以使用异常模块(例如异常挂钩函数或 exception_getLastStatus())获取其上下文信息。

    但是、如果异常内核是 DSP 内核、我不知道异常发生在代码中的哪个位置、因为上下文信息不包括像 PCE2寄存器值那样的相关信息。

    (很抱歉、我现在不知道这个 DSP 内核。)

    如何获取代码中出现异常的位置?

    3-2)
    我认为异常内核可以通过 IPC 中断向其他内核通知发生的异常。

    但是、其他内核当时如何获取自己的上下文信息?

    即、当其他内核接收 IPC 中断并跳转到 IPC 中断处理函数时。

    能否在 IPC 中断处理函数中使用异常模块(例如 exception_getLastStatus())来获取上下文信息?  

    还是其他方式?

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

    [引用用户="Jiyoon OH"]

    3-1)

    当一个内核上发生异常时(让我们将其称为"异常内核")、我可以使用异常模块(例如异常挂钩函数或 exception_getLastStatus())获取其上下文信息。

    但是、如果异常内核是 DSP 内核、我不知道异常发生在代码中的哪个位置、因为上下文信息不包括像 PCE2寄存器值那样的相关信息。

    (很抱歉、我现在不知道这个 DSP 内核。)

    如何获取代码中出现异常的位置?

    [/报价]

    这些异常在 C6x 上是异步的、因此异常总是在有问题的指令之后的几个周期引起。 NRP 寄存器给出了一条靠近导致异常的指令的地址。 在 NRP 和单步执行之前放置几个断点指令应该有助于找出有问题的指令。

    [引用用户="Jiyoon OH"]

    3-2)

    我认为异常内核可以通过 IPC 中断向其他内核通知发生的异常。

    但是、其他内核当时如何获取自己的上下文信息?

    即、当其他内核接收 IPC 中断并跳转到 IPC 中断处理函数时。

    能否在 IPC 中断处理函数中使用异常模块(例如 exception_getLastStatus())来获取上下文信息?  

    还是其他方式?

    [/报价]

    其他内核不能使用异常模块来确定上下文信息。 异常模块仅在各自内核上发生异常时记录寄存器上下文。 您需要编写自己的函数(可以使用异常模块代码作为参考)、以读取必要的 CPU 寄存器并记录/打印它们。

    最棒的
    Ashish

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

    谢谢、Ashish。

    也许、这是有关此问题的最后一个问题。
    当 DSP 内核上发生异常时、我在异常挂钩函数中获得了上下文信息(使用 exception_getLastStatus())(我刚刚在控制台中打印出来)。
    从异常挂钩函数返回后、我看到上下文信息再次打印在控制台中。
    但是上下文信息与我在挂钩函数中打印的信息不同。
    为什么这两个信息不同? 什么是正确信息?

    提前感谢您。

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

    您好、Jiyoon、

    有一个"exception.enablePrint"模块范围内的配置参数、用于控制异常模块是否打印异常转储。 默认情况下为 true。 我猜这是导致异常上下文信息打印的原因。

    当您说上下文信息不同时,您是指打印不同的寄存器集,还是表示寄存器内容不同? 我希望打印相同的内容、除非触发了第二个异常、并且上下文信息是针对该异常。

    最棒的

    Ashish