打印

TMS320F2812 DSP中while和do……while区别

[复制链接]
372|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Plantt|  楼主 | 2017-9-26 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

637

主题

901

帖子

4

粉丝