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] [参考译文] [常见问题解答] AM625:如何修改 DM R5F 的 DDR 存储器占用空间?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1317407/faq-am625-how-do-i-modify-the-ddr-memory-footprint-of-the-dm-r5f

器件型号:AM625

我使用的处理器的器件管理器(DM)代码在 R5F (AM62x、AM62Ax 或 AM62Px)上运行。 我不需要在 DM R5F 上运行任何额外的代码。 如何修改需要为 DM R5F 保留的 DDR 存储器?

本常见问题解答将以 AM62x 为例。 不过、相同的概念应适用于具有 DM R5F 的其他器件。

AM62Ax 客户请注意、在我们的默认文件系统映像上运行的开箱即用 DM R5F 固件除了运行 DM 代码之外、还运行 VPAC 代码。 如果您将其他项目加载到 DM R5F 中、您的摄像头功能可能会中断。

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

    基本知识  

    如何在 Linux 和远程内核之间分配 DDR 存储器?  

    AM62x Academy >多核模块> 如何分配存储器
    AM62Ax Academy >多核模块> 如何分配存储器

    如何使用 MCU+ SDK 构建 DM R5F 固件?  

    任何可以选择为 DM R5F 构建的 MCU+示例都可以用于构建固件。 重要的是、工程需要调用 sciSERVER_init 来启动 DM 任务。

    请参阅  

    AM62x MCU+ SDK docs > 在设备管理器/唤醒 R5内核上开发应用程序
    AM62Ax MCU+ SDK docs > 在设备管理器/唤醒 R5内核上开发应用程序
    AM62Px MCU+ SDK docs > 在设备管理器/唤醒 R5内核上开发应用程序

    如何使用.map 文件来查看我的 MCU+应用实际使用的存储器空间?

    请参阅上面的"如何分配内存"链接的"优化内存使用"部分

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

    DM R5F 固件如何工作? 实际需要哪些资源?  

    DM R5F 的作用是什么?  

    DM R5F 运行一个专用 RTOS 任务、负责资源管理和电源管理。 例如、只要器件上的另一个内核想要使用特定资源(例如、主域 UART 0)、该内核就会向 DM R5F 上运行的 DM 软件发出请求。 然后 DM R5F 决定是接受还是拒绝该请求。 此任务至关重要! 如果 DM 任务停止运行、则处理器将停止工作。

    用户还可以对其他 RTOS 任务进行编程、以便随 DM 任务一起在 DM R5F 上运行。 这些额外的 RTOS 任务并不像 DM 任务那么重要。 不同的 MCU+ SDK 示例将在 DM R5F 上运行不同的任务。

    例如、对于 AM62x 和 AM62Px、在默认 Linux 文件系统中运行的 DM R5F 固件是使用 MCU+ SDK 示例构建的
    examples/drivers/ipc/ipc_rpmsg_echo_linux

    在我们的开箱即用示例中、有第二个 RTOS 任务正在运行 RPMsg Echo 示例。 这就是为什么您可以使用 DM R5F 运行 Linux IPC Echo 示例的原因:
    AM62x Academy > Linux module > Evaluating Linux > IPC Example
    AM62Px Academy > Linux module > Evaluating Linux > IPC example

    DM R5F 如何开始运行?  

    DM R5F 的引导方式与其他远程内核(即与 Linux A53一起运行的非 Linux 内核)不同。 其他远程内核必须由 Linux remoteproc 驱动程序或 MCU+ SBL 初始化。 但是、由于 DM R5F 如此重要、它会在引导过程的早期加载。

    这意味着 DM R5F 无需依赖 Linux remoteproc 驱动程序即可开始运行。

    默认的 Linux 内存区  

    Linux 为所有远程内核分配内存区域、就像内核1)由 Linux remoteproc 初始化、2)像内核使用 RPMsg IPC 与 Linux 通信一样。 因此、Linux 为每个远程内核分配了2个内存区域:"IPC (Virtio/VRING 缓冲区)"内存区域和"外部代码/数据存储器"内存区域。

    DM R5F 如何使用存储器?  

    当处理器处于低功耗模式时、DM R5F 继续运行。 由于 DDR 在低功耗模式下不上电、因此 DM R5F 固件必须在低功耗期间耗尽本地 TCM 存储器。 进入 TCM 存储器中的数据在 linker.cmd 文件中被称为"存根"。

    其余的 DM R5F 代码大部分都会进入 DDR。

    DM R5F 在与其他处理器内核通信时不使用 RPMSG IPC。 这意味着专用的 DM 任务不需要  Linux 默认分配的"IPC (Virtio/vring buffers)"内存区域。

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

    如何减少 DM R5F 的 DDR 存储器占用空间?  

    第1部分:使用最小的 MCU+示例构建 DM R5F 固件

    首先、让我们验证 hello_world 示例是否会初始化 sciServer:
    examples/hello_world/am62x-sk/r5fss0-0_freertos/main.c

    void hello_world_main(void *args);
    
    void main_thread(void *args)
    {
    ...
        sciServer_init();

    现在、我们以 hello_world 示例构建 DM R5F 固件。 我将从 Linux 终端进行构建:

    $ make -s -C examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang

    请检查实际需要多少存储器  

    内存区域在 linker.cmd 文件中定义:
    examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang/linker.cmd

    下面我们来看看每个存储器区域中实际放置了多少数据:

    vi examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang/hello_world.release.map
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      R5F_TCMA_VEC          00000000   00000040  00000000  00000040  RWIX
      R5F_TCMA              00000040   000077c0  00002db8  00004a08  RWIX
      R5F_TCMA_TRACE_BUFF   00007800   00000800  00000800  00000000  RWIX
      R5F_TCMB_VEC          41010000   00000040  00000040  00000000  RWIX
      R5F_TCMB              41010040   000077c0  00002db8  00004a08  RWIX
      R5F_TCMB_TRACE_BUFF   41017800   00000800  00000000  00000800  RWIX
      HSM_RAM               43c00000   0003ff00  00000000  0003ff00  RWIX
      DDR_FS_STUB           9dc00000   00008000  00008000  00000000  RWIX
      DDR                   9dc08000   00af8000  00043c02  00ab43fe  RWIX
    

    DDR_FS_STub 和 DDR 是 DDR 中唯一的区域。 0x8000 + 0x43C02 = 0x4BC02。 我们将0x50000预留给 R5F 存储器。

    更改 linker.cmd 文件

    然后、我们可以按如下所示更新链接器命令文件:

    vi examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang/linker.cmd
    
        /* DDR for FS Stub binary [ size 32.00 KB ] */
        DDR_FS_STUB    (RWIX)      : ORIGIN = 0x9DC00000 LENGTH = 0x00008000
        /* DDR for DM R5F code/data [ size 288 KB ] */
        DDR            (RWIX)      : ORIGIN = 0x9DC08000 LENGTH = 0x00048000

    并仔细检查内存分配是否仍然正常:

    $ make -s -C examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang clean
    $ make -s -C examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang
    $ vi examples/hello_world/am62x-sk/r5fss0-0_freertos/ti-arm-clang/hello_world.release.map
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      R5F_TCMA_VEC          00000000   00000040  00000000  00000040  RWIX
      R5F_TCMA              00000040   000077c0  00002db8  00004a08  RWIX
      R5F_TCMA_TRACE_BUFF   00007800   00000800  00000800  00000000  RWIX
      R5F_TCMB_VEC          41010000   00000040  00000040  00000000  RWIX
      R5F_TCMB              41010040   000077c0  00002db8  00004a08  RWIX
      R5F_TCMB_TRACE_BUFF   41017800   00000800  00000000  00000800  RWIX
      HSM_RAM               43c00000   0003ff00  00000000  0003ff00  RWIX
      DDR_FS_STUB           9dc00000   00008000  00008000  00000000  RWIX
      DDR                   9dc08000   00048000  00043c02  000043fe  RWIX
    

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

    第2部分:修改 Linux devicetree 文件  

    现在、让我们更新 Linux devicetree 中的内存分配。 我们进行了2项主要变更:

    1) 1)从 Linux 角度将 DM R5F 设置为"已禁用"

    2) 2)减少 DDR 存储器分配、以匹配 linker.cmd 文件

    如果 devicetree 节点设置为"disabled"、这并不意味着 Linux 会主动尝试从禁用的内核上移除电源。 这仅意味着 Linux 会忽略该 devicetree 节点、并假设其已禁用。

    将 DM R5F 设置为禁用  

    按如下所示修改 devicetree 文件:

    diff --git a/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi b/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi
    index 6f102b430..09203519a 100644
    --- a/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi
    +++ b/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi
    @@ -487,27 +469,11 @@ cpsw3g_phy0: ethernet-phy@0 {
     };
    &mailbox0_cluster0 {
            mbox_m4_0: mbox-m4-0 {
                    ti,mbox-rx = <0 0 0>;
                    ti,mbox-tx = <1 0 0>;
            };
     
    -       mbox_r5_0: mbox-r5-0 {
    -               ti,mbox-rx = <2 0 0>;
    -               ti,mbox-tx = <3 0 0>;
    -       };
     };
     
    ...
    
    -&wkup_r5fss0_core0 {
    -       mboxes = <&mailbox0_cluster0 &mbox_r5_0>;
    -       memory-region = <&wkup_r5fss0_core0_dma_memory_region>,
    -                       <&wkup_r5fss0_core0_memory_region>;
    +&wkup_r5fss0 {
    +       status = "disabled";
     };

    减少 DDR 内存分配  

    由于我们没有使用 RPMsg IPC 与 DM R5F 通信、因此 可以删除"IPC (Virtio/vring 缓冲区)"存储器区域。  外部代码/数据存储器区域可精简为0x50000。

    // treat this like a diff file
    
    -                wkup_r5fss0_core0_dma_memory_region: r5f-dma-memory@9da00000 {
    -                        compatible = "shared-dma-pool";
    -                        reg = <0x00 0x9da00000 0x00 0x00100000>;
    -                        no-map;
    -                };
    
                    wkup_r5fss0_core0_memory_region: r5f-memory@9db00000 {
                            compatible = "shared-dma-pool";
    -                        reg = <0x00 0x9db00000 0x00 0x00c00000>;
    +                        reg = <0x00 0x9db00000 0x00 0x00050000>;
                            no-map;
                    };

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

    第3部分:构建输出文件并进行测试  

    如果电路板使用 Linux SDK SPL 引导:

    更新 Uboot binman 文件以指向新的二进制文件。

    例如、对于 AM625-SK:
    arch/arm/dts/k3-am625-sk-binman.dtsi
    ti-dm 节点、更新 fileName 条目
    文件名看起来与 board-support/prebuilt-images/am62xx-evm 相关、因此您要在其中的某个位置复制新的 DM 固件。

    然后、按照此处的步骤将 DM R5F 固件集成到 uboot 中:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/09_01_00_08/exports/docs/linux/Foundational_Components U-Boot/UG-General-Info.html

    在该示例中、我们只需重新编译 tiboot3-am62x-hs-fs-evm.bin:

    ~/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/ti-u-boot-2023.04+gitAUTOINC+b0d717b732-gb0d717b732$ export UBOOT_DIR=/home/user/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/ti-u-boot-2023.04+gitAUTOINC+b0d717b732-gb0d717b732
    ~/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/ti-u-boot-2023.04+gitAUTOINC+b0d717b732-gb0d717b732$ export TI_LINUX_FW_DIR=/home/user/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/prebuilt-images/am62xx-evm
    ~/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/ti-u-boot-2023.04+gitAUTOINC+b0d717b732-gb0d717b732$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- am62x_evm_r5_defconfig O=$UBOOT_DIR/out/r5
    ~/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/ti-u-boot-2023.04+gitAUTOINC+b0d717b732-gb0d717b732$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- O=$UBOOT_DIR/out/r5 BINMAN_INDIRS=$TI_LINUX_FW_DIR
    ~/ti-processor-sdk-linux-am62xx-evm-09.01.00.08/board-support/ti-u-boot-2023.04+gitAUTOINC+b0d717b732-gb0d717b732$ ls out/r5/
    ...
    tiboot3-am62x-hs-fs-evm.bin

    然后、我们将该文件复制到 SD 卡的引导分区中。

    构建 Linux devicetree。 如果使用 fitImage、请按照以下所述将其构建到 fitImage 中:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/09_01_00_08/exports/docs/linux/Foundational_Components_Kernel_Users_Guide.html#compiling-the-device-tree-binaries

    运行并测试

    未来的待办事项  

    这并不是关于移动 DM R5F 基址的真正内容。 请注意、linker.cmd 文件中的 fs_stub 区域可能需要更新、以匹配 binman 文件中的区域? 尽管 binman 文件的 dm 节点的地址0x8900_0000似乎不需要与 linker.cmd 文件匹配...、 这里需要做更多的工作

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

    Ping