Thread 中讨论的其他器件:SysConfig
如何从外部存储器执行代码? 只需更改.cmd 即可 将 代码分配给 DDR 存储器空间?
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.
在 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
您好 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]
您好、Terry、
我更改了上述 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 }
如果在工程中更改 RAT、 则需要执行它才能生效。 不会影响固件负载。
我有一些问题:
需要在加载固件之前配置 RAT? 从 M4存储器视图中、默认情况下 M4无法访问 DDR 空间、但为什么无需配置 RAT 即可从 CCS 加载?
根据测试结果、如果仅按如下方式将数据分配给 DDR、则保持 IRAM 中的.text、可以加载并运行。
谢谢、这有助于我了解:
任何从 MCU M4F 到达该地址范围的事务都将通过 RAT 进行地址重映射、然后再到达其他端点。
如果未映射、请首先检查 RAT、然后转至系统地址。 它解释了可以从 CCS 下载并从 Linux 成功加载、根据当前测试结果、只能从 DDR 执行、但可以从 DDR 访问数据。