C2000 CLA的使用与常见CLA内存问题的解决方案

cla(control law accelerator)控制率加速器是一个独立可编程的32位浮点数字处理单元,为快速触发响应及数学运算而设计。cla独立于c28x cpu工作,时钟频率与cpu相同,可执行算法以及周期性的计算工作。通过增加平行的处理单元cla,拓展了c28x cpu的性能。当前c2000系列产品共有3种类型的cla, 不同的c2000型号对应不同的cla类型, 各类型的差别及对应的c2000器件型号详情如图1所示。type 2型的cla可直接读取adc 结果寄存器,极大减小adc采样至输出的延时,提高系统的响应并允许系统以更高的频率运行;并且可直接操作所有的epwm,hrpwm,ecap,eqep,cmpss,dacsdfm,pga,spi,lin,fsi,pmbus,clb和gpio数据寄存器;cla可独立地响应外设中断。利用cla执行一些周期性任务可以解放cpu,使其工作于其他系统任务。
图1 cla类型及对应c2000器件
cla的使用包括初始化设置和任务定义。初始化由cpu完成,包括程序内存和数据内存分配,任务的触发配置;type 2型cla提供 8个独立的任务(也可配置为7个独立的任务和1个底层持续运行的任务),这些任务类似中断服务函数,由中断触发并运行至任务结束,并且可配置在任务完成时产生中断, cla 框图如图2所示。
图2 cla框图
cla可访问ramls0-ls7 区块的内存,并且每个块可以配置为cpu专用或cpu与cla之间共享数据。这些内存块复位时默认分配给cpu,需要由cpu初始化后才可用于与cla共享数据。如果这些内存块被配置为数据共享的,则可进一步配置为程序内存或数据内存,程序内存用于存放cla的程序代码,数据内存用于存放供cla程序使用的变量和系数,并且有专用的消息内存msg rams用于在cpu和cla之间传递数据, cla的memory及寄存器操作方式描述如图3所示。
图3 cla memory及寄存器操作
cla的初始化是在软件初始化期间由cpu执行,主要包括6个步骤:
从flash中复制cla 任务代码至cla 程序内存中
分配cla数据内存
配置cla寄存器:包括使能cla时钟;分配cla任务函数地址;选择任务触发源;根据需要使能软件触发任务;映射cla程序内存和数据内存到cla空间
在pie中配置cla任务完成中断的服务函数
在mier寄存器中使能cla任务触发
初始化触发源外设,使其能触发cla任务
在cla开发过程中,工程师往往专注于代码层面对cla初始化,cla_task的配置以及算法设计,忽略了更为底层的问题——cmd文件中cla内存分配问题。不合理的内存分配可能会导致编译报错及内存溢出。
本博文将举例使用ti的tms320f280049进行cla开发时,由于内存分配错误导致的具体报错。
本例中在完成了cla初始化,cla_task的中断函数配置后,点击编译ccs报43个“#17003-d” warnings,如图4:
图4 #17003-d warning
description resource path location type:
#17003-d relocation to symbol clascratch_end overflowed; the 6-bit relocated address 0xee is too large to encode in the 16-bit unsigned field (type = 'r_abs16_oc' (107), file = ../xxxxxxx, offset = 0x00000312, section = cla1prog)
警告显示clascratch_end内存溢出,问题定位至cmd文件,检查cmd中与scratch相关的内存分配, 如图5。
图5 cmd文件scratchpad描述
发现仅有.scrathpad分配至ramls1,并未找到clascratch_end以及对cla_scratchpad_size的定义。
于是,打开.map文件判断是否分配了__cla_scratchpad_end/start,在.map文件中搜索scratchpad,如图6所示。
图6 .map文件中cla_scratchpad_end描述
如图6,在.map中仅仅找到__cla_scratchpad_end,可以判断工程使用了scratchpad,但是并没有__cla_scratchpad_start的内存分配。
至此找到了问题原因,解决方案就是需要在cmd文件中对scratchpad进行相关配置, 如图7所示。
参考配置如下:
①在cmd文件的头部添加以下代码,如图所示
cla_scratchpad_size = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
图7 scratchpad配置
②在cmd文件的sections{}代码部分的末尾添加以下代码 
clascratch  :
{ *.lib(clascratch)
. += cla_scratchpad_size;
*.lib(clascratch_end) } > ramls1,
page = 1
再次编译,#17003-d警告已经消失,编译通过,结果如图8所示。
图8 修改cmd后编译结果
此时,再次查看.map文件,发现__cla_scratchpad_end/start以及cla_scratchpad_size已经成功分配,如图9所示。
图9 修改cmd文件编译生成.map文件图
以上就是关于“#17003-d warning”的解决方案,希望通过这个例子,让广大工程师在cla开发时能够注意到cmd对cla内存正确配置的重要性,防止在实际开发时遇到问题,难以排查。


MVC的能力与耐回流焊接之间的比较
通友亮相2023慕尼黑上海电子展,展出多系列一体成型电感产品及解决方案
怼华为Mate8、蹭傅园慧热度,中兴“国礼”旗舰如今2100元甩了
网络寻呼话筒的功能和作用?
微雪电子4.2寸电子纸裸屏简介
C2000 CLA的使用与常见CLA内存问题的解决方案
为何买冰箱都认海尔?320项专利守护,一根羽毛就能看到差距
直线电机模组与丝杆模组的优缺点对比
华为P10明日发布 三成用户购买意愿强烈
光衍射相对光强分布的测量
电脑是如何识别你插上了USB设备
快速测定环氧当量的方法
用数据可视化软件做电商用户行为分析
支付宝VS微信,支付补贴大战!支付宝补贴最高可达4888元,微信最高88元
2021年2月VR/AR行业市场分析发展报告
来自人工智能的碾压?人机大战,AlphaGo成赢家
串扰是什么?如何去减小串扰
生产锂电池有哪些危害
5G中美竞争白热化,美国国家频谱战略推动全方位的 5G部署和创新
MacBook Pro笔记本电脑迎来5年来首次重新设计