一个关于:ESP8266_RTOS 在线升级FOTA CRC问题
一个关于: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总是不正确,为何有时候又是正确的呢?程序只是增加了一个串口打印。
问题:
1. 做FOTA时,从Server端下载文件成功,但调用upgrade_crc_check函数时,计算出来的img_crc不正确。读出来的flash_crc正确。
2. 有时候编译出来的user1.bin或者user2.bin放在Server端,进行在线升级时,img_crc又是正确的。
问题2,是非常令我困惑的地方。要么img_crc总是不正确,为何有时候又是正确的呢?程序只是增加了一个串口打印。
(搞定)一个关于: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
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
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

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




Re: 一个关于:ESP8266_RTOS 在线升级FOTA CRC问题
Postby levi » Wed Jun 19, 2019 8:00 pm
想问一下,SDK版本怎么升级,因为我的版本太低,导致CRC失败
Who is online
Users browsing this forum: No registered users and 2 guests
Login
Newbies Start Here
Are you new to ESP8266?
Unsure what to do?
Dunno where to start?
Start right here!
Latest SDK
Documentation
Complete listing of the official ESP8266 related documentation release by ESPRESSIF!
Must read here!
- All times are UTC+08:00
- Top
- Delete all board cookies
About Us
Espressif Systems is a fabless semiconductor company providing cutting-edge low power WiFi SoCs and wireless solutions for wireless communications and Internet of Things applications. We are the manufacturer of ESP8266EX.