STM32+W5500+AIR202/302远程升级篇-源码使用问题

2020-10-09 14:33:20 浏览数 (1)

一,远程升级时,升级错误问题

1.由于环形队列溢出而造成的升级错误问题!

错误日志如下:(开始时数据校验没有问题,下载一段时间以后出现校验错误)

错误原因:

使用W5500接收数据,基本上每包数据都保持在1024字节左右

每次都是把1024左右的字节写入环形队列.

而主函数每一次循环只提取128字节的数据写入Flash.

当然数据传输本身也需要时间,以当前看来,应该是循环提取2~3次左右

就会再次收到新来的约1024字节数据,那么整体来看,整个环形队列一直处于缓慢增长的状态

如果文件很大,那么过一段时间环形队列就会溢出,导致了数据接收不完整.进而导致了当前的问题.

(每次接收大约1024字节)

(每次都把约1024字节的数据写入flash)

(一个循环只从环形队列读取128字节)

解决方案1:(从环形队列多提取几次数据)(程序文件52KB及其以上不能使用)

这个for循环次数不能太多:耽误接收数据

这个解决问题的本质:

从整体运行来看,主循环运行处理了很多函数,只要运行处理就需要时间

有些函数其实不需要执行,或者说没有必要如此反复的轮训执行.

加入了下面的for循环,其实整体来看就是把执行不必要函数的时间全部放到了这里使用了.

解决方案2:(预想的方案,将尽快跟进.)

整体来看就是每次接收插入环形队列的数据量多,而提取的少!整个环形队列一直处于增长状态.

咱们要做的就是让提取更快!

1.把环形队列形式的缓存用UCOSII形式的缓存管理替换

 https://cloud.tencent.com/developer/article/1583786

之所以替换掉环形队列是因为环形队列适合每次频繁的写入少量字节的场合.

对于基本上每次写入固定一定量数据的场合用UCOSII形式的缓存管理更适合.

能把缓存操作提高一定的速度.

2.把CRC校验改为查表形式!由原来的每128字节校验一次数据,改为256或512字节校验一次数据.

最好按照1022字节校验一次数据,因为W5500每次接收的字节大部分是1024的倍数.

1022字节 2字节校验位 = 1024 字节

这个修改整体上减少校验运算时间和次数,同时也减少对flash的操作次数.

3.把W5500的8K缓存大部分都放到这个Socket上,然后让W5500帮忙也做缓存

每次提取数据程序改为定量提取方式.

注:只有1和2还不能解决的情况下再加入3.

0 人点赞