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.

TMS320F28377D: CLA内存问题

Part Number: TMS320F28377D

我在.cla进行电机控制电流环、位置环、矢量计算。编写完程序后,编译不报错。在线仿真后,发现cpu里程序正常运行,但是cla任务不执行,而且会使cpu和cla公用变量置0(cputocla,且在cpu里定义过这个值),给这个变量加上volatile,就能正确保持在cpu里的定义。

然后 我把.cla中程序注释掉一部分,整个系统就能正常运行了,cla也正常工作。我尝试过随意注释一部分程序,都可以(应该不是程序编写问题)。疑似内存管理的问题。

我查看内存占用 ,发现还有很大余量

RAMM0 : origin = 0x000122, length = 0x0002DE 
RAMM1 : origin = 0x000400, length = 0x000400 

RAMD0 : origin = 0x00C000, length = 0x000800
RAMD1 : origin = 0x00C800, length = 0x001800 

RAMLS0_1 : origin = 0x008000, length = 0x00400

//我按照例程令CLA_MATH_TABLES_IN_ROM=1了,且添加的是rom的cla库,单独运行一部分程序,clamath是正常的

#if !(CLA_MATH_TABLES_IN_ROM)
CLA1mathTables : >RAMLS4_5, PAGE = 1
#endif
Cla1Prog : > RAMLS0_1, PAGE = 0
#elif defined(_FLASH)
.TI.ramfunc : LOAD = FLASHD,
RUN = RAMGS0_1,
RUN_START(_RamfuncsRunStart),
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
PAGE = 0

.text : > FLASHA, PAGE = 0
.cinit : > FLASHB, PAGE = 0

.pinit : > FLASHB, PAGE = 0
.switch : > FLASHB, PAGE = 0
.econst : > FLASHC, PAGE = 0

#if !(CLA_MATH_TABLES_IN_ROM)
//
//Load tables to Flash and copy over to RAM
//
CLA1mathTables : LOAD = FLASHL,
RUN = RAMLS4_5,
RUN_START(_CLA1mathTablesRunStart),
LOAD_START(_CLA1mathTablesLoadStart),
LOAD_SIZE(_CLA1mathTablesLoadSize),
PAGE = 1
#endif

Cla1Prog : LOAD = FLASHE,
RUN = RAMLS0_1,
RUN_START(_Cla1ProgRunStart),
LOAD_START(_Cla1ProgLoadStart),
LOAD_SIZE(_Cla1ProgLoadSize),
PAGE = 0

#else

  • Servo_Control_ceshi.map这是不注释掉程序下的map文件

  • 2837xD_RAM_lnk_cpu1.zip这是对应的cmd文件,压缩了一下,直接上传一直失败

  • 看了你这个,里面有:

    这个肯定是不对的,首先RAMLS0_1肯定没有4000这么长,其次你这样配置和PAMLS2和3也重复地址了,另外PAMLS3的结束地址可不是9500+500哦,这个十六进制的,你这样和A000之间有地址空余

    总之这一段不能随意扩充,建议参考手册

    另外哪一块配置成CLA程序空间,哪一块是数据空间,还需要在程序中指定

  • 好的 感谢您! 以前确实对内存地址准确的选择 没有了解过,发生了问题后,我自己胡乱改过,我按照规范去改改试试

  •  我指定0-4都为程序空间。然后编译提示内存不够,请问有什么办法能解决这个问题吗? 是RAM里内存本来就不大 还是我程序方面的问题?

  • 感谢参与讨论~

    推测下来应该还是内存分配相关的问题。

    并不是内存不够,可以看下报错中显示的内存使用情况,这些RAM压根没有被使用。还请再参考一下的回复。

    我还是建议先去参考一下例程。

  • 报错内存未使用是因为报错了根本没进行编译

    实际注释掉一部分程序后,再去看内存内存占用情况

     报错里的RAMLS0_1是使用的

  • 但是就出现了 cla1prog只是用RAMLS0_1,分配给他了2_3和4并为使用

    cmd中相关段落(已经按照上述进行了修改且对比了例程)

       Cla1Prog          : > RAMLS0_1 | RAMLS2_3 | RAMLS4, PAGE = 0

    Cla1Prog : LOAD = FLASHE,
    RUN = RAMLS0_1 | RAMLS2_3| RAMLS4,
    RUN_START(_Cla1ProgRunStart),
    LOAD_START(_Cla1ProgLoadStart),
    LOAD_SIZE(_Cla1ProgLoadSize),
    PAGE = 0

    cla的内存配置

    MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 1;

    MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 1;

    MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;

    MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1;

    MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1;

    //
    // Configure RAM blocks LS2-LS5 as data spaces for the CLA
    // First, configure the CLA to be the master for LSx
    // Second, set the spaces to be code blocks
    //

    MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0;

  • 已经按照上面那位用户的方法解决了  个人疏忽 编写错误