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.
我在.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
看了你这个,里面有:
这个肯定是不对的,首先RAMLS0_1肯定没有4000这么长,其次你这样配置和PAMLS2和3也重复地址了,另外PAMLS3的结束地址可不是9500+500哦,这个十六进制的,你这样和A000之间有地址空余
总之这一段不能随意扩充,建议参考手册
另外哪一块配置成CLA程序空间,哪一块是数据空间,还需要在程序中指定
感谢user5229665参与讨论~
推测下来应该还是内存分配相关的问题。
并不是内存不够,可以看下报错中显示的内存使用情况,这些RAM压根没有被使用。还请再参考一下 user5229665的回复。
我还是建议先去参考一下例程。
但是就出现了 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;