一个关于:ESP8266_RTOS 在线升级FOTA CRC问题

John Liu
Posts: 4
Joined: Fri Jun 29, 2018 2:41 pm

一个关于:ESP8266_RTOS 在线升级FOTA CRC问题

Postby John Liu » Fri Jun 29, 2018 4:18 pm

背景:用ESP8266模组,云端自己搭建(参考Upgrade.c文件)。
问题:
1. 做FOTA时,从Server端下载文件成功,但调用upgrade_crc_check函数时,计算出来的img_crc不正确。读出来的flash_crc正确。
2. 有时候编译出来的user1.bin或者user2.bin放在Server端,进行在线升级时,img_crc又是正确的。
问题2,是非常令我困惑的地方。要么img_crc总是不正确,为何有时候又是正确的呢?程序只是增加了一个串口打印。

Her Majesty
Posts: 329
Joined: Mon Oct 27, 2014 11:09 am

Re: 一个关于:ESP8266_RTOS 在线升级FOTA CRC问题

Postby Her Majesty » Wed Jul 11, 2018 5:28 pm

1. 是不是 SDK 版本太旧?
2. 是不是编译 user 2 之前没有先 make clean 删除上一次编译生成的文件?

John Liu
Posts: 4
Joined: Fri Jun 29, 2018 2:41 pm

(搞定)一个关于:ESP8266_RTOS 在线升级FOTA CRC问题

Postby John Liu » Wed Jul 18, 2018 10:31 am

这个问题出在tool目录下的gen_appbin.py脚本。*** 这应该是开发包的Bug ***

1> 对\tools\gen_appbin.py脚本单独进行测试,发现问题出在函数gen_appbin()的最后对all_bin_crc的判断上:
if boot_mode == '1' or boot_mode == '2':
all_bin_crc = getFileCRC(flash_bin_name)
if all_bin_crc < 0:
all_bin_crc = abs(all_bin_crc) - 1
else :
all_bin_crc = abs(all_bin_crc) + 1
print "bin crc: %x"%all_bin_crc
如果all_bin_crc < 0,那么计算出的CRC就是正确的,否则错误。这就是为何有时候CRC相等,有时候不等的原因。

2> 修改上述代码为如下,CRC问题解决。

if boot_mode == '1' or boot_mode == '2':
all_bin_crc = getFileCRC(flash_bin_name)
all_bin_crc = ~all_bin_crc

John Liu
Posts: 4
Joined: Fri Jun 29, 2018 2:41 pm

Re: 一个关于:ESP8266_RTOS 在线升级FOTA CRC问题

Postby John Liu » Thu Jul 19, 2018 3:03 pm

问题追踪:
1> 在PC端,生成测试程序(从Esp8266源码中抽出upgrade相关代码,直接调用upgrade_crc_check函数)计算CRC值。发现生成的CRC值和用Esp8266编译出来的CRC值有时候相等,有时候不等。
2> 怀疑是Esp8266编译产生的CRC有问题,跟踪makefile文件。发现Esp8266生成bin文件后,是通过调用\tools\gen_appbin.py脚本产生CRC。
3> 对\tools\gen_appbin.py脚本单独进行测试,发现问题出在函数gen_appbin()的最后对all_bin_crc的判断上:
if boot_mode == '1' or boot_mode == '2':
all_bin_crc = getFileCRC(flash_bin_name)
if all_bin_crc < 0:
all_bin_crc = abs(all_bin_crc) - 1
else :
all_bin_crc = abs(all_bin_crc) + 1
print "bin crc: %x"%all_bin_crc
如果all_bin_crc < 0,那么计算出的CRC就是正确的,否则错误。这就是为何有时候CRC相等,有时候不等的原因。
4> 修改上述代码为如下,CRC问题解决。

if boot_mode == '1' or boot_mode == '2':
all_bin_crc = getFileCRC(flash_bin_name)
all_bin_crc = ~all_bin_crc

:D :D :D :D

Who is online

Users browsing this forum: No registered users and 0 guests