当前位置: 代码迷 >> 单片机 >> 多任务 冲出while死循环
  详细解决方案

多任务 冲出while死循环

热度:399   发布时间:2016-04-28 14:44:10.0
多任务 跳出while死循环
本人在做蓝牙的HID键盘,芯片是台湾的,代码大部分也是那边做好的,只提供给我们一配置工具去更改一参数,另外还可以少量更改代码,用keil c51写,然后它的主程序会在适当时候调用你写的代码,它的主程序和蓝牙协议是封装好的,我们看不到,我猜测里面运行的应该是一个多任务系统,我们写的代码是一个任务。现在有一个地方不明白,就是在读EEPROM时它给的代码是这样的
EEPROM_SetAddr (EEPROM_SECTOR_USER, 0);
if (EEPROM_ReadBytes ((U8 XDATA_PTR) &sleep_reset, 1))
{
   while (1);
}

这是从EEPROM地址的EEPROM_SECTOR_USER处读一个字节的数据到sleep_reset变量中,读的过程中就是在while(1)处等待它读完成,然后再执行下面的代码,我就搞不清楚这个while(1)是怎么退出来的。

它的写函数也是样的
EEPROM_SetAddr (EEPROM_SECTOR_USER, 0); 
if (EEPROM_WriteBytesWithoutCRC((U8 XDATA_PTR)&sleep_reset, 1) )
{
while (1) ;
}

注:这个是没有错的,因为代码能正常运行的,数据也能正常读写。EEPROM_ReadBytes 和EEPROM_WriteBytesWithoutCRC都是封装好的OBJ文件,我看不到里面的代码
------解决思路----------------------
这个是读或者写eeprom失败才进死循环,不是在等待。
------解决思路----------------------
同意读失败就死循环的说法,如果是操作系统,也不会这样写,熟悉linux代码习惯的人都会写正常返回0,异常返回负数
写这个接口的人明显也是使用这种方式,只是while(1);这样的做法太过草率
如果可以仿真,你在while那里下一个断电,保证不会进那里
或者你在下面写一个
else

while(1);

保证程序死在那
------解决思路----------------------
引用:
“这个是读或者写eeprom失败才进死循环,不是在等待。”一般不是这个原因,函数返回true的话一般是执行成功,而且人家做的系统也不可能因为读写一个变量失败而自已一直死机在那里


你没理解上面那个兄弟说的话。
为什么会进入whlie(1),是因为这个if条件满足了,这个条件满足了。这个条件的裸机意义我说不上来,这个先不管。
我想说的是,这个read出来的相当于是某种标记量,打个比方说,我系统升级,在升级完后我会在flash的某个地址写标记,下次启动,读这个标记,是好的,说明app区域的程序可以用,那程序接着往下运行,如果读这个标记,发现是错的,那说明那个APP是不能用的,那我当然不能跳转啦。我怎么办呢,我可能就在这个地方搞个while,反正程序如果跳转也会出问题。当然,实际的做法是通知用户,说程序损坏,需要重新升级,或者回复出厂等等,或者跳转到原厂区的app,总之,whlie(1)是其中一种做法,只不过是一种不太好的做法嘛。

不然,你试试,把read这段代码注释掉,或者,if里面去掉while(1),看看程序后面会不会出问题,会出什么问题。

真正的问题还不一定就是这个while呢。
------解决思路----------------------
引用:
Quote: 引用:

“这个是读或者写eeprom失败才进死循环,不是在等待。”一般不是这个原因,函数返回true的话一般是执行成功,而且人家做的系统也不可能因为读写一个变量失败而自已一直死机在那里


你没理解上面那个兄弟说的话。
为什么会进入whlie(1),是因为这个if条件满足了,这个条件满足了。这个条件的裸机意义我说不上来,这个先不管。
我想说的是,这个read出来的相当于是某种标记量,打个比方说,我系统升级,在升级完后我会在flash的某个地址写标记,下次启动,读这个标记,是好的,说明app区域的程序可以用,那程序接着往下运行,如果读这个标记,发现是错的,那说明那个APP是不能用的,那我当然不能跳转啦。我怎么办呢,我可能就在这个地方搞个while,反正程序如果跳转也会出问题。当然,实际的做法是通知用户,说程序损坏,需要重新升级,或者回复出厂等等,或者跳转到原厂区的app,总之,whlie(1)是其中一种做法,只不过是一种不太好的做法嘛。

不然,你试试,把read这段代码注释掉,或者,if里面去掉while(1),看看程序后面会不会出问题,会出什么问题。

真正的问题还不一定就是这个while呢。


忘了说,read有问题,那说明应该是write有问题,要么write的数据有问题,要么write的时候出错了,反正read读出来的就不是正常流程的东西。所以头痛不一定总医头,查查是不是脚上引起的。read不能下去,看看是不是write有问题。
  相关解决方案