TMS320F2812 DSP中while和do……while区别
程序的基本思路:采用EV定时器中断,每隔10ms产生一次中断,在中断服务子程序中设定的记数寄存器T10mscount每次增1,主程序根据这个记数寄存器的值来定时。
初始化程序在此不贴出,只贴出测试程序部分。
for(;;)
{
GpioDataRegs.GPATOGGLE.bit.GPIOA6 = 1;//测试引脚翻转
T10mscount = 0;
do
{
}
while (T10mscount < 20);//20*10ms=200ms
}
有上面的程序可以看出,其功能是没隔200ms的时间把GPIOA6引脚的电平翻转一次,以方便用示波器观察GPIOA6引脚的电平。经测试上面程序符合要求,但用while语句怎么不行呢,不知道CCS2.21里面的c编译器和标准编译器有什么差别。
把程序改为如下:
for(;;)
{
GpioDataRegs.GPATOGGLE.bit.GPIOA6 = 1;//测试引脚翻转
T10mscount = 0;
while (T10mscount < 20)//20*10ms=200ms
{
}
}
程序输出结果不正确,经测试发现是程序始终在while语句中循环,好像判断语句始终为真,不知道原因为何?改为上面的do...while语句则正常。
另外还有一点,在while{}语句最后加“;”号竟然也能编译通过。
没办法,看来只好观察编译后的汇编语言了,对照一下,看看这两种循环结构到底有什么差别。
第一种结构的汇编语言如下:
3F8182 1A23 OR @35,#0X0040
3F8184 761F MOVW DP,#FE43
3F8186 2B01 MOV @1,#0
GpioDataRegs.GPATOGGLE.bit.GPIOA6 = 1;//测试引脚翻转
T10mscount = 0;
do
{
}
3F8187 9201 MOV AL,@1
3F8188 520A CMPB AL,#10
3F8189 67C4 SB L3,HIS
while (T10mscount < 20);//20*10ms=200ms
3F818A 520A CMPB AL,#10
3F818B 68FF SB L6,L0
第二种结构的汇编语言为:
GpioDataRegs.GPATOGGLE.bit.GPIOA6 = 1;//测试引脚翻转
3F8182 1A23 OR @35,#0X0040
T10mscount = 0;
3F8184 761F MOVW DP,#FE43
3F8186 2B01 MOV @1,#0
while (T10mscount < 20)//20*10ms=200ms
3F8187 9201 MOV AL,@1
3F8188 520A CMPB AL,#10
3F8189 67C4 SB L3,HIS
{
}
3F818A 520A CMPB AL,#10
3F818B 68FF SB L6,L0
|