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.

[参考译文] TMS320F28379D:链接器文件更改为闪存以使用 dclfuncs

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1627880/tms320f28379d-linker-file-changes-to-flash-for-using-dclfuncs

部件号: TMS320F28379D

主席先生/女士、

我在 RAM FW 中使用 dclfuncs 和 DCL_REFGEN。 我们需要在闪存链接器命令文件中进行哪些更改、以便我可以使用这些函数?

谢谢。此致、

Prashant Gugle  

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

    您好、Prashant、

    我会在 1 天内回复您。

    谢谢、

    IRA

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

    您好、Prashant、

    DCL 函数必须 从闪存加载、但从 RAM 执行 。 这意味着您的闪存链接器命令文件需要针对该dclfuncsmemcpy()进行双加载/运行地址配置、以及在调用任何 DCL 函数之前在启动时进行调用、以将代码从闪存物理传输到 RAM。 您可以按以下方式修改链接器 cmd。

    因此、如果您的工程已经有.TI.ramfunc 段、请将 dclfuncs 添加到同一组。 您必须为 所有加载/运行说明符创建一个 GROUP、该指定符会自动应用于这两个段。

    例如

    GROUP:LOAD = FLASH_BANK0_sec7、
    RUN = RAMLS0_RAMLS1、
    start (RamfuncsRunStart)、
    LOAD (RamfuncsLoadStart)、
    大小 (RamfuncsLoadSize)

    .TI.ramfunc
    dclfuncs
    }

    如果您没有现有的.TI.ramfunc 段、那么您可以为 dclfuncs 创建一个段、以便它从 RAM 运行。 因此、您可以在链接器 cmd 文件的 SECTIONS 块中添加类似这样的内容。

    dclfuncs:load = flash_sk0_sec7、
    RUN = RAMLS0_RAMLS1、
    start (DCLfuncsRunStart)、
    LOAD (DCLfuncsLoadStart)、
    Size (DCLfuncsLoadSize)、
    对齐 (8)、
    页面= 0

    现在、在进行任何 DCL 调用之前、您还需要将 DCL 函数从闪存复制到 RAM。 所以 oyu 可以将它添加到您的启动代码中 — 在 initPieVectTable () 之后的 main.c 中,甚至在 device.c 中

    //声明由链接器生成的符号
    extern uint32_t DCLfuncsRunStart;
    extern uint32_t DCLfuncsLoadStart;
    extern uint32_t DCLfuncsLoadSize;

    //将 DCL 函数从闪存复制到 RAM
    memcpy ((uint32_t *)&DCLfuncsRunStart、
    (uint32_t *)&DCLfuncsLoadStart、
    (uint32_t)&DCLfuncsLoadSize);

    请完成此操作后重新编译工程。

    谢谢、

    IRA

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

    尊敬的 Ira:

    由于 #ifdef 中有.TI.ramfunc、我必须执行 3 次

    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
            #if defined(__TI_EABI__)
                GROUP :  LOAD = FLASHD,
                                     RUN = RAMLS0,
                                     LOAD_START(RamfuncsLoadStart),
                                     LOAD_SIZE(RamfuncsLoadSize),
                                     LOAD_END(RamfuncsLoadEnd),
                                     RUN_START(RamfuncsRunStart),
                                     RUN_SIZE(RamfuncsRunSize),
                                     RUN_END(RamfuncsRunEnd),
                                     PAGE = 0, ALIGN(8)
                                     {
                                       .TI.ramfunc
                                        dclfuncs
                                     }
            #else
                GROUP :  LOAD = FLASHD,
                                 RUN = RAMLS0,
                                 LOAD_START(_RamfuncsLoadStart),
                                 LOAD_SIZE(_RamfuncsLoadSize),
                                 LOAD_END(_RamfuncsLoadEnd),
                                 RUN_START(_RamfuncsRunStart),
                                 RUN_SIZE(_RamfuncsRunSize),
                                 RUN_END(_RamfuncsRunEnd),
                                 PAGE = 0, ALIGN(8)
                                  {
                                    .TI.ramfunc
                                     dclfuncs
                                  }
    
            #endif
        #else
            GROUP : LOAD = FLASHD,
                             RUN = RAMLS0,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             RUN_SIZE(_RamfuncsRunSize),
                             RUN_END(_RamfuncsRunEnd),
                             PAGE = 0, ALIGN(8)
                             {
                               ramfuncs
                               dclfuncs
                             }
        #endif
    
    #endif
    

    我不需要复制这个权利吗?

    //将 DCL 函数从闪存复制到 RAM
    Memcpy ((uint32_t *)&DCLfuncsRunStart、 (uint32_t *)&DCLfuncsLoadStart、(uint32_t)&DCLfuncsLoadSize);

    谢谢。此致、

    Prashant Gugle

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

    您好、Prashant、

    正确、您必须在所有 3 种情况下添加 dclfuncs。 您也必须在启动例程中执行 memcpy ()。 您可以直接说出 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);


    因为SIZE(RamfuncsLoadSize)涵盖了 总和 大小为.TI.ramfunc+dclfuncs、此单次memcpy()调用一次复制两个部分。

    谢谢、

    IRA

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

    尊敬的 Ira:

    我在所有 3 种情况下都复制了 dclfuncs、还在 main() 中的 device_init () 之后添加了 memcpy 函数。

    谢谢。此致、

    Prashant Gugle

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

    尊敬的 Ira:

      memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    device.c 文件中已有。

    谢谢。此致、

    Prashant Gugle

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

    您好、Prashant、

    项目是否按预期工作、即您是否能够运行 DCL 函数?

    谢谢、

    IRA

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

    尊敬的 Ira:

    工程按预期运行、我能够运行 DCL 函数。

    谢谢。此致、

    Prashant Gugle

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

    好的、了解得很好。 我即将结束该主题。

    谢谢。此致、

    IRA