28035的CLA使用经验

为什么用CLA

28035的CLA比较强大,不用就浪费了这块芯片可以说是一大半的性能。首先谈谈28035所属的Piccolo系列。
Piccolo系列是TI公司推出的主打性价比的C2000系列DSP,它很大程度也改变的外部电路,内部集成了FLASH/OTP ROM和RAM,使用变得非常简单,成本就是非常平易,性价比极高。它采用单电源供电,只要3.3V就可以稳定工作;内部采用了上电复位电路外接阻容就可以工作(要求高的场合,建议使用外部复位器件);内部集成了精度为1%的震荡器,不需要外接晶体,节省成本;Piccolo集成的ADC有12位的分辨率,使用内部参考源也可以达到10.9位的精度。总之就是性价比极高。然而这个系列中好几款芯片都没有FPU,只有CLA(2802x印象中CLA也没有),这样60M的28035运算能力岂不是很弱,都不如stm32f102c8t6了。但是幸好CLA不是个普通的模块。
TI文档中介绍,CLA是一个完全可编程的独立32位浮点硬件加速器,专为数学密集型计算而设计。该加速器可以显著提高控制算法中常见的典型数学函数的性能。CLA设计用于与C28x CPU并行执行实时控制算法。有效地提高了计算性能。这使得CLA非常适合在C28x CPU上管理具有更高循环性能改进的低级控制循环。CLA的另一个优点是,由于它直接访问内存,因此消除了管理数据页指针的开销损失。此外,CLA上的乘数不需要任何延迟槽。从而提供真正的单周期性能。对于电机控制和太阳能等应用,使用CLA的设备可以比C28x CPU提高1.3倍左右的性能,如下表所示。此外,通过使用CLA来服务时间关键的函数,C28x CPU被释放出来用于其他任务,比如通信和诊断。根据TI的设计,我感觉28035中,CPU部分更是适合作为任务调度和实时性要求不高的运算,CLA部分更适合算法运算,而且两者共享同一内存,变量传递很方便
以下是TI文档spraan9a中的CLA与FPU性能差别对比表,需要注意的是目前CLA已经支持c语言编程。从表中可以看出,CLA的运输和转换效率高于C28X+FPU的架构。文档中说CLA只能用汇编,实际上现在CLA已经能支持c语言编程了。
28035的CLA使用经验_第1张图片
而根据TI官网,可以对比28335与28035的性能,60Mhz的28035,相比150Mhz的28335,其MIPS能到120,仅比28335少30。
28035的CLA使用经验_第2张图片
28035的CLA使用经验_第3张图片
如果不用CLA模块,虽然有IQMath这个伪浮点数计算库,但是在平均最高60MHz的处理速度下,仍然后很多工作无法胜任。
随着DSP的发展,CLA的功能也随之升级。目前有CLA0-2三代。 CLA0到1的升级中,最显著的一点是扩大了程序寻址范围。而CLA2最显著的改进是拥有了真正的软件调试断点和背景任务模式,并且可以访问更多的外设,比如CLA0时期只能访问PWM和AD的部分寄存器,而CLA1已经可以访问GPIO的寄存器了。这样看上去越来越像一个CPU的核心了。
目前在28035和28379的CLA上进行过程序迁移。两者都显著提升了执行执行的速度。这是同一算法在28035CPU与CLA的执行时间。
CPU执行时间
28035的CLA使用经验_第4张图片

CLA执行时间28035的CLA使用经验_第5张图片
可以看到效果明显,不过遇到一个奇怪的现象,这一句话在28379直接从CPU移植到CLA可以直接正常运行

//PLL
error=-ealpha_est*CLAcos(theta_fan)-ebeta_est*CLAsin(theta_fan);

   然而28035的CLA就需要这样写

err1=-ealpha_est*CLAcos(theta_fan);
err2=-ebeta_est*CLAsin(theta_fan);
error=err1+err2;

不知道是不是28035的CLA0与28379的CLA1有区别,但是我问过TI官方社区,他们回复说计算上没区别。所以这边存疑,不过问题是解决了,只需要分步计算就行了。

CLA使用注意

CLA也没有硬件除法器,为此TI提供了CLAmath.lib这一函数库,包含了三角函数、除法等运算。需要注意的是,CLA的舍入方式与CPU不同,主要体现在当数值接近于0时的计算可能会舍入方式不同,因此,一方面可以照着网上的设置让MSTF寄存器中的RND32位置1,改变其舍入方式,另一方面可以将运算分步进行,即分成几项相加。
在CLA的程序执行时,由于浮点数带来的数据处理精度的提升以及数据范围的扩大,需要同时考虑原有采样噪声也更容易产生影响,因此,采样窗口、滤波器等参数可能需要为此而重新考虑。
应当尽量避免程序有大量的判断、跳转语句。因为CLA采用8级流水线结构,数据的计算能力非常强大,但是在判断和跳转语句中会造成后续的流水线失败,因此,大量的判断和跳转操作最好放在CPU中进行。
此外,CLA虽然能够访问一部分外设,但是其定位毕竟是数据处理的核心,因此,应当避免让CLA访问复杂的外设,这也是为了让它与CPU合理分工。
CLA没有自己的内存资源,因此必须从CPU中划分出对应的内存区域供CLA的程序和数据使用。
CLA0和CLA1不支持断点调试,所以,只能在程序中加入MDEBUGSTOP使CLA暂停。使用MDEBUGSTOP有几点应该注意:在未连接CLA时,MDEBUGSTOP仅作为空操作指令使用,不影响程序的运行。进入单步运行后,即是遇到MSTOP指令,(有时)CLA的中断标志也不会清除,只有点 “ GO ”才可以自动清除,中断标志消除后才不影响下次中断。因此,在MSTOP指令前加几句MNOP指令,以留给 “ GO ”。而CLA2则可以直接断点调试。

CLA的c语言编程

28035的CLA使用经验_第6张图片
根据发展路线图,CLA在CGT6.1时已经支持c语言编程。早期版本完全不支持对GCC的语言扩展,目前在最新版编译器已经大部分支持。目前CCS5中已经可以对CLA用c语言编程,但是越新的版本对c语言支持的越好,建议使用最新版本CCS编程CLA程序。

CLA编译器的函数支持

我最初使用的CCS是5.4,那里面的CLA编译器,只支持2层函数调用且不支持函数的递归调用和函数指针等,而CCS8的编译器中,函数嵌套的限制已经解除,支持多个嵌套的函数调用级别,还支持调用两个以上形参的函数。
  CLA 编译器以下支持intrinsic函数,熟悉c语言的人可以利用这些函数提高程序效率。
28035的CLA使用经验_第7张图片

CLA的数据类型的支持

需要注意CLAZ中的char,short 是 16 位的,而int, long, long long 为32 位;然而CPU中,int是16位的,为了避免出现问,应当使用int32, uint16 以免CLA与CPU数据交换时出现问题。
CLA的浮点数,如float, double, long double是32 位。
CLA的指针是16位的,在CPU中,这个是32位的。CLA 的体系结构是支持32位的整数类型,16位的整数会引入符号扩展。16位的整数应该只用来读取数据。
CLA编译器不支持对全局变量的定义和初始化,全局变量的定义和初始化只能在C2800上做,‘static’变量也一样,不支持64位的数据类型,64位的数据类型只在存储器中占两个连续的32位空间,局部变量被放在暂存器里。暂存器空间可由下面2个地址来在linker command文件中来定义。暂存器可看作是CLA的系统堆栈
在这里插入图片描述

暂存器的大小设置

可以在CMD文件中定义,亦可以用命令行方式,当然最简单的是在CCS的工程设置中定义(图中的是CCS5.4)
28035的CLA使用经验_第8张图片

CLA中的存储分配

没有初始化的全局变量被放在.bss_cla‖段,初始化的常数被放在―.const_cla‖段,局部变量和编译器生成的变量放在.CLAscratch段
–由用户负责定义它的大小,CLA程序编译器生成的代码被放在ClaProg段,这与汇编器当前的约定是一致的。由于CLA没有系统堆, 不支持malloc()函数。
28035的CLA使用经验_第9张图片

CLA STL库

根据spraci3,CLA有一个 STL库(不是C++的STL),这一个的作用是对CLA的运行进行自检。CLA STL的目的是监控CLA电路的退化(或永久性直流随机HW缺陷,可能导致电路故障),并向C28x CPU提供发生故障的指示,以便C28x能够采取适当的行动。

CLA外设读取权限

了解这一点挺重要的,因为28035的CLA不能操作GPIO寄存器,这样就不能通过反转IO来计算程序时间了,而28379的就可以。CLA应该有type0、type1、type2三种。

28035 CLA Type0

根据TI官网的28035数据手册,CLA Type0的内存和共用外设为
– 两个专用消息RAM 用于CLA 和主CPU 间的通信。
– C28x CPU 能够将CLA 程序和数据内存映射到主CPU 空间或者CLA 空间。
– CLA 可直接访问ADC 结果寄存器、比较器寄存器、和ePWM+HRPWM 寄存器

280379 CLA Type1

根据28379的数据手册,Type1 的外设获取权限
28035的CLA使用经验_第10张图片

280049 CLA Type2

这边的CLA主要特点是能够设置断点调试了,当然,它能操作的外设也比28035的丰富。
28035的CLA使用经验_第11张图片

总结

相比高性能的Delfino C2000 系列,Piccolo系列DSP正是凭借高性价比而被使用的。用好CLA,才能发挥出这一系列像28035这样芯片的性能。

你可能感兴趣的:(电机控制)