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.

[参考译文] TMS320F28374D:具有覆盖的 CLA 代码

Guru**** 2401625 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370421/tms320f28374d-cla-code-with-overlay

器件型号:TMS320F28374D

工具与软件:

大家好!

我有一个软件、该软件具有多种工作模式。

代码使用 CPU 或 CLA。 因为 CLA 器件被分为许多功能、我根据当前的工作模式使用这些功能。

但是 CLA 的可用存储器受到限制(仅 LS 空间)、我想知道是否可以定义重叠?

由于我在每个配置中只使用了几个 CLA 函数、因此想法是为实际的工作模式加载相应的函数。

我的 CLA 函数命名如下:y

  • CLA1ModeA_xxxx:用于模式 A 的所有 CLA 函数
  • CLA1ModeB_xxxx:用于模式 B 的所有 CLA 函数
  • 等等

在链接器文件中、我的 CLA 段定义如下:

   Cla1Prog         : LOAD = FLASHG,
                      RUN = RAMLS1_5,
                      LOAD_START(_Cla1funcsLoadStart),
                      LOAD_END(_Cla1funcsLoadEnd),
                      RUN_START(_Cla1funcsRunStart),
                      LOAD_SIZE(_Cla1funcsLoadSize),
                      PAGE = 0, ALIGN(4)
                      
   CLAscratch       :
                     { *.obj(CLAscratch)
                     . += CLA_SCRATCHPAD_SIZE;
                     *.obj(CLAscratch_end) } >  RAMLS0,  PAGE = 1

   .scratchpad      : > RAMLS0, PAGE = 1
   .bss_cla         : > RAMLS0, PAGE = 1
   .const_cla	    : LOAD = FLASHG,
                      RUN = RAMLS0,
                      RUN_START(_Cla1ConstRunStart),
                      LOAD_START(_Cla1ConstLoadStart),
                      LOAD_SIZE(_Cla1ConstLoadSize),
                      PAGE = 1

如何将其更改为与 UNION 和 GROUP 一起使用覆盖?

UNION
{
    GROUP
    {
       ???
    } load = FLASHG, LOAD_START(_taskA_load_start), SIZE(_taskA_size)
    GROUP
    {
       ???
    } load = FLASHG, LOAD_START(_taskB_load_start), SIZE(_taskB_size)
} run = RAMLS1_5, RUN_START(_task_run_start)

感谢您的任何帮助。

此致

法布里斯

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

    尊敬的 Fabrice:

    我建议在链接器 cmd 文件中保持 CLA 存储器分配相同、并在每个函数周围添加#if 语句来检查选择的是哪种工作模式。 您可以添加#define 以 参考 正在运行的工作模式,以及#if 语句可以检查此情况。

    例如、您可能具有:

    #define WORKING_MODE 1

    #if WORKING_MODE == 1

    //include function definitions for CLA1ModeA_xxxx functions

    #endif

    #if WORKING_MODE == 2

    //include function definitions for CLA1ModeB_xxxx functions

    #endif

    您也可以为每种工作模式添加预定义符号、并将函数封装到#ifdef语句中。

    这样一来、编译器实际上就不会为当前工作模式下不需要的函数分配 CLA 内存。 请告诉我、这对您而言是否是可行的解决方案。

    此致、

    德拉尼

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

    尊敬的 Delaney:

    感谢您的意见、但这不是我真正想做的。

    使用定义意味着有多个已编译版本。 CLA 例程是"静态的"、我无法"动态"更改配置。

    我要做的就是将所有 CLA 例程编译并存储在闪存中、但根据引导配置只在 RAM 中加载我需要的函数组。

    此致、

    法布里斯

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

    我发现自己是一个似乎有效的解决方案。

    非常简单:#pragma CODE_SECTION用于将所需的函数移动到特定的代码段中!

    例如:

    #pragma code_section (Cla1ModeATask1、"Cla1ModeA");
    __interrupt void Cla1ModeATask1(){...}

    #pragma code_section (Cla1ModeATask2、"Cla1ModeA");
    __interrupt void Cla1ModeATask2(){...}

    ...

    #pragma code_section (Cla1ModeBTask1、"Cla1ModeB");
    __interrupt void Cla1ModeBTask1(){...}

    #pragma code_section (Cla1ModeBTask2、"Cla1ModeB");
    __interrupt void Cla1ModeBTask2(){...}


    然后在链接器文件中、

    // mode specific functions
    UNION
    {
        GROUP
        {
            Cla1ModeA : {}
        } LOAD = FLASHG, LOAD_START(_Cla1ModeALoadStart), SIZE(_Cla1ModeALoadSize)
    
        GROUP
        {
            Cla1ModeB : {}
        } LOAD = FLASHG, LOAD_START(_Cla1ModeBLoadStart), SIZE(_Cla1ModeBLoadSize)
    
    } RUN = RAMLS1_5, RUN_START(_Cla1OptionsRunStart), PAGE = 0
    
    //Cla1Prog contains the common code
    Cla1Prog    : LOAD = FLASHG,
                  RUN = RAMLS1_5,
                  LOAD_START(_Cla1funcsLoadStart),
                  LOAD_END(_Cla1funcsLoadEnd),
                  RUN_START(_Cla1funcsRunStart),
                  LOAD_SIZE(_Cla1funcsLoadSize),
                  PAGE = 0, ALIGN(4)