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] [参考译文] [常见问题解答] MCU-PLUS-SDK-AM263X:如何使用 linker.cmd 文件将代码添加到 TCM 中

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165683/faq-mcu-plus-sdk-am263x-how-to-add-code-into-tcm-using-linker-cmd-file

如何编辑 linker.cmd 文件以在 TCM 中添加新的部分、以及如何将应用代码添加到这些 TCM 部分以实现更快的代码执行?

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

    有时、机器关键型应用需要使用延迟极低的代码更快地执行。 在这种情况下、可以将这段代码配置为在 TCM 中执行、因为它靠近 CPU。  如果内核正在访问其自身的 TCM、TCM 在每次访问时采用单个 R5周期。 有关 TCM 的更多信息、请参阅 TRM。 每个 R5内核包含64 KB TCM 存储器、划分如下:

    TCMA - 32KB

    TCMB - 32KB

    修改 linker.cmd 文件:

    代码和数据存储器可被单独添加至 TCM。 作为一个一般原则、代码和数据应该被放置在不同的 TCM 分区(TCMA 和 TCMB)中以进一步提高性能。 要在 TCM 中创建段、请按如下所示编辑 linker.cmd:

    .NewTCMSection1 : {} palign(8) 		> R5F_TCMA
    .NewTCMSection2 : {} palign(8) 		> R5F_TCMB

    示例:

    此处的 controlfunction 部分包含 代码并存在于 TCM_A 中 同样、应用的数据部分出现在存在于 TCM_B 中的控制数据部分

    2.为代码段的 linker.cmd 文件添加了更多内容:

    TCM 中代码所使用的堆栈也应该被放置在 TCM 中。 例如、ISR 的 IRQ 或 SVC 堆栈也应该在 TCM 中。 下图显示了如何添加 IRQ、SVC 和 FIQ 堆栈。

    注意:如果您的应用占用的 TCM 空间更小、则 linker.cmd 文件的其他部分也可以放置在 TCM 中、具体取决于如下所示的要求:

    3.修改本准则:

    现在、TCM 中所需的代码部分:

    static inline __attribute__((__section__(".controlfnc"),always_inline)) void Function_API (uint32 function_param) {}
    
    __attribute__((__section__(".controlfnc"))) int Function_API (uint32 function_param) { return 0;}

    对于全局变量:

    uint32_t GlobalVariable __attribute__((__section__(".controldata")));

    任何经常执行且占用大部分 CPU 时间的 ISR 都可以被置入 TCM 中。 ISR 使用的任何函数、如数学函数等、也应放入 TCM 中。  ISR 或内部函数内的局部变量可被作为全局变量并被添加到 TCM 中。

    4.存储器异常:

    TCMA 和 TCMB 各为32KB、因此如果在32KB 以上添加任何多余的内存、编译器会引发以下异常

    错误#10099-D:程序不能放入可用存储器中、或者该段包含需要无法为此段生成的 trampoline 的调用站点。"

    然后、用户必须重新调整需要存在的代码段以及可以避免的代码段。 通常建议将高优先级 ISR 与传感和控制环路相关的应用置于 TCM 内部。

    5.映射文件和 TCM 部分:

    要验证此代码部分是否已成功放入 TCM、请参阅以下步骤:

    1.编译并编译代码。 强烈建议在启用优化的情况下使用发行模式配置。

    R5_0_0 (第1个内核)中的 TCMA 出现在地址0x0000到0x07FFF 之间。

    R5_0_0 (第一个内核)中的 TCMB 在地址0x80000至0x807FFF 之间存在。

    4.在.map 文件中搜索您各自的 TCM 段名称、以查找  其在 TCM 内的各自存储器位置。  此信息应出现在映射文件的分配映射标题部分、例如:

    5.检查 .map 文件中的内存配置标题,查看 TCM 和 OCRAM 的内存使用情况,如下所示:

    以下链接器脚本可用作使用64KB TCM 的参考:

    e2e.ti.com/.../8272.linker.cmd

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

    以下是在锁步模式下使用 AM263 TCM 128KB 的配置:

    1.最初将 AM263设置为锁步模式。 以下步骤是使用 CCS - gels 将 AM263设置为锁步模式。

    • 如果要通过 CCS 强制配置工程以在双核模式下工作、则可以通过 GEL 文件执行该操作。  
    • GEL 文件: ccs\ccs_base\emulation\gel\AM263x\AM263x.gel。
    • 此处将"MODE = AM263x_Check_Supported_mode ();"修改为"MODE = 1;"并发出系统复位或上电复位。
    • 通过此更改、CCS 始终将器件配置为"双核模式"、并且可以使用所有四个 R5内核。  要恢复到锁步模式、请撤消此更改。

    以下步骤是使用 SBL 将 AM263设置为锁步模式。

    • 如果正在刷写的应用程序映像仅包含单个内核映像- R50_0或 R51_0 (仅一个应用程序内核映像)
      • 在 SBL 流程结束时、R5的应用程序映像将开始在锁步模式下运行。

    2.现在将 TCM 大小设置为128KB,如下链接器文件所示:

    现在 、在 syscfg 的 MPU 配置中将 TCMA 大小设置为64KB、将 TCMB 大小设置为64KB、如下所示:

    TCMA:

    TCMB:

    这应将您的应用配置为使用128 KB TCM。 要验证内核的锁步模式、您可以使用此 API -  

    状态 = SOC_rcmIsR5FInLockStepMode (CSL_ARM_R5_cluster_Group_ID_0);

    我在我的末尾也进行了同样的测试、这里是一张"Memory Allocation"选项卡的图片: