DSP C2000 CLA调试技巧揭秘
CLA是C2000系列芯片里面的一个协核,用户使用CLA使得并行处理任务成为可能,从而提高系统的实时性。 用户在开发CLA的时候会遇到一些调试上的问题。因为,CLA跟CPU不同,CLA不支持在编译器CCS里使用时钟计时功能和编译器添加断点功能,那么当用户需要知道程序运行的系统时钟周期和用断点来DEBUG的时候,就需要手动来实现这些功能。这篇文章的着眼点就是阐述如何手动添加一些代码来实现以上功能。 首先,来看如何计算CLA任务的运行周期。 因为CLA不支持用编译器的CLOCK功能,所以我们可以采用系统自带的PWM模块来进行计数。这个方法的思路就:PWM的计数器的时钟可以配置为系统时钟。于是在任务的开始启动PWM,然后再任务结束的时候读取PWM的时基计数器的值。。代码如下: __interrupt void Cla1Task1 ( void ) { //Local Variables float a; __mdebugstop(); RESTART_CLOCK; a = 10; ... ... ... READ_CLOCK(ulCycleCount); } 其中RESTART_CLOCK宏定义: #define RESTART_CLOCK __meallow();\ EPwm1Regs.TBCTL.bit.CTRMODE = TB_FREEZE;\ EPwm1Regs.TBCTR = 0;\ /*此处将计数器清0 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;\ __medis(); READ_CLOCK宏定义: #define READ_CLOCK(X) _meallow();\ EPwm1Regs.TBCTL.bit.CTRMODE = TB_FREEZE;\ X = EPwm1Regs.TBCTR;\ /*此处读取将计数器的值 __medis(); 以上思路如所示的代码,不难看出从任务开头到结束的时候读取的ulCycleCount值就是任务运行的时钟周期,需要注意一点的是,执行这个操作的时候我们需要预先初始化PWM: 1. 将PWM的计数器时钟配置为系统时钟SYSCLKOUT。 2. 将计数模式设置为向上计数模式 初始化代码如下: void InitEPwm(void) {// Setup TBCLK EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up EPwm1Regs.TBPRD = 0xFFFF; // Set timer period EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;}
那么概括来说,就是在MAIN函数中放入InitEPwm()函数,然后再CLA TASK中添加如上所说的代码,通过读取ulCycleCount即为CLA TASK任务运行的时钟周期。 到这里,我们就来说明如何手动添加断点,从而使CLA任务暂停,让我们方便的DEBUG。 这个只需要简单的添加一行代码即可: __mdebugstop(), 任务运行到此处代码会挂起仿真器,用户点击RUN按钮程序会继续运行(同仿真C28x的步骤,区别在于这里用一行代码来代替CCS编译器的添加断点功能)。 本文来源于:广州创龙 -李镕旷 原创 |