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.

[FAQ] [参考译文] 【常见问题解答】如何确保 DM 任务是在 DM R5F 上运行的唯一代码?

Guru**** 2553260 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1559055/faq-how-to-ensure-that-the-dm-task-is-the-only-code-running-on-the-dm-r5f



这是的配套常见问题解答

 【常见问题解答】【警报】DM R5F 在某些情况下可能会崩溃:AM62x、AM62Ax、AM62Dx、AM62Px、AM67、 AM67A  

请先阅读警报。 您也可以在此处的主要常见问题解答中找到更多信息:

 【常见问题解答】DM R5F 在某些情况下可能崩溃:AM62x、AM62Ax、AM62Dx、AM62Px、AM67、 AM67A  

本常见问题解答适用于 AM62x、AM62Ax、AM62Dx、AM62Px。

DM R5F 不需要运行 ipc_rpmsg_echo_linux 工程、如  【常见问题解答】中所述 DM R5F 是否需要运行 IPC Echo 演示任务? 。

如果我们想从 DM R5F 内核中删除除关键设备管理器 (DM) 任务之外的所有其他代码、可以使用空工程。 但是、如果我们要使用空工程、需要记住多个事项。

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

     将空工程与 Linux 一同使用时需要注意的事项

    不要将垃圾数据传递给 Linux 驱动程序

    默认情况下、在这些处理器的 Linux 器件树文件中定义 DM R5F 内核。 这意味着 Linux Remoteproc 驱动程序将尝试读取 DM R5F 的 DDR 存储器分配中的“资源表“数据。

    如果加载了 ipc_rpmsg_echo_linux 工程、则会在 DDR 中填充有效资源表。  

    但是、空工程在编写时并未考虑 Linux。 这意味着未修改的空工程不会将资源表放入 DDR 中。 如果在 Linux 器件树中定义了 DM R5F 内核、Linux Remoteproc 驱动程序仍将尝试读取“资源表“存储器区域。 但是、Linux Remoteproc 驱动程序读取的 DDR 区域将处于未初始化状态。 DDR 存储器未初始化为设定值、因此这个未初始化的存储器区域将有一组随机的 1 和 0。

    如果 Linux Remoteproc 驱动程序读取随机数据、则 Linux 驱动程序可能以意外的方式运行。 因此、如果我们切换到使用空工程、则必须确保 Linux 不会读取随机数据。

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

    有多种方法可以防止 Linux 读取垃圾数据。

    选项 1:在 Linux 器件树中禁用 DM R5F 器件树节点

    当 Linux 器件树中的 DM R5F 被“禁用“时、这并不意味着 Linux 实际会关闭 DM R5F 内核。 相反、这意味着 Linux 假设 DM R5F 已被禁用、因此 Linux Remoteproc 和 RPMsg 驱动程序绝不会尝试与 DM R5F 内核进行交互。

    Linux 驱动程序和 DM 任务之间的所有 TI-SCI 通信都将继续照常工作。

    下面提供了一个示例:

    e2e.ti.com/.../2477.0001_2D00_remove_2D00_DM_2D00_R5F_2D00_from_2D00_the_2D00_Linux_2D00_devicetree_2D00_file.patch

    注 1

    DM R5F 的存储器区域仍应在 Linux 器件树中定义。 这可以防止 Linux 覆盖 DM R5F 数据。 可以删除用于与 DM R5F 进行 RPMsg 通信的 1MByte virtio 区域。

    注 2  

    DM R5F 器件树节点应该 系统 如果 ipc_rpmsg_echo_linux 固件已替换为不同固件(例如空工程)、则禁用该位。 如果默认 ipc_rpmsg_echo_linux 固件仍在 DM R5F 上运行、则在 Linux 器件树中禁用 DM R5F 器件树节点可能会导致 DM R5F 内核在某些版本中的 49 天后崩溃。 有关更多信息、请参阅 DM R5F 崩溃警报。

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

    选项 2:将资源表区域初始化为已知值  

    如果要修改 DM R5F 工程而不是 Linux 器件树、还有另一个选项(或者,如果您希望系统以确定的方式运行,无论 Linux 器件树中是否禁用了 DM R5F 节点)。

    如果您可以保证 DDR 的 DM R5F 资源表区域填充了一组已知值、则可以保证 Linux Remoteproc 驱动程序的运行方式始终相同。

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

    选项 2A(首选):添加空资源表

    文本

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

    选项 2B:将资源表区域归零

    一个不太巧妙的解决方案涉及将资源表区域归零。 Linux 将无法连接到 DM R5F 并查看跟踪日志、但至少您可以保证 Linux Remoteproc 驱动程序始终以相同的方式运行、因为它始终从 DDR 存储器区域读取相同的数据。

    以下是 AM62Px 上的示例代码。 请注意、需要设置地址偏移以与 DDR 中存储器区域的开头保持一致:

    diff --git a/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd
    index 1e27ee9..b29f55a 100644
    --- a/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd
    +++ b/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd
    @@ -61,6 +61,11 @@ SECTIONS
             .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */
         } load = R5F_TCMB, run = R5F_TCMA
    
    +    GROUP {
    +        /* create a hole and fill it with 0x00000000 */
    +        .resource_table: fill = 0x00000000 { .+= 0x0400; } palign(1024)
    +    } > DDR_RESOURCE_TABLE
    +
         .lpm_data (NOLOAD)      : {} align(4)       > DDR_LPM_DATA
         .text                   : {} palign(8)      > DDR
         .const                  : {} palign(8)      > DDR
    @@ -161,6 +166,11 @@ MEMORY
    
         WKUP_SRAM_TRACE_BUFF (RWIX) : ORIGIN = 0x41880000 LENGTH = 0x0000800
    
    +    /*
    +     * Fill the resource table region with zeros so Linux remoteproc driver does
    +     * not read garbage data.
    +     */
    +    DDR_RESOURCE_TABLE          : ORIGIN = 0x9C900000, LENGTH = 0x400
         /* DDR for DM LPM data [ size 640.00 KB ] */
         DDR_LPM_DATA    (RWIX)      : ORIGIN = 0x9CA00000 LENGTH = 0x000A0000
         /* DDR for DM R5F code/data [ size 27MiB + 416 KB ] */

    以下是 Linux 如何使用随机资源表值行为的示例:

    [    7.562659] platform 78000000.r5f: R5F core may have been powered on by a different host, programmed state (0) != actual state (1)
    [    7.593146] platform 78000000.r5f: configured R5F for IPC-only mode
    [    7.625007] platform 78000000.r5f: assigned reserved memory node r5f-dma-memory@9c800000
    [    7.681768] remoteproc remoteproc1: 78000000.r5f is available
    [    7.691070] remoteproc remoteproc1: attaching to 78000000.r5f
    [    7.698364] remoteproc remoteproc1: rsc table is truncated
    [    7.704812] remoteproc remoteproc1: Failed to process resources: -22
    [    7.773275] k3_r5_rproc bus@f0000:bus@b00000:r5fss@78000000: rproc_add failed, ret = -22
    [    7.783217] k3_r5_rproc bus@f0000:bus@b00000:r5fss@78000000: k3_r5_cluster_rproc_init failed, ret = -22
    [    7.793242] k3_r5_rproc: probe of bus@f0000:bus@b00000:r5fss@78000000 failed with error -22
    [    7.886106] remoteproc remoteproc1: releasing 78000000.r5f 

    下面是 Linux 在使用用零填充的资源表区域时的行为方式:

    [    7.455715] platform 78000000.r5f: R5F core may have been powered on by a different host, programmed state (0) != actual state (1)
    [    7.456773] platform 78000000.r5f: configured R5F for IPC-only mode
    [    7.456873] platform 78000000.r5f: assigned reserved memory node r5f-dma-memory@9c800000
    [    7.457671] remoteproc remoteproc1: 78000000.r5f is available
    [    7.457779] remoteproc remoteproc1: attaching to 78000000.r5f
    [    7.457792] remoteproc remoteproc1: remote processor 78000000.r5f is now attached