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.

[参考译文] AM625:MCU_M4从外部存储器执行代码

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1138163/am625-mcu_m4-execute-code-from-external-memory

器件型号:AM625
Thread 中讨论的其他器件:SysConfig

如何从外部存储器执行代码? 只需更改.cmd 即可 将 代码分配给 DDR 存储器空间?  

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

    在 e2e 关闭时复制粘贴有关此主题的脱机讨论:

    来自 Tony:  

    基于 MCU SDK 项目:

     

    第一。 修改 MCU 项目.cmd 以添加内存 DDR_1、将所有段分配给 DDR_1。 和构建。

     

    MEMORY
    
    {
    
        M4F_VECS : ORIGIN = 0x00000000 , LENGTH = 0x00000200
    
        M4F_IRAM : ORIGIN = 0x00000200 , LENGTH = 0x0002FE00
    
        M4F_DRAM : ORIGIN = 0x00030000 , LENGTH = 0x00010000
    
     
    
        /* when using multi-core application's i.e more than one R5F/M4F active, make sure
    
         * this memory does not overlap with R5F's
    
         */
    
        /* Resource table must be placed at the start of DDR_0 when M4 core is early booting with Linux */
    
        DDR_0       : ORIGIN = 0x9cc00000 , LENGTH = 0x1000
    
        DDR_1    : ORIGIN = 0x9cb00000 , LENGTH = 0x100000 //0x9cc01000
    
    }
     

    2。 下载.out、M4在地址上挂起、如下所示。

     

    3号。  然后重新加载、M4在入口点暂停、CCS 在控制台中报告错误、如下所示:

     

    BLAZAR_Cortex_M4F_1: Can't Run Target CPU: (Error -1268 @ 0x1090001) Device is locked up in Hard Fault or in NMI. Reset the device, and retry the operation. If error persists, confirm configuration, power-cycle the board, and/or try more reliable JTAG settings (e.g. lower TCLK). (Emulation package 9.8.0.00235)

     

    它是否需要 A53内核来配置某项以使 M4从外部存储器执行?

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

    Nick 答复  

    您好 Tony、

    只需仔细检查:是否使用 Linux Remoteproc 驱动程序加载 M4F、然后按照此处的步骤连接到 CCS 中的 M4F?
    https://software-dl.ti.com/mcu-plus-sdk/esd/AM62X/08_04_00_16/exports/docs/api_guide_am62x/CCS_LAUNCH_PAGE.html

    如果是、如果您没有复位 CPU、会发生什么情况? 不要重置 CPU、而是尝试加载符号来调试已由 Linux 初始化且已在运行的软件:

    选择此处的向下箭头,选择“Load Symbols”,然后选择当前正在运行的.out 文件。

     

    如果仍然无法正常工作、请附加完整的 linker.cmd 文件。

     

    此致、

    Nick

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

    Tony 的演示  

    Nick、

    谢谢。 当前我使用 Linux 启动 A53,然后连接 CCS 以从 CCS 下载 M4 .out 作为 MCU+ SDK 用户指南指令,它无法运行到 main。

    来自 Nick

    您好 Tony、

    请尝试按 之前的响应所示加载符号、而不是从 CCS 重新加载固件。 这是否允许您进行调试?

    SDK 说明可能仅在某些情况下有效。 如果是这样,我们需要弄清这些情况是什么。

    此致、

    Nick

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

    Nick、

    在片上存储器上分配代码后一切正常、只需修改 同一项目的.cmd 文件、.out 就无法运行。

    请您在旁边尝试一下吗?

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

    您好 Tony、

    后续问题

    1) 1)您是否尝试加载符号?

    2) 2)如果您希望我们测试您的完整.cmd 文件、我们需要查看它。 例如、链接器文件的其余部分如何将数据放入 DDR_1中?

    解释我希望您尝试加载符号的原因

    我们假设.cmd 文件中的所有内容都是正确的。 然后、我要确保在 Linux Remoteproc 驱动程序加载 M4F 时、除了在 Linux 已经初始化 M4F 之后 CCS 重新加载 M4F 之外、这是一个问题。 如果您能够通过加载符号来调试内核、则表明 Linux Remoteproc 驱动程序即使在 DDR 中有数据也能够成功加载 M4F。 如果无法通过加载符号来调试内核、则意味着我们必须调试其他内容。

    根据您的反馈、这是我认为您已经测试过的结果。 如果我有任何问题、请纠正我的问题:

    在 Linux 初始化 M4后、CCS 重新加载不使用 DDR 的 M4程序-经 Tony 测试、工作正常

    在  Linux 初始化 M4后、CCS 重新加载使用 DDR 的 M4程序-经 Tony 测试、无法正常工作

    CCS 加载符号以调试 Linux 加载的 M4程序。 程序不使用 DDR -未经测试

    CCS 加载符号以调试 Linux 加载的 M4程序。 程序 使用 DDR -未经测试  

    此致、

    Nick

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

    第一。 要在没有 IPC 的情况下从 Linux 加载、请在 main.c 中更改.cmd 并添加资源表

    e2e.ti.com/.../6266.linker.cmd

    2。 从 Linux 加载 M4固件:

    root@am62xx-EVM:~# cat /sys/class/remoteproc/remoteproc0/state
    运行
    root@am62xx-EVM:~# echo stop>/sys/class/remoteproc/remoteproc0/state
    [398.667178] remoteproc remoteproc0:已停止远程处理器5000000.m4fss
    root@am62xx-EVM:~# cat /sys/class/remoteproc/remoteproc0/state
    离线
    root@am62xx-EVM:~# ln -SF /lib/firmware/i2c_read_am62_loadable.out am62-mcu-m4f0_0-fw

    root@am62xx-EVM:~# echo start>/sys/class/remoteproc/remoteproc0/state
    [584.444982] remoteproc remoteproc0:启动5000000.m4fss
    [584.451945] remoteproc remoteproc0:引导 FW 映像 am62-mcu-m4f0_0-fw、大小为382804
    [584.477119] remoteproc0#vdev0buffer:分配的保留存储器节点 M4F-dma-memory@9cb00000
    [584.486289] virtio_rpmsg_bus virtio0:rpmsg 主机处于联机状态
    [584.495330] remoteproc0#vdev0buffer:registered virtio0 (类型7)
    [584.501661] remoteproc remoteproc0:远程处理器5000000.m4fss 现已启动
    root@am62xx-EVM:~# cat /sys/class/remoteproc/remoteproc0/state
    运行

    3号。 在不使用 GEL 文件的情况下连接 JTAG。 下载符号、报告控制台中的错误:

    BLAZAR_Cortex_M4F_1:在0x9cb0eece 处使用操作"处理 CIO"设置断点时出现问题:(错误-1066 @ 0x9CB0EEC)无法设置/清除请求的断点。 验证断点地址是否在有效存储器中。 (仿真包9.8.0.00235)
    BLAZAR_Cortex_M4F_1:断点管理器:使用 AET 断点重试
    BLAZAR_Cortex_M4F_1:断点管理器:_JobHardwareBreakpoint:::ARM_DEBUG_V7M_fpb_add_breakpoint:传递给 IP 驱动程序的参数错误[22002]
    BLAZAR_Cortex_M4F_1:在0x9cb0f9d0处使用"Terminate Program Execution (终止程序执行)"操作来设置断点时遇到问题:(错误-1066 @ 0x9CB0F9D0)无法设置/清除请求的断点。 验证断点地址是否在有效存储器中。 (仿真包9.8.0.00235)
    BLAZAR_Cortex_M4F_1:断点管理器:使用 AET 断点重试
    BLAZAR_Cortex_M4F_1:断点管理器:_JobHardwareBreakpoint:::ARM_DEBUG_V7M_fpb_add_breakpoint:传递给 IP 驱动程序的参数错误[22002]

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

    Nick、

    希望您能抽出宝贵的时间来帮助您解决这一问题。

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

    您好、Tony、

    我正在处理 上述问题、请给我一些时间来解决。

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

    大家好、Tushar、

    感谢您、我们是否有目标期限向客户提供任何建议?  

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

    Terry、

    Tushar 已经能够再现 Tony 3天前指出的问题、我们正在与软件团队合作、以了解问题的原因、让我们更详细地了解问题、我们可以对解决时间线进行评论。

    请理解、我们确认问题的紧迫性、并正在努力解决

    此致

    安州

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

    Anshu、了解。 提前感谢。

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

    您好、Terry、

    e2e.ti.com/.../example.syscfg

    我更改了上述 example.syscfg 中的 RAT 配置、并尝试从 CCS 调试器加载程序。  加载程序时没有出现任何错误,但控制台上没有打印任何内容。

    从 CCS 调试器加载符号时、我收到下面附加的错误。 我们正与硬件和软件团队合作解决该问题。

    此致、

    Tushar Thakur  

    加载程序时:  

    加载符号时:

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

    稍后于10月14日编辑

    Tony 和 Terry、您好!

    有多少指令数据?  

    请记住、整个256KB 的本地 SRAM 可用于指令代码(不仅仅是192KB 的 I-RAM)。 更多信息、请参阅 AM62x TRM "MCU_M4FSS 内部 RAM"部分。

    如果客户用例中的指令代码小于256KB、我建议将指令代码放置在 M4F 本地 SRAM 中、并将数据代码放置在其他位置( 如果其他内核未使用64KB OCSRAM、则可实现更快的访问;DDR 可提供更大的存储器空间。

    是否存在任何硬件限制?

    我今天与硬件团队进行了核对。 从信号连接的角度来看、M4F 应该能够访问存储在处理器其余部分(ICode -> CBASS -> RAT -> DDR)中的指令数据:

    从处理器行为的角度来看、我不确定如果内核希望将程序计数器移动到下一条指令、 然后、指令数据读取没有由该时钟信号完成(例如、暂停执行读取所需的多少个时钟周期? 还有事吗?) 我也不确定指令是作为一个批读取到 M4F 中、还是一次读取一个(即、您需要在每个汇编指令之间等待潜在的数百个时钟周期、还是只需要等待一个???? 装配说明数量?)

    调试的后续步骤

    程序可能正在运行、但 CCS 不知道如何为存储在本地 IRAM 以外的位置的指令设置断点。

    通过使用 M4F 读取/写入某些已知存储器地址、然后从 Linux 读取和写入这些存储器地址、您仍然可以检查 M4F 代码是否按预期运行或冻结在某些位置。 有关如何从 PRU 内核执行该操作的示例、请参阅 PRU 入门实验室调试实验: https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_04_01_03/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab5.html#debugging-the-pru-from-linux-core

    另一个调试选项是检查远程内核的 sysfs 日志。 注意:如果使用我在 您的另一个线程上提供的资源表解决方法、则还有一个额外的步骤:

    您需要进入 SysConfig 并确保选择"Enable Memory Log"选项(不确定它在 SysConfig 中的位置)。 您可以通过执行构建来判断是否正确选择了该选项。
    请查看此生成的文件:project/board/m4fs0-0_freertos/ti-arm-clang/genered/ti_DPL_config.c
    确保生成的文件具有以下代码行:

          void putchar_(char character)
          {
              // Output to memory trace buffer
              DebugP_memLogWriterPutChar(character);
          }
     

    之后、Linux 应该能够看到调试日志、如下所述: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1131412/am6442-redirect-logs-from-core-r5-to-linux 

    此致、

    Nick

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

    检查项目所需指令存储器大小的示例  

    我了解了 AM62x MCU+ SDK 8.4:
    make -s -C examples/drivers/ipc/ipc_rpmsg_echo_linux/am62x-sk/m4fs0-0_freertos/ti-arm-clang

    从 linker.cmd 文件中、这些存储器部分看起来像是被存储在本地 SRAM IRAM 部分中:

    SECTIONS
    {
    ...
        .text:   {} palign(8) > M4F_IRAM     /* This is where code resides */
    
    ...
        .sysmem: {} palign(8) > M4F_IRAM     /* This is where the malloc heap goes */
        .stack:  {} palign(8) > M4F_IRAM     /* This is where the main() stack goes */
    
    ...
    
        /* Sections needed for C++ projects */
        .ARM.exidx:     {} palign(8) > M4F_IRAM  /* Needed for C++ exception handling */
        .init_array:    {} palign(8) > M4F_IRAM  /* Contains function pointers called before main */
        .fini_array:    {} palign(8) > M4F_IRAM  /* Contains function pointers called after main */
    }
    

    现在、让我们看一下映射文件:

    VI 示例/drivers/ipc/ipc_rpmsg_echo_linux/am62x-sk/m4fs0-0_freertos/ti-arm-clang/ipc_rpmsg_echo_linux.release.map

    在此示例中、使用了0x14b50 = 84816字节= 82KB 的 IRAM:

    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      M4F_VECS              00000000   00000200  00000140  000000c0  RWIX
      M4F_IRAM              00000200   0002fe00  00014b50  0001b2b0  RWIX
      M4F_DRAM              00030000   00010000  0000e8f8  00001708  RWIX
      DDR_0                 9cc00000   00001000  00001000  00000000  RWIX
    

    然后、您可以在映射文件中进一步向下滚动、以查看占用存储器每个部分的确切内容。

    此致、

    Nick

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

    /* make sure below retain is there in your linker command file, it keeps the vector table in the final binary */
    --retain="*(.vectors)"
    /* This is the stack that is used by code running within main()
     * In case of NORTOS,
     * - This means all the code outside of ISR uses this stack
     * In case of FreeRTOS
     * - This means all the code until vTaskStartScheduler() is called in main()
     *   uses this stack.
     * - After vTaskStartScheduler() each task created in FreeRTOS has its own stack
     */
    --stack_size=163840
    /* This is the heap size for malloc() API in NORTOS and FreeRTOS
     * This is also the heap used by pvPortMalloc in FreeRTOS
     */
    --heap_size=327680
    
    
    SECTIONS
    {
        /* This has the M4F entry point and vector table, this MUST be at 0x0 */
        .vectors:{} palign(8) > M4F_VECS
        .text:   {} palign(8) > DDR_AIRAM     /* This is where code resides */
    
        .bss:    {} palign(8) > DDR_ADRAM     /* This is where uninitialized globals go */
        RUN_START(__BSS_START)
        RUN_END(__BSS_END)
    
    //	.cinit:	 {} palign(8) > M4F_DRAM
        .data:   {} palign(8) > DDR_ADRAM     /* This is where initialized globals and static go */
        .rodata: {} palign(8) > DDR_ADRAM     /* This is where const's go */
        .sysmem: {} palign(8) > DDR_AIRAM     /* This is where the malloc heap goes */
        .stack:  {} palign(8) > DDR_AIRAM     /* This is where the main() stack goes */
    
    	GROUP {
            /* This is the resource table used by linux to know where the IPC "VRINGs" are located */
            .resource_table: {} palign(4096)
        } > DDR_0
    
        /* Sections needed for C++ projects */
        .ARM.exidx:     {} palign(8) > DDR_AIRAM  /* Needed for C++ exception handling */
        .init_array:    {} palign(8) > DDR_AIRAM  /* Contains function pointers called before main */
        .fini_array:    {} palign(8) > DDR_AIRAM  /* Contains function pointers called after main */
    }
    
    MEMORY
    {
        M4F_VECS : ORIGIN = 0x00000000 , LENGTH = 0x00000200
        M4F_IRAM : ORIGIN = 0x00000200 , LENGTH = 0x0002FE00
        M4F_DRAM : ORIGIN = 0x00030000 , LENGTH = 0x00010000
    
    	/* when using multi-core application's i.e more than one R5F/M4F active, make sure
         * this memory does not overlap with R5F's
         */
        /* Resource table must be placed at the start of DDR_0 when M4 core is early booting with Linux */
        DDR_0       : ORIGIN = 0x9CC00000 , LENGTH = 0x100000
        DDR_AIRAM	: ORIGIN = 0x9CD00000 , LENGTH = 0x80000
        DDR_ADRAM	: ORIGIN = 0x9CD80000 , LENGTH = 0x80000
    }
    

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

    您好、Nick、

    我们的目标是运行 link.cmd normallyq、但现在有一个编译错误代码"#10099-D"。 实际上,我们需要将内部存储器 IRAM 和 DRAM 修改为 DDR 中的外部存储器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="16414" URL"~/support/processors-group/processors/f/processors-forum/1138163/am625-mcu_m4-execute-code-from-external-memory/4368756 #4368756"]我更改了上面附加的 example.syscfg 中的 RAT 配置、并尝试从 CCS 调试器加载程序。

    如果在工程中更改 RAT、 则需要执行它才能生效。 不会影响固件负载。

    我有一些问题:

    需要在加载固件之前配置 RAT? 从 M4存储器视图中、默认情况下 M4无法访问 DDR 空间、但为什么无需配置 RAT 即可从 CCS 加载?

    根据测试结果、如果仅按如下方式将数据分配给 DDR、则保持 IRAM 中的.text、可以加载并运行。

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

    您好 Tony、

    我们仍在检查在 M4F 引导期间何时配置了 RAT。 但是、我不确定在访问 DDR 之前是否必须配置 RAT。 如果未配置 RAT、则对本地地址0x4_0000 - 0x83_FFFF 和0x6000_0000 - 0xDFFFF 的存储器访问可能只会转到完全相同的系统地址(而不是被阻止)。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="280115" URL"~/support/processors-group/processors/f/processors-forum/1138163/am625-mcu_m4-execute-code-from-external-memory/4371683 #4371683"]如果未配置 RAT、则对本地地址0x4_0000 - 0x83_FFFF 和0x6000_0000 - 0xDFF_FFFF 的存储器访问可能只会转到完全相同的系统地址(而不是被阻止)。

    谢谢、这有助于我了解:

    任何从 MCU M4F 到达该地址范围的事务都将通过 RAT 进行地址重映射、然后再到达其他端点

    如果未映射、请首先检查 RAT、然后转至系统地址。 它解释了可以从 CCS 下载并从 Linux 成功加载、根据当前测试结果、只能从 DDR 执行、但可以从 DDR 访问数据。