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:如何增加 RAM 存储器(.ebss 存储器错误)

Guru**** 2561170 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1271817/tms320f28379d-how-can-i-increase-ram-memory-ebss-memory-error

器件型号:TMS320F28379D

大家好!

我有一个用于 DSP 320F28379D 的代码、它在 CPU 2上需要高内存 RAM (高 RAM 内存是由于高大小矩阵(例如、60x60、60x80大小矩阵))。 当我通过 CCS 编译代码时、我得到以下错误。

Lab_11_CPU2.cmd"、第46行:错误#10099-D:程序无法装入可用内存。 对".ebss"大小0x4eb7 page 1的对齐/分块运行放置失败。 可用存储器范围:
RAMM0大小:0x3b0未使用:0x1b0最大空洞:0x1b0

如上面的错误按摩师所示、RAMM0内存总共有3b0字节、但我的代码 需要大约0x4eb7 字节。 我的 Lab_11_CPU2.cmd 部分如下所示。

内存
{
第0页:/*程序存储器*/
Begin_M0:origin = 0x000000、length = 0x000002 /*部分 M0 RAM -用于"Boot to M0" bootloader 模式*/
RAMLS45:origin = 0x00A000,length = 0x001000 /* L4-5 RAM,DCSM 安全,CLA 程序 RAM */
Begin_FLASH:origin = 0x080000、length = 0x000002 /*闪存扇区 A 的一部分-用于"跳转至闪存"引导加载程序模式*/
FLASH_A:origin = 0x080002、length = 0x001FFE /*闪存扇区 A 部分- DCSM 安全*/
FLASH_BCDEFGHIJKLMN : origin = 0x082000, length = 0x03E000 /*闪存扇区 B、C、D、E、F、G、H、I、J、K、L、M、N 组合- DCSM 安全*/
复位(R):origin = 0x3FFFC0,length = 0x000002 /* Part of Boot ROM */

第1页:/*数据存储器*/
BOOT_RSVD:origin = 0x000002、length = 0x00004E /* M0 RAM 的一部分,引导 ROM 将此用于堆栈*/
RAMM0:origin = 0x000050、length = 0x0003B0 /* M0 RAM */
RAMM1:origin = 0x000400、length = 0x000400 /* M1 RAM */
CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080 /* CLA 至 CPU 消息 RAM、DCSM 安全*/
CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080 /* CPU 至 CLA 消息 RAM、DCSM 安全*/
RAMLS0:origin = 0x008000、length = 0x000800 /* L0 RAM、DCSM 安全、CLA 数据 RAM */
RAMLS1:origin = 0x008800、length = 0x000800 /* L1 RAM、DCSM 安全、CLA 数据 RAM */
RAMLS2:origin = 0x009000,length = 0x000800 /* L2 RAM,DCSM 安全,CLA 数据 RAM */
RAMLS3:origin = 0x009800、length = 0x000800 /* L3 RAM、DCSM 安全、CLA 数据 RAM */
RAMD0:origin = 0x00B000,length = 0x000800 /* D0 RAM,DCSM 安全,ECC */
RAMD1:origin = 0x00B800,length = 0x000800 /* D1 RAM,DCSM 安全,ECC */

对于发送存储器错误、分配给 L0-L5、D0-D1和 GS0-GS15的 RAM 区域与 RAMM0结合在一起、但代码不起作用。

我需要特别增加.ebss 的 RAM 存储器。 您能帮助我如何操作吗?

谢谢...

此致...

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

    您好、Baris:

    要增加分配给.ebss 段的存储器空间、可执行以下操作:

    .ebss            : >> RAMLS5 | RAMLS6

    只要 RAM 在同一页面上、您就可以继续为该部分所需的 RAM 添加"| RAMLS#"。 如果您尽可能多地添加 RAM、但仍然 存在此问题、则可能必须将数据存储到闪存中、以便可以正确编译项目。

    此致、

    阿米尔·奥马尔

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

    您好、Omer:

    如前所述、我将部分从 LS0添加到 LS5以及其他 RAM 部分、但如我在下图中所示、完成此过程后、表达式屏幕上分配给变量的值不正确(所有值均为零)。 例如、我定义了浮点 W1=0.4、w2=0.3、W3=0.2、W4=0.1;但它们  在表达式窗口中的值却大相径庭。 这对其他变量也有效。

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

    此外、如果我需要、如何起诉 RAM 之类的闪存?

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

    您好、Baris:

    您是在函数范围之外还是在主程序的某些部分中定义它们的值? 您的项目属性中是否使用 COFF 或 EABI 输出格式?

    此外,如果需要,如何像 RAM 一样起诉闪存?

    要使用闪存进行设置、只需右键单击项目并转至 Build Configurations > Set Active > 并选择适合您的闪存选项之一。 接下来、右键点击 RAM 链接器命令文件并选择"exclude from build"、然后右键点击闪存链接器命令文件并取消选择"exclude form build"。 这会将您的项目设置为从闪存运行。

    此致、

    阿米尔·奥马尔

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

    Hella Omer,  

    下面是定义值的部分。  

    #include "Lab.h" // Main include file
    #include "math.h"
    #include "IQmathLib.h"
    //#define _IQdiv(A,B) ((float)(A) / (float)(B))
    #define _IQ24div(A,B) ((float)(A) / (float)(B))
    
    int Vbat1, Vsc1, Ibat1, Isc1, Iyuk1; // Sensörlerden okunacak dijital veriler
    float Vbat2, Vsc2, Ibat2, Isc2, Iyuk2; // İşlenen sensör verileri
    int N=20, sayac, j, jj, Pbatref; // N: Tahmin bölgesi boyutu
    float gamae[60][1], gama[10][1], zref[80][1],h=0.000005, Energy_sc_f=10, Energy_bat_f; // h adım aralığı
    float A1, A2, oran;
    int donusturucu1=1, k, l, m, n, o, p, iii, uye1, uye2, uye3, uye3, uye_son;
    float T_anah, pulse, Pyuk, Preq, soc_bat, soc_sc;
    float Pbat, Psc;
    unsigned long int f_anah=10000, n1, N_dongu1;
    float Pbatmak=1100, SOCbatmak=0.9, SOCscmak=0.9, SOCscth=0.4;
    // MPC ön hazırlık parametre hesabı
    int a=1;
    float w1=0.4, w2=0.3, w3=0.2, w4=0.1;
    float E[80][80], F[80][1], GG[80][1], NM[60][80], zmin[60][1], zmak[60][1];

    除此之外、我在主 kod 中有一些定义部分、如下所示。

    while(1) // endless loop - wait for an interrupt
    {
    GpioDataRegs.GPATOGGLE.bit.GPIO26 = 1;
    // Ölçüm işlemi;
    Vbat1= (AdcaResultRegs.ADCRESULT0);
    Vsc1= (AdcaResultRegs.ADCRESULT2);
    Ibat1= (AdcaResultRegs.ADCRESULT3);
    Isc1= (AdcaResultRegs.ADCRESULT4);
    Iyuk1= (AdcaResultRegs.ADCRESULT5);
    
    // Ölçüm kalibrasyonu
    Vbat2= (Vbat1)*0.002102245*0.4;
    Vsc2= (Vsc1)*0.002102245*0.4;
    Ibat2= (Ibat1)*0.002102245*0.4;
    Isc2= (Isc1)*0.002102245*0.4;
    Iyuk2= (Iyuk1)*0.002102245*0.4;
    
    Pyuk=295;//Vbat2*Iyuk2;
    soc_bat=0.8;//Ibat2;
    soc_sc=1;//Isc2;

    主代码外部和值内部的定义不会显示在快速窗口中。

    最后、我将使用  COFF 格式。

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

    您好、Baris:

    如果您单独而不是内联定义变量、是否会有任何变化? 我知道在一行中初始化全局变量时遇到了问题、但我不记得我是否使用了相同的语法/变量类型。

    请尝试以下操作:

    float w1=0.4;
    float w2=0.3;
    float w3=0.2;
    float w4=0.1;

    此致、

    阿米尔·奥马尔

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

    尊敬的 Omer:

    很抱歉、我花了一段时间才回复。 实际上、您之前的回答部分解决了我的 RAM 存储器问题。

    我的代码有一些大的矩阵,例如 F[60][80],但使用这个大小,我收到我之前提到的内存错误消息。

    我可以通过减小矩阵大小来解决该误差。 例如 F[60][60]。 事实上,这种版本的矩阵是令人满意的。 但在 未来的研究中,如果我需要大尺寸的矩阵超过[60][60],我怎么能解决。

    谢谢...

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

    您好、Baris:

    我的代码有一些大矩阵,例如 F[60][80],但使用此大小时,我收到我之前提到的内存错误消息。

    我想您在谈论的程序不适合于可用内存。 您可以合并段( 链接器命令文件中应该有此类示例)、  但是、我认为将2D 阵列拆分为多个存储单元以及访问方式并不合适(如果您需要将该阵列存储在 RAM 中、我需要仔细检查)。 您不能将阵列存储在闪存上是出于什么原因吗?

    我可以通过减小矩阵大小来解决此错误。 例如 F[60][60]。 事实上,这种版本的矩阵是令人满意的。 但在 未来的研究中,如果我需要超过[60][60]的大尺寸矩阵,我怎么能解决。

    这是为特定段分配的存储器单元的限制(具有与上述相同的详细信息)。

    此致、

    阿米尔·奥马尔