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.

[参考译文] CCS/LAUNCHXL-F28027F:超出存储器限制导致的正弦波生成构建错误

Guru**** 2618835 points

Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/699477/ccs-launchxl-f28027f-sine-wave-generation-build-error-due-to-exceeding-memory-limits

器件型号:LAUNCHXL-F28027F
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

朋友们、您好!  

我正在使用 ePWM 进行正弦波生成编码、我使用的控制器是 F28027F。  

我正在关注这个线程中的一个代码

https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/553678/2025201

并根据我使用的控制器更改了代码。  

问题:

当我尝试构建和调试时、它会失败、并生成此错误报告

"C:/ti/controlSUITE/device_support/f2802x/v230/f2802x_common/cmd/F2802x_generic_ram.cmd "、第121行:错误:
程序将不能放入可用的内存中。 放置方式
".econst"大小为0x100页1的对齐/分块失败。 可用
存储器范围:
RAMM1大小:0x400未使用:0xd6最大孔:0xd6
econst:>RAMM1,PAGE = 1
错误:在链接期间遇到错误;"Example_2802xEPwmUpDownAQ.out"没有
已构建

>>编译失败
gmake:***[Example_2802xEPwmUpDownAQ.out]错误1.
gmake:目标`全部'不会由于错误而重制。

我的想法:

有一个名为 b[101]的浮点数组(plz 在给定代码中观察它)。 根据错误报告、我认为 由于超出控制器的内存限制而导致生成失败。 此外、我尝试将数组的数量减少到仅5或将浮点替换为整数、然后我可以轻松地构建代码、但通过这样做对我来说完全没用、无法实现我的正弦波生成目标。  请帮我解决这个问题。  不能使用 F28027f 来生成正弦波吗?  如果是、请告诉我该怎么做。

提前感谢。

 

 

#include "DSP28x_Project.h"     

#include "math.h"

#include "float.h"            //不确定是否需要

 

typedef 结构

  volatile struct ePWM_regs * EPwmRegHandle;

 

ePWM_INFO;

 

 

 

 

#define EPWM2_TIMER_TBPRD 5000 // 5kHz PWM 周期寄存器

#define PI 3.14159265358979323846

 

void InitEPwm2Examples(void);

_interrupt void epwm2_ISR (void);

 

 

unsigned int i=0、m=0、k=0;

float A=0;

float b[101]={0};    //这是我要讨论的 b float 数组

 

 

void main (void)

  #ifdef _flash

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

  #endif

 

  InitSysCtrl()

 

  对于(m=0;m<100;m++)

  {

    a=sin (pi*0.02*m);

    如果(A<=0)

    {

      A=-a;

    }

    b[m]=5000*a;

  }

    B[100]=0;

 

 

 

  InitEPwm2Gpio()

  Dint;

 

  InitPieCtrl()

 

 

  IER = 0x0000;

  IFR = 0x0000;

 

  InitPieVectTable()

 

  EALLOW;

PieVectTable.EPWM2_INT =&epwm2_ISR;

  EDIS

 

 

  EALLOW;

  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;

  EDIS;

 

  InitEPwm2Examples();

 

  EALLOW;

  SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;

  EDIS;

 

  IER |= M_INT3;

 

  PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

 

  EALLOW;

  SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK=1;

//最初在线程中,此行是 CpuSysRegs.PCLKCR2.bit.EPWM2=1;对于 F28377s

 

  EDIS;

 

  EINT;   

  ERTM;   

 

  for (;;)

  {

      _asm ("        NOP");

  }

 

 

 

_interrupt void epwm2_ISR (void)

      /*在这里,我的代码将一个新的 sin 值分配到比较寄存器中。 对于正弦波的负极侧、PWM 逻辑反相。*/

      a=sin (pi*0.02*i);

      如果(A>=0){

      EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;//在事件 A 上清除 PWM2A、向上

      EPwm2Regs.AQCTLA.bit.CAD =AQ_SET;//在事件 B 上设置 PWM2A、向下

      EPwm2Regs.CMPA.half.CMPA =b[i];

      }

      否则

      EPwm2Regs.AQCTLA.bit.CAU =AQ_SET;//在事件 A 上设置 PWM2A、向上

      EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 B 上清除 PWM2A,向下

 

      EPwm2Regs.CMPA.half.CMPA =b[i];//对于 F28027F 位、替换为一半

      }

      i++;

      如果(i=101){

      I=0;

      }

      EPwm2Regs.ETCLR.bit.INT = 1;

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

 

 

 

InitEPwm2Examples()

      EPwm2Regs.ETSEL.bit.INTSEL = 0;//et_CTR_ZERO;// TBRD zamaninda 中断别名。

      EPwm2Regs.ETSEL.bit.INTEN = 1;//启用 INT

      EPwm2Regs.ETPS.bit.INTPRD = 1;//et_1st;//在发生第一个事件时生成 INT

      EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数

      EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载

      EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率

      EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2;

      EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1;//CC_IMMETERM;

 

      //******* 位被半个*******取代

      EPwm2Regs.CMPA.half.CMPA =0;

 

      EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//设置计时器周期801 TBCLK

 

      //******* 位被半个*******取代

      EPwm2Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0

 

      EPwm2Regs.TBCTR = 0x0000;//清除计数器

 

 

 

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    直接问题的关键在于链接器命令文件。 显然、您的程序超出了为其分配的可用内存量。 如果您还没有这样做、则可以将程序或已初始化的数据段加载到闪存中以释放更多 RAM。 您似乎正在将阵列加载到 M0存储器中。 M1通常用于堆栈-这里是这样吗? L0存储器中包含什么?

    如果您可以粘贴.cmd 文件、我将尝试提供建议。

    另请注意、您使用的是具有浮点数据类型的定点处理器。 我假设您已经知道了这种方法的含义、但您可能需要考虑迁移到浮点器件、或使用 IQmath 更高效地处理数据。

    此致、

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

    非常感谢您的快速响应。

    实际上、我在 TI 微控制器中相对较新。 是的、您猜对了、我只是将 RAM 用于调试目的。 实际上、我 正在考虑将浮点数据阵列移动到闪存中、但我不确定如何执行此操作。  请尽可能在这方面向我和 IQmath 提供指导。  我将按照您的建议在此处附加 CMD 文件。

    再次感谢 Richard 先生。

    /*
    //################################################################################################################
    //
    ////文件:F2802x_general_ram.cmd
    //
    //标题:针对 RAM 之外运行的2802x 示例的链接器命令文件
    //
    // 这仅包括2802x 器件上的所有 SARAM 块。
    // 这不包括闪存或 OTP。
    //
    // 请记住、L0受代码
    //保护 安全模块。
    //
    // 这意味着、在大多数情况下、您需要移至
    // 另一个定义了更多存储器的存储器映射文件。
    //
    //##########################################################################################################################
    //$TI 发行版:F2802x 支持库 v230 $//
    $发行 日期:5月8日星期五07:43:05 CDT 2015 $//
    版权所有:版权所有(C) 2008-2015 Texas Instruments Incorporated -//
                http://www.ti.com/ 保留所有权利$
    //############################################################################################################
    /*
    
    ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //对于 Code Composer Studio V2.2和更高版本
    //------------
    //除了这个内存连接器命令文件之外,
    //将头连接器命令文件直接添加到项目中。
    //将
    //外设结构链接到
    //内存映射中的适当位置需要使用头链接器命令文件。
    //
    //可以在中找到头文件链接器 \f2802x_headers\cmd
    //
    //对于 BIOS 应用添加: F2802x_Headers_BIOS.cmd
    //对于非 BIOS 应用程序,添加:F2802x_Headers_nonBIOS.cmd
    ================================================================================================== /*
    
    ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //对于 V2.2之前的 Code Composer Studio
    ,//----------------
    // 1)使用以下-l 语句之一在
    工程中包含//头链接器命令文件。 将
    外设结构链接到
    存储器映射中的适当//位置需要使用头链接器//文件 //
    
    ////*取消注释此行以仅包括非 BIOS 应用程序的文件*//
    /*-l F2802x_Headers_nonBIOS.cmd */
    
    //*取消注释此行以仅包括 BIOS 应用程序的文件*/
    *-l F2802x_Headers_BIOS.cmd */
    
    * 2)在项目中添加路径 \f2802x_headers\cmd 至
    project->build options、linker tab、
    library search path (-i)下的库搜索路径。
    /*================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ //
    
    *定义 F2802x
    PAGE 0的存储器块开始/长度将用于组织程序段
    PAGE 1将用于组织数据段
    
    注意:
    F2802x 上的存储器块是一致的(也是相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。
    
    L0存储器块被镜像-即
    它可以在高内存或低内存中访问。
    为简单起见、其中仅使用了一个实例
    链接器文件。
    
    可组合连续 SARAM 存储器块
    如果需要创建更大的存储器块。
    */
    
    MEMORY
    {
    PAGE 0:
    /*在本例中,L0在 PAGE 0和 PAGE 1之间拆分*/
    /* begin 用于“引导至 SARAM”引导加载程序模式*/
    
    begin :origin = 0x000000,length = 0x000002
    RAMM0 :origin = 0x000050、length = 0x0003B0
    RAML0 :origin = 0x008000、length = 0x000800
    reset :origin = 0x3FFFC0,length = 0x000002
    
    IQTABLES:origin = 0x3FE000,length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
    IQTABLES2:origin = 0x3FEB50,length = 0x00008C /*引导 ROM 中的 IQMath 表*/
    IQTABLES3:origin = 0x3FEBDC,length = 0x0000AA /*引导 ROM 中的 IQ 数学表*/
    
    引导 ROM:origin = 0x3FF27C,length = 0x000D44
    
    
    page 1:
    
    //对于此示例,L0在 page 0和 page 1之间被分割*/
    boot_RSVD:origin = 0x000002,length = 0x00004E // M0的一部分,引导 ROM 将此用于栈*/
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    }
    
    
    段
    {
    /*"引导至 SARAM"模式的设置:
    codestart 段(可在 DSP28_CodeStartBranch.asm 中找到)
    将执行重定向到用户代码的开始。 */
    codestart :>开始, PAGE = 0
    ramfuncs :>> RAMM0 | RAML0 PAGE = 0.text
    :>> RAMM0 | RAML0, PAGE = 0
    .cinit :> RAMM0, PAGE = 0.Pinit
    :>> RAMM0 | RAML0, PAGE = 0.switch
    :> RAMM0, PAGE = 0.reset
    :>重置, PAGE = 0、TYPE = DSECT /*未使用、*/
    
    .stack :> RAMM1, PAGE = 1.ebss
    :> RAMM1, PAGE = 1.econst
    :> RAMM1, PAGE = 1. //this line inating an error in CCS
    .esysmem :> RAMM1, PAGE = 1
    
    IQmath :> RAML0, PAGE = 0
    IQmathTables :>IQTABLES,page = 0,type = NoLoad
    
    //如果调用 IQNexp()或 IQexp(),取消注释以下段
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    //
    /*
    IQmathTables2:> IQTABLES2,page = 0,type = NoLoad
    {
    
    IQMath.lib (IQmathTablesRam)
    
    }
    */
    /*如果调用 IQNasin()或 IQasin(),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    //
    /*
    IQmathTables3:> IQTABLES3,page = 0,type = NoLoad
    {
    
    IQMath.lib (IQmathTablesRam)
    
    }
    */
    
    }/*//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    
    
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *
    

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

    //前面的代码中有一些错误,这是正确的

    /*

    //######################################################################################################################
    //
    //文件:f2802x_general_ram.cmd
    //
    //标题:运行 RAM 的2802x 示例的链接器命令文件
    //
    //这仅包括2802x 器件上的所有 SARAM 块。
    //这不包括闪存或 OTP。
    //
    //请记住,L0受代码保护
    //安全模块。
    //
    //在大多数情况下,这意味着您要迁移到
    //另一个定义了更多内存的内存映射文件。
    //
    //######################################################################################################################
    //$TI 发行版:F2802x 支持库 v230美元
    //$Release Date:5月8日星期五07:43:05 CDT 2015 $
    //版权所有:版权所有(C) 2008-2015 Texas Instruments Incorporated -
    // http://www.ti.com/ 保留所有权利$
    //######################################################################################################################
    *

    /*===================================================================
    //适用于 Code Composer Studio V2.2和更高版本
    //--------------------------------------------------------
    //除了该内存链接器命令文件外,
    //将头文件链接器命令文件直接添加到工程中。
    //链接时需要标头链接器命令文件
    //将外设结构设置到内部的适当位置
    //存储器映射。
    //
    //在中找到了头文件链接器文件 \F2802x_headers\cmd
    //
    //对于 BIOS 应用程序添加:F2802x_Headers_BIOS.cmd
    //对于非 BIOS 应用程序添加:F2802x_Headers_nonBIOS.cmd
    =================================================================================================== *

    /*===================================================================
    //对于 V2.2之前的 Code Composer Studio
    //--------------------------------------------------------
    // 1)使用以下-l 语句之一来包含
    //项目中的头链接器命令文件。 头文件链接器
    //将外设结构链接到正确的文件
    //内存映射中的位置*/

    /*取消注释此行以仅包括非 BIOS 应用程序的文件*/
    /*-l F2802x_Headers_nonBIOS.cmd */

    /*取消注释此行以仅包括 BIOS 应用程序的文件*/
    /*-l F2802x_Headers_BIOS.cmd */

    /* 2)在项目中添加路径 将\f2802x_headers\cmd 更改为
    库搜索路径位于 project->build options、linker tab、
    库搜索路径(-I)。
    /*================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ *

    /*定义 F2802x 的存储器块开始/长度
    PAGE 0将用于组织程序段
    第1页将用于组织数据段

    注:
    F2802x 上的存储器块是一致的(也是相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。

    L0存储器块被镜像-即
    它可以在高内存或低内存中访问。
    为简单起见、其中仅使用了一个实例
    链接器文件。

    可组合连续 SARAM 存储器块
    如果需要创建更大的存储器块。
    *

    存储器

    第0页:
    /*在本示例中,L0在第0页和第1页之间拆分*/
    /* begin 用于"引导至 SARAM"引导加载程序模式*/

    开始:origin = 0x000000,length = 0x000002
    RAMM0:origin = 0x000050、length = 0x0003B0
    RAML0:origin = 0x008000、length = 0x000800
    复位:origin = 0x3FFFC0,length = 0x000002

    IQTABLES:origin = 0x3FE000,length = 0x000B50 //引导 ROM 中的 IQMath 表*/
    IQTABLES2:origin = 0x3FEB50,length = 0x00008C //引导 ROM 中的 IQMath 表*
    IQTABLES3:origin = 0x3FEBDC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

    BootROM:origin = 0x3FF27C,length = 0x000D44


    第1页:

    /*在本示例中,L0在第0页和第1页之间拆分*/
    BOOT_RSVD:origin = 0x000002,length = 0x00004E // M0的一部分,引导 ROM 将使用此栈*/
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *


    部分

    /*"引导至 SARAM"模式的设置:
    codestart 段(可在 DSP28_CodeStartBranch.asm 中找到)
    将执行重定向到用户代码的开始。 *
    codestart:> begin,page = 0
    ramfuncs:>> RAMM0 | RAML0 page = 0
    .text:>> RAMM0 | RAML0,page = 0
    .cinit:> RAMM0,page = 0
    .pinit:>> RAMM0 | RAML0,PAGE = 0
    switch:>RAMM0,page = 0
    .reset:> reset,page = 0,type = DSECT //未使用,*/

    .stack:>RAMM1,PAGE = 1.
    .ebss:> RAMM1,PAGE = 1
    econst:>RAMM1,page = 1///此行会在 CCS 窗口中生成错误
    .esysmem:>RAMM1,PAGE = 1.

    IQMath :>RAML0,PAGE = 0
    IQmathTables :>IQTABLES,PAGE = 0,TYPE = NOLOAD

    /*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    *
    /*
    IQmathTables2:> IQTABLES2,PAGE = 0,TYPE = NOLOAD

    IQMath.lib (IQmathTablesRam)


    *
    /*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    *
    /*
    IQmathTables3:> IQTABLES3,PAGE = 0,TYPE = NOLOAD

    IQMath.lib (IQmathTablesRam)


    *

    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

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

    你(们)好

    float b[101]={0};

    除非您有有意义的数组 初始化程序、否则不应在此处指定初始化程序。 以上行表示.ebss 中 b[]有101*sizeof (float)内存,.econst 中所有零初始化程序有101*sizeof (float)内存。 只需删除初始化程序、它就可以解决您的问题:

    浮点 b[101];

    Edward

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我尝试过、但不起作用。 然后、我将 b[]指定为无符号整型、并通过一些额外的调整来解决我的问题。 我当然不需要浮数组 bcz sin 值(从-1到1)必须与 TBPRD 相乘、在我的例子中、TBPRD 是5000、乘法后、小数点后的数字并不意味着太多。 要处理-VE 值、即 Theta > 180、我只需通过应用条件来使它们+VE
    如果(A<0)
    A =-A;//这会将-ve 值更改为+ve

    通过执行此操作、我得到具有-ve 周期的整流正弦波、即180-360现在具有+ve 值。

    然后在 ePWM ISR 中,我必须输入一个条件

    如果(I <= 50) //对于100个样本,50表示180

    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLA.bit.CAD =AQ_SET;


    其他

    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm2Regs.AQCTLA.bit.CAD =AQ_CLEAR;



    再次感谢您的指导。