本人在做蓝牙的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);
}
保证程序死在那
------解决思路----------------------
你没理解上面那个兄弟说的话。
为什么会进入whlie(1),是因为这个if条件满足了,这个条件满足了。这个条件的裸机意义我说不上来,这个先不管。
我想说的是,这个read出来的相当于是某种标记量,打个比方说,我系统升级,在升级完后我会在flash的某个地址写标记,下次启动,读这个标记,是好的,说明app区域的程序可以用,那程序接着往下运行,如果读这个标记,发现是错的,那说明那个APP是不能用的,那我当然不能跳转啦。我怎么办呢,我可能就在这个地方搞个while,反正程序如果跳转也会出问题。当然,实际的做法是通知用户,说程序损坏,需要重新升级,或者回复出厂等等,或者跳转到原厂区的app,总之,whlie(1)是其中一种做法,只不过是一种不太好的做法嘛。
不然,你试试,把read这段代码注释掉,或者,if里面去掉while(1),看看程序后面会不会出问题,会出什么问题。
真正的问题还不一定就是这个while呢。
------解决思路----------------------
忘了说,read有问题,那说明应该是write有问题,要么write的数据有问题,要么write的时候出错了,反正read读出来的就不是正常流程的东西。所以头痛不一定总医头,查查是不是脚上引起的。read不能下去,看看是不是write有问题。