和升级包,即rbl文件的大小有关吗?
实测我在此版本上去http ota老版本升级包是成功的,老版本升级包的大小是305458字节。
而http下载这个306638字节的新版升级包就会缺失几百个字节数据。
我的download分区大小是384KB
请问有什么优化意见吗。
粗略概括:不同大小的升级包文件,有低概率会升级失败
详细描述:大部分的升级包文件,在不同的服务器上每次都可以成功升级,无论是RTThread软件包内的MyWebServe、JAVA同事搭建的各种http服务器, 还是阿里云。
而我手头恰好有一个306638字节大小的升级包文件,使用RTThread软件包内的MyWebServer作为局域网服务器,也每次都可以被成功升级。但是使用JAVA同事那边搭建的某个服务器,以及公司某个阿里云服务器,每次都不能正常升级。
1.验证写入到stm32 flash内的字节包,确实缺失了462字节。
如何验证缺失了462字节,我们查看一下stm32片内falsh上的数据,来证明缺失了这462个。
上分区表截图:
我的bootloader占据了0x08000000-0x08020000之间的部分(不含0x08020000这个地址)。
我的download分区的起始地址: 0x08000000(十六进制)+512*1024(十进制) = 0x080a0000.
我的该升级失败的升级包文件大小是306638字节。
从我们刚才的分析来判断,除去后面的462字节,前面的(306638-462)=306176字节应该是被正确写入了stm32片内flash内的download分区了。
0x080a0000 + 306176 -1 (注意,这里需要减去1) = 0x080E ABFF. 即到这个地址为止(包含0x080E ABFF这个地址),都正确存储了升级包的数据。
从0x080E ABFF+1=0x080EAC00,这个地址开始,就应该没被写入正确的rbl数据了。
查看rbl升级包的二进制,
十进制的306176,对应的十六进制是0x4AC00, 即从rbl升级包的这个偏移地址开始(包含这个地址),数据就没有被写入到stm32的download分区了。
2.http下载数据包,这最后一帧数据有没有被正确下载呢? 我们在webclient软件包内添加打印来证实一下。
关键的函数是int webclient_shard_position_function(struct webclient_session session, const char URI, int start, int length, int mem_size)
有必要先大致介绍下http get流程,和代码。
http get流程:
代码修改:
.
这是服务端引起的问题? 为啥最后一包收不到
@文武兵兵 java同事实测部署多个服务器,有的服务器可以,有的最后一包不行。针对最后一包,webclient没有作失败重新下载,稍微改下代码,再次下载一遍。