Other Parts Discussed in Thread: C2000WARE
各位专家好:
在使用DSP提供的协处理器CLA的时候,有以下几个问题不太清楚,想请教下:
1. CLA编译后会产生.bss_cla、.const_cla以及CLA1Prog等。以CLA1Prog为例,哪些程序会被自动编译并处在CLA1Prog段呢?是取决于程序是否处在.cla文件或者share.h文件中吗?
我现在想在CLA中调用之前在CPU里调用的一个电机三环闭环控制,想直接把该闭环程序放置到CLA的Task中,但想来这样好像不行啊,CLA只能访问到RAMLSx区间,我应该要把程序存放到RAMLSx存储区间吧?
这样的话,我是通过把电机闭环程序移到.cla文件里,以便供给task调用,还是通过定义其存储位置,然后使用存储区间映射到RAMLSx呢?
2.顺着上面这个问题,想咨询下,用户自定义段名称,并在cmd文件中对其进行存储区间分配。这里的用户自定义名称应该是可以在满足命名规范的前提下,随便取名吧?如果是这样,那为啥TI会把存储函数段的名称从ramfuncs改为.TI.ramfunc呢?
假设我现在有2个函数,Func1、Func2,其中Func1是供CPU使用的,Func2是供CLA调用的。如果在定义的时候不对这两个函数的CODE_SECTIO做特别规范,那就是默认的编译器会将其编译并存储到默认的程序段落(是.text段还是前面说的.TI.ramfunc呢?),但由于Func2是需要供CLA访问的,因此还需要将Func2从内存中移到RAMLSx区间吧?而对于Func1就不需要该操作,因此在函数定义的时候,就不能让编译器把这两个函数放置在同一个段里,需要对Func1和Func2的存储位置进行区别,以便后面memcpy的时候只针对Func2进行。这样理解对吗?
如果实际使用的时候,Func2里还调用到了Func1,那么在把Func2存放在CLA可以访问到的RAMLSx区域之后,是否还需要再单独设置Func1存储在RAMLSx区域呢?
在C:\ti\c2000\C2000Ware_5_00_00_00\C2000Ware_5_00_00_00\driverlib\f28004x\examples\cla\cla_ex6_cpu_offloading例程里,定义了一个loop1_task的函数,位于share.h文档中,上面的标注写: Loop1 control task defined in a shared file so that can be used both by CPU and CLA in order avoid code duplication,这意思是程序写在share.h文档里,可以同时被cpu和cla调用到吗?
3.在例程中能看到使用软件强制触发task的形式来定义一个变量,之后该变量会被所有task内部共享调用。这种操作应该是只需要对变量定义其初始值的时候才会用到吧,是否可以用定义static变量类替换呢?或者能否在其他文件中定义一个变量,然后在.cla文件中extern一下来使用呢?
我想在task里直接调用电机的闭环程序(根据采样值进行闭环计算,并更新PWM输出),该程序内部定义有未赋初值的临时变量,用于接收存储adc采样结果、中间变量传递等作用(只是程序内部的传递变量,其初始值不影响),这种情况下,我直接在task里调用该电机闭环函数就行吗?调用该电机闭环函数的时候,应该会根据闭环函数来创建临时变量吧?我不太确定我是否需要将闭环函数里定义的变量,使用软件强制task的形式先定义一下。
4.关于CPUToClaMsgRAM的使用,当需要将cpu中定义的变量传输到cla时,例程里都是按照下面的方式来定义的
#pragma DATA_SECTION(fVal,"CpuToCla1MsgRAM");
float fVal;
这里的fVal是一个float类型变量,但如果需要将一个自定义的结构体传输过去呢,也是这种写法吗?
#pragma DATA_SECTION(fVal,"CpuToCla1MsgRAM");
StructName fVal;
谢谢专家。