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.
现在我用TMS320F28035在做应用,但是CLA Prog RAM的空间不足,实际只有4K,我现在CLA的程序达到5K左右,超出了一部分,
后来删除了一些代码,空间够了,此时看map文件时,如下:
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.pinit 0 003e8000 00000000 UNINITIALIZED
Cla1Prog 0 003e8000 00000c88 RUN ADDR = 00009000
003e8000 000007b2 CLA_slopedyn.obj (Cla1Prog)
003e87b2 000004d6 CLA_slopedyn.obj (Cla1Prog:retain)
其中CLA代码是CLA_slopedyn.cla,编译后的目标文件是CLA_slopedyn.obj,
我的问题是:为什么有两个目标文件,如上图
Cla1Prog和Cla1Prog:retain有什么区别,都会占用CLA Prog RAM吗?
另外如果CLA Prog RAM空间不够,除了缩减代码之外,还有其他什么建议吗?
谢谢!
关于Cla1Prog和Cla1Prog:retain的问题: 我所有CLA代码全部放在一个.cla的文件里面,没有使用其他文件的函数。
另外最追加一个问题,CCS6.0支持在CLA源程序里面进行单步调试吗?
我现在在cla的一个task里面加了一个__mdebugstop(),之后可以在汇编语言里面进到这条指令,但是我选择"shouw source"时,总是显示没有源程序的错误
如下图:
1,请将cla文件中的程序贴出来看一下。
2,CCS6.0支持在CLA源程序里面进行单步调试。显示“no source available”并不是错误,并不是每一条汇编语句都会有相应的C程序语句来对应,所以会这样提示。__mdebugstop()并不存在于实际的芯片内部,只在调试时起作用。
这是Taks8的一部分代码
__interrupt void Cla1Task8 ( void )
{
uint32 ulTmp;
uint16 uiTmp1,uiTmp2;
__mdebugstop();
uiTmp1 = (uint16)(g_tEloadGlobalVariable.eOperateType);
uiTmp2 = (uint16)OPER_TYPE_CNST;
//if(g_tEloadGlobalVariable.eOperateType == OPER_TYPE_CNST)
if(uiTmp1 == uiTmp2)
{
ClaEloadCTask();
g_Cla2CPUData = g_Cla2CPUData +100;
if(g_Cla2CPUData>60000)
{
g_Cla2CPUData =0;
}
return;
}
else
{
ClaEloadDynTask();
}
。。。。
ClaEloadDynTask();和ClaEloadCTask(); 这些函数的代码是存在“Cla1Prog”中的,剩下的代码是存在“Cla1Prog:retain”中的。
你的意思是说中断函数中调用的函数是存在Cla1Prog中, 中断函数本身的代码是存在Cla1Prog:retain的是吧。
另外,现在可以进行源代码单步调试了,仔细看了一下cla wiki, 里面谈到需要load symbols, 我这样做了之后可以进行C源码单步调试了,谢谢,继续试下。
还有一个问题: 在CPU28X里面定义的enum数据类型,在CLA程序里面工作不正常? CLA是否支持enum数据类型?编译器里面哪里设置一下能让CLA支持enum数据类型吗,谢谢!
CLA不能直接使用C28数据区的数据,你可以在CLA程序中重新定义一个enum数据。或者C28的数据放到CPU-TO-CLA RAM区域,这样CLA可以读其数据,但不能为其赋值或修改数据。
我现在是将CPU里面的enum数据放到了CPU-TO-CLA RAM里面,但是在CLA里面访问enum数据时不正确,
例如在CPU里面定义
typedef enum tagEnumData
{
ENUM_DATA1=0,ENUM_DATA2
}TEnumDaTa
#pragma DATA_SECTION(tEnumData,"CpuToCla1MsgRAM");
TEnumData tEnumData
下面的语句在CPU里面工作都正常,但是在CLA代码里面工作不正常,是不是CLA不支持enum数据类型?
if(tEnumData == ENUM_DATA1)
{
// TODO:
}
else
{
// TODO:
}
您好,可以实现下面的功能吗?
例如现在有A+B(或C)+D代码需要放到CLA中执行,如果A+B+C+D全部放到CLA中去,空间不够,
如果单独加载A+B+D或A+C+D则空间是够的
如何在CPU程序中实现一下功能
if(用户选择B)
{
加载A+B+D到CLA Prog RAM
}
else if(用户选择C)
{
加载A+C+D到CLA Prog RAM
}
有相关的函数(如MemCopy)或例程么?先谢了!
还有三个问题,请帮忙确认一下: (1)在CLA里面只能访问ADC的转换结果,不能触发AD转换是吧? (2)在CLA里面不能通过写SPIBUFF触发SPI发送是吧? (3)可否将认为调整中断系统的优先级,例如将CLA中断优先级提高?