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:如何增加 M4内核的代码大小。

Guru**** 2487425 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1434152/am625-how-to-increase-code-size-for-m4-core

器件型号:AM625

工具与软件:

大家好!

我正在处理 M4内核与 A53内核之间的 IPC。 我使用 MCU+SDK v10为 M4内核开发 IPC + SPI 应用。 在集成这两个应用(这两个应用都已单独测试并发现正常工作)的同时、我发现给定的 DDR 大小不足以满足要求、因此我必须将其增加。

我找到了以下文档、但在 进行建议的修改后无法解决该问题。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1187962/faq-sk-am62-how-to-execute-code-from-external-memory-using-m4f-core#:~:text=To%20execute%20code%20from%20external%20memory%20using%20M4F%2C%20specify%20the,core%20is%20natively%2032b%20processor

由于涉及到 IPC、A53侧是否也应进行任何更改? 附加 sysfs 和链接器文件(不工作、上面链接建议的更改已完成)以供参考。

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


    /*确保下面的 retain 位于您的链接器命令文件中、它将矢量表保留在最终的二进制文件中*/
    --retain="*(.vectors )"
    /*这是在 main ()中运行的代码所使用的堆栈。
    *在 NORTOS 的情况下,
    *-这意味着 ISR 之外的所有代码都使用这个堆栈
    *对于 FreeRTOS
    *-这意味着在 main ()中调用 vTaskStartScheduler ()之前的所有代码
    *使用此堆栈。
    *-在 vTaskStartScheduler ()之后,在 FreeRTOS 中创建的每个任务都有自己的堆栈
    */
    -- stack_size=16384.
    /*这是 NORTOS 和 FreeRTOS 中 malloc () API 的堆大小
    *这也是 FreeRTOS 中由 pvPortMalloc 使用的堆
    */
    -- heap_size=32768


    部分中)

    /*这有 M4F 入口点和矢量表、必须位于0x0 */
    .vectors:{}palign (8)> M4F_VECS
    .text:{}palign (8)> M4F_IRAM /*这是代码所在的位置*/

    .bss:{}palign (8)> DDR_1 /*这是未初始化的全局变量 Go */的位置
    RUN_START (__BSS_START)
    RUN_END (__BSS_END)

    .data:{}palign (8)> DDR_1 /*这是初始化全局变量和静态 go */的位置
    .rodata:{}palign (8)> M4F_IRAM /*这是 const 的 go 的位置*/
    .sysmem:{}palign (8)> M4F_IRAM /*这是 malloc 堆进入的位置*/
    .stack:{}palign (8)> M4F_IRAM /*这是 main ()栈的位置*/

    组{
    /*这是 Linux 用来知道 IPC"VRINGs"所在位置的资源表*/
    .resource_table:{}palign (4096)
    }> DDR_IPC_resource_table_linux

    /* C++项目所需的部分*/
    .arm.exidx:{}palign (8)> M4F_IRAM /* C++异常处理需要*/
    .init_array:{}palign (8)> M4F_IRAM /*包含在 main 之前调用的函数指针*/
    fini_array:{}palign (8)> M4F_IRAM /*包含在 main 之后调用的函数指针*/
    /*仅在启用 IPC RPMessage 时使用、否则不使用*/
    .bss.ipc_vring_mem (NoLoad):{}> DDR_IPC_VLING_RTOS
    }

    小程序

    M4F_VECS : origin = 0x00000000 , length = 0x00000200
    M4F_IRAM : origin = 0x00000200 , length = 0x0002FE00
    m4f_dram:origin = 0x00030000、length = 0x00010000

    /*当使用多核应用程序时、即多个 R5F/M4F 处于活动状态、请确保
    *该存储器不与 R5F 重叠
    */
    /*当 M4内核使用 Linux 提前引导时、资源表必须置于 DDR_IPC_resource_table_linux 的开头*/
    DDR_IPC_resource_table_linux:origin = 0x9CC00000、length = 0x1000
    DDR_1:origin = 0x9CB00000、length = 0x100000


    DDR_IPC_VLING_RTOS:origin = 0x9C800000、length = 0x00300000
    }

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

    您好!

    指定的专家目前不在办公室、请预计下周前回复。

    感谢您的耐心。

    此致、

    Vaibhav

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

    大家好、Aaron:

    您能否告诉我们您希望您的应用有多大的尺寸?

    您能告诉我们您遇到了什么问题吗?

    请分享错误日志的屏幕截图。

    此致、

    Tushar

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

    您好!

    我很抱歉这么晚才答复。 该应用至少需要2MB 的 DDR。

    我们在尝试构建代码时收到以下错误:  

    说明资源路径位置类型
    #10099-D 程序将无法装入可用内存中、或者该段包含的调用站点需要无法为此段生成 trampoline。 针对段".stack"大小0x4000运行带对齐的放置失败。 可用的存储器范围:linker.cmd /ipc_rpmsg_echo_linux_am62x-sk_m4fss0-0_freertos_ti-arm-clang line 32 C/C++问题

    说明资源路径位置类型
    #10099-D 程序将无法装入可用内存中、或者该段包含的调用站点需要无法为此段生成 trampoline。 针对段".sysmem"大小0x8000运行带对齐的放置失败。 可用的存储器范围:linker.cmd /ipc_rpmsg_echo_linux_am62x-sk_m4fss0-0_freertos_ti-arm-clang 行31 C/C++问题

    目前、我们正在将.bss 和.stack 段移至 IRAM 来构建程序。 但我们计划在代码中添加更多特性、这些特性可能需要比给定的更多的存储器。

    希望得到响应、

    亚伦

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

    大家好、Aaron:

    从上面我可以看出、.stack 段不适合使用可用的 M4F_IRAM 存储器。

    您可以尝试将其移动到 DDR 并检查一次程序吗?

    在 linker.cmd 中进行以下更改并重建应用程序。

    .stack: {} palign(8) > DDR_1

    此致、

    Tushar

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

    您好!

    感谢您的答复。

    目前、我们能够在 IRAM 和 DDR 之间的代码部分走动、以调整代码。 但我们计划通过添加一些传感器功能来扩展代码、而且我认为、指定的空间不足。  

    是否可以将 DDR 大小增加到高于默认链接器脚本中给定的值?

    谢谢。此致、

    亚伦

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

    大家好、Aaron:

    您可以根据内存布局指南增大内存大小。

    请参阅 https://software-dl.ti.com/mcu-plus-sdk/esd/AM62X/latest/exports/docs/api_guide_am62x/MEMORY_MAP.html 以了解存储器信息。

    您可以将以下区域用于代码、该区域配置了3MB 的 DDR 存储器、足以满足上述要求。

    DDR_2 : ORIGIN = 0x9CC01000 , LENGTH = 0x300000

    请告知我们上述解决方案是否有效。

    此致、

    Tushar