原创 查忙状态引起死机问题的解决方法

2007-11-19 16:23 3659 5 5 分类: 软件与OS

设计程序时,主控制器经常要检查器件的状态以决定是否可以进行下一步的操作,如LCD1602S的读写检查,每写一个指令或数据之前都应检查上一次的操作是否已经完成;又如DS18B20温度传感器在发出温度转换指令之后,都应等待一段时间以使得其转换完成,这时候可以采用循环查忙的方式,一般这些从器件都会在对应的数据线上表现出一直处于某个电平状态,如果离开这个电平状态则表示该操作已经完成,这时候函数也会跳出循环查询状态,进行其他的操作。


如果操作已经结束,但查询过程中从器件出现异常,则可能导致主程序一直处于查询的程序段中,而出现“死机”的现象,(当然这里讨论的前提是没有使用看门狗,因为使用看门狗可能会有某些不愿意的情况出现),下面介绍一种解决这种问题的方法,以LCD1602 4位数据线连接方式 驱动程序 一文中的查忙程序为例:


do {nop;
 LcdE=1;nop;nop;
 Temp=PtLcd;nop;nop;
 LcdE=0;nop;nop;


 LcdE=1;nop;nop;
 t=PtLcd;nop;nop;
 LcdE=0;nop;nop;


 Temp&=0x80;
 }while(Temp==0x80);
}


如果Lcd1602出现异常,BF标志位一直为0,而实际上写入指令/数据已经完成,则会导致主控制器“死机”。一般从器件完成其操作是有一定的时间的,比如使用hd44780 控制芯片(使用270kHZ频率)的LCD1602最长执行指令的时间为4.52ms。则可以在之前定义一个变量cnt,当cnt加到数值N的时候就跳出循环。这个N的大小是由4.52ms除以这一段循环程序执行一次所需时间来决定的。下面是修改后的程序,假设N取100,则有:


do {nop;
 LcdE=1;nop;nop;
 Temp=PtLcd;nop;nop;
 LcdE=0;nop;nop;


 LcdE=1;nop;nop;
 t=PtLcd;nop;nop;
 LcdE=0;nop;nop;


 Temp&=0x80;
  i++;
 if(i>=100){break};
 }while(Temp==0x80);
}


当然也可以直接使用延时的方法来代替查忙,但是并非每一个写指令/数据的时间都有4.52ms,其他大部分的写指令/数据完成时间都只有37us,修改后的方法相比延时程序可以节约很多不必要的时间。


                                 by eleclike @2007-11-19

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条