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.

[参考译文] TMS320F28386S:CLA 程序 RAM:超出可用内存

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1633528/tms320f28386s-cla-program-ram-exceeding-available-memory

部件号: TMS320F28386S

我正在处理一个具有三种离散运行模式的工程、需要将三个不同的应用从闪存加载到 CLA 中。   

根据当前配置、我没有足够的 LSRAM 来支持所有三种应用程序、因此会得到以下错误:

错误#10099-D:程序无法放入可用内存中、或者段包含一个调用点、该调用点需要无法为该段生成蹦床函数。  

在我的命令文件中、我定义了:

移动数据

  RAM_CLA_PROGRAM  :origin = 0x008000、length = 0x003800  /* LS0 - LS6 */
  RAM_CLA_DATA       :origin = 0x00B800、length = 0x000800  /* LS7 */

  Flash_Application1    :origin = 0x0B8000、length = 0x002000  /*闪存扇区  K */
  Flash_Application2    :origin = 0x0BA000、length = 0x002000  /*闪存扇区 L */
  Flash_Application3    :origin = 0x0BC000、length = 0x002000  /* flash sector M */

}

很重要

  Cla1 Prog_Application 1    :  load = flash_Application1、
                           RUN = RAM_CLA_PROGRAM、
                           LOAD_START (cla1 Funcs_Application 1_loadstart)、
                           load_size (cla1 Funcs_Application 1_loadsize)、
                           LOAD_END (cla1 Funcs_Application 1_loadend)、
                           RUN_START (cla1 Funcs_Application 1_runstart)、
                           RUN_SIZE (cla1 Funcs_Application 1_runsize)、
                           RUN_END (cla1 Funcs_Application 1_runend)、
                           对齐 (8)

  Cla1 Prog_Application 2    :  load = flash_Application2、
                           RUN = RAM_CLA_PROGRAM、
                           LOAD_START (cla1 Funcs_Application 2_loadstart)、
                           load_size (cla1 Funcs_Application 2_loadsize)、
                           LOAD_END (cla1 Funcs_Application 2_loadend)、
                           RUN_START (cla1 Funcs_Application 2_runstart)、
                           RUN_SIZE (cla1 Funcs_Application 2_runsize)、
                           RUN_END (cla1 Funcs_Application 2_runend)、
                           对齐 (8)

  Cla1 Prog_Application 3    :  load = flash_Application3、
                           RUN = RAM_CLA_PROGRAM、
                           LOAD_START (cla1 Funcs_Application 3_loadstart)、
                           load_size (cla1 Funcs_Application 3_loadsize)、
                           LOAD_END (cla1 Funcs_Application 3_loadend)、
                           RUN_START (cla1 Funcs_Application 3_runstart)、
                           RUN_SIZE (cla1 Funcs_Application 3_runsize)、
                           RUN_END (cla1 Funcs_Application 3_runend)、
                           对齐 (8)

}

因此、我想做的是在初始化 CLA 时、通过 memcpy 选择性地加载应用程序 1、2 或 3:

  if(Application== Application1)
  {
    memcpy (&cla1 memcpy 1_runstart、  &cla1 Funcs_Application 1_loadstart、 (Funcs_Application)&cla1 Funcs_Application 1_loadsize);
  }
  Else if (Application== Application2)
  {
    memcpy (&cla1 Funcs_Application 2_runstart、  &cla1 Funcs_Application 2_loadstart、 (uint32)&cla1 Funcs_Application 2_loadsize);
  }
  Else if (Application== Application3)
  {
    memcpy (&cla1 Funcs_Application 3_runstart、  &cla1 Funcs_Application 3_loadstart、 (uint32)&cla1 Funcs_Application 3_loadsize);
  }

问题:

(cla1 Funcs_Application cla1_loadsize + cla1 Funcs_Application 2_loadsize + cla1 Funcs_Application 3_loadsize)>(RAM_cla_program = 0x38000)

我首先想到的是将段中定义的运行位置从 RAM_CLA_PROGRAM 更改为 RAMGSx 段(其中我有足够的空间)、然后从 RAMGSx 或闪存复制到 LSRAM?  这会解决编译器的存储器错误、但我必须将 cla1 lsram1_loadstart、cla1 Funcs_Application lsram2_loadstart 或 cla1 Funcs_Application 3_loadstart 重新定义为 Funcs_Application 上的地址。  如果这样做有效、我将如何实施它?  还有其他替代方案吗?


提前感谢您的任何见解。

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

    您好、Andrew、

    感谢您的提问。 我将研究问题并返回给您。

    谢谢、

    IRA

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

    您好、Andrew、

    对迟来的答复表示歉意。  

    发生链接器错误的原因是所有三个部分都共享RUN = RAM_CLA_PROGRAM、因此链接器会将它们的大小与这个单个区域求和、即使一次只有一个区域运行也是如此。

    最干净的修复方法是UNION指令 —这告诉链接器这些段是共享相同运行地址的互斥叠加。 它只为最大的应用程序分配 RAM、而不是为总和分配 RAM。

    .cmd如下所示重构您的文件:

    很重要

    联合运行= RAM_CLA_PROGRAM、RUN_START (cla1Funcs_runstart)、ALIGN (8)

    组加载= FLASH_Application1、
    LOAD_START (cla1 Funcs_Application 1_loadstart)、
    load_size (cla1 Funcs_Application 1_loadsize)

    Cla1 Prog_Application 1:{/* Application1 对象*/}
    }

    组加载= FLASH_Application2、
    LOAD_START (cla1 Funcs_Application 2_loadstart)、
    load_size (cla1 Funcs_Application 2_loadsize)

    Cla1 Prog_Application 2:{/* Application2 对象*/}
    }

    组加载= FLASH_Application3、
    LOAD_START (cla1 Funcs_Application 3_loadstart)、
    load_size (cla1 Funcs_Application 3_loadsize)

    Cla1 Prog_Application 3:{/* Application3 对象*/}
    }
    }
    }

    • 每个应用程序LOAD在闪存中获取自己的地址(不变)
    • 这三个器件RUN在 LSRAM 中共用一个地址
    • 链接器仅为最大的[2][3]保留空间
    • 您的memcpy方法仍然有效、只是告诉链接器这些段是互斥的

    由于这三者现在共用同一个运行地址、因此您的memcpy目的地是共享的cla1Funcs_runstart

    extern uint32_t cla1Funcs_runstart;
    extern uint32_t cla1 Funcs_Application 1_loadstart、cla1 Funcs_Application 1_loadsize;
    extern uint32_t cla1 Funcs_Application 2_loadstart、cla1 Funcs_Application 2_loadsize;
    extern uint32_t cla1 Funcs_Application 3_loadstart、cla1 Funcs_Application 3_loadsize;

    if (Application == Application1)

    memcpy (&cla1Funcs_runstart、&cla1 Funcs_Application 1_loadstart、
    (uint32_t)&cla1 Funcs_Application 1_loadsize);
    }
    Else if (Application == Application2)

    memcpy (&cla1Funcs_runstart、&cla1 Funcs_Application 2_loadstart、
    (uint32_t)&cla1 Funcs_Application 2_loadsize);
    }
    Else if (Application == Application3)

    memcpy (&cla1Funcs_runstart、&cla1 Funcs_Application 3_loadstart、
    (uint32_t)&cla1 Funcs_Application 3_loadsize);
    }

    谢谢、

    IRA

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

    谢谢 Ira、我会尝试一下、看看它是如何工作的。   

    使用   Cla1 Prog_Application 1:{/* Application1 对象*/}

    我假设 /* Application1 对象*/是:

    RUN_START (cla1 Funcs_Application 1_runstart)、
    RUN_SIZE (cla1 Funcs_Application 1_runsize)、
    RUN_END (cla1 Funcs_Application 1_runend)

    谢谢、

    Andy B

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

    是的、这是正确的。