在使用CCS调试dsp芯片时,发现CCS软件有一个非常好的功能,在仿真调试的时候可以实时修改代码中变量的值。这个功能在调试switch语句的时候非常好用,比如想要执行哪个case语句,直接在仿真界面里面修改switch语句入口参数就行。
话不多说,直接上代码演示。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#include "leds.h"int i=0,j=0;void main()
{InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();while(1){i=j;}
}
先用一个简单的功能来演示,主代码就执行一条语句 将j
的值赋给i
,按照正常逻辑来讲,这个i
的值永远都是0。但是在这里就是见证奇迹的时刻了。直接仿真运行代码。
进入仿真界面后再i
变量上单击鼠标右键,选择添加到观察窗口。同样的方法也将j
的值添加到观察从窗口。
然后再右边窗口中选中实时刷新按钮。
接着在变量观察窗口i
上面鼠标右键,选择Graph
变量i
的值,就会以曲线的形式在下面绘制出来。
在新打开的图像绘制窗口上也要选中实时刷新按钮。
全速运行程序
这时候i
的值显示为一条直线,下面直接在变量观察窗口修改j
的值。
鼠标单击value框,直接将值修改为10,然后按回车键,此时就会发现i
的值也变成了10。接着继续修改j
的值,从10依次减小到1。这时候底下的曲线也会依次绘制出i
值变化的曲线。
这样在不用修改程序的情况下,代码持续运行的过程中可以随时修改变量值,给调试程序带来了极大地便利性。
随便修改j
的值看看效果。
接下来使用switch语句来控制几路LED灯看看效果。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#include "leds.h"int value;void main()
{InitSysCtrl();InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();LED_Init();while(1){switch(value){case 10: LED1_OFF; break;case 11: LED1_ON; break;case 20: LED2_OFF; break;case 21: LED2_ON; break;case 30: LED3_OFF; break;case 31: LED3_ON; break;case 40: LED4_OFF; break;case 41: LED4_ON; break;case 50: LED5_OFF; break;case 51: LED5_ON; break;default:break;}}
}
通过switch语句中的value值控制LED的亮灭,其中LED的端口控制使用宏定义的方式。
#define LED1_OFF (GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1_ON (GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)#define LED2_OFF (GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2_ON (GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)#define LED3_OFF (GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3_ON (GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)#define LED4_OFF (GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4_ON (GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)#define LED5_OFF (GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5_ON (GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)
开始调试程序,按照上面的方法将变量value的值添加到变量观测窗口,同时也将value的值添加到图形显示中。
为了更清晰的看到LED端口的变化,将GPIO数据寄存器也添加到变量观察窗口中。
将数据寄存器展开,LED主要在GPIOC口的64–68,默认情况下端口值都为1,将变量value的值直接修改为11,点亮LED1。
当value的值修改为11时,可以看到GPIO68的值由1变为了0。
依次点亮所有的LED,此时在电路板上也可以看到LED依次点亮,然后依次熄灭。
通过这种直接在观察窗口修改变量值的方法,测试程序的时候就方便多了。不用修改一次变量值就要调试一次。
当然不仅switch语句可以使用,其他情况下也能使用。比如调试通信协议的时。当接收到不同的指令就需要执行不同的代码,通常情况下需要外部给单片机发送命令,单片机接收到命令后再执行相关函数。这样调试起来比较浪费时间,而且比较麻烦。通过使用这种方法,直接在观察窗口中修改指令,就可以执行对应的函数。