1、参照SDK例程修改bootloader程序,实现固件升级、转移、跳转至应用程序等功能,通过调大MTU固件升级速度约为3kb/s;
2、参照SDK例程修改应用程序,FLASH偏移地址0x01E000,固件升级速度却只有1kb/s左右(若升级过程中不执行FLASH读写操作,速度约为1.3kb/s),且读写FLASH操作明显变慢;
3、若不使用bootloader程序,只使用应用程序(FLASH便宜地址改为0),则固件升级速度正常,FLASH读写速度正常;
4、应用程序执行完固件升级后,重启由bootloader转移固件程序存储位置时,有时需要10秒左右,有时只需1秒左右,固件大小约110k。
我的boot loader完全按照SDK例程修改,但仍出现上述情况,不知是那里设置有问题,望帮忙解答。
谢谢~
Keywords:
Device:
bootloader和固件升级的使用场景很多,你的问题之前并没有什么案例可以参考。
3kb是比较正常的速度,1kb确实比较慢了,最好检查一下看看是不是确实把MTU配置好了,我们这边需要更多信息才能确定问题,比如你具体做了哪些修改,1kb 1.3kb 3kb这些速度你是用什么手段测出的
其他可能影响的因素包括你的应用程序本身,还有使用的flash型号等等
关于第三条,没有bootloader我们是无法实现OTA的,是不是你有哪里没说清楚?
关于固件转存的速度,你有没有具体的带时间的log可以供我们分析?
固件升级的通信协议是我们自定义的,有流控。通信速度是自己写的Android APP测试出来的,升级速度1kb时MTU肯定是改成功的,通过APP的调试日志可以看到,升级结束后对flash中的固件CRC32校验也是正确的。
关于第三条,没有bootloader时实现OTA的意思是:我们写的bootloader和app都包含固件升级功能,但固件转存只由bootloader完成。这里OTA的意思是指除固件转存外的其它流程,即蓝牙通信+写flash。
1)app的flash偏移地址为0,烧写到flash的0地址,运行固件升级(蓝牙通信+写flash)一切正常。
2)app的flash偏移地址为0x1E000,烧写到flash的0x1E000地址;bootloader烧写到flash的0地址,通过bootloader跳转到app(与官方例程一样),由app执行固件升级(蓝牙通信+写flash),便出现提问中提到的异常现象。
3)以上两步中app的唯一区别就是flash偏移地址不同,其它完全一样。
至于flash型号,我们使用的是DA14680,芯片内部集成的1Mbits的flash。
谢谢~
我已找到问题原因,是cache寻址范围设置错误,即CACHE_CTRL2_REG[CACHE_LEN]。
SDK中提供dg_configCACHEABLE_QSPI_AREA_LEN设置寻址范围大小,单位byte。例程默认值为(NVMS_PARAM_PART_start - MEMORY_QSPIF_BASE),我给改为了0x20000。
在system_ARMCM0.c文件中cache_len = (dg_configCACHEABLE_QSPI_AREA_LEN >> 16) - 1,并将cache_len的值传给CACHE_CTRL2_REG[CACHE_LEN]。
我原来设置的dg_configCACHEABLE_QSPI_AREA_LEN为128kb,即实际寻址范围为64kb。而我们的bootloader+app占到了近300kb,故cache无法正常使用,运行速度变慢。
我现在将dg_configCACHEABLE_QSPI_AREA_LEN设为0x80000,运行就正常了。
这个坑有点深……例程里#define dg_configCACHEABLE_QSPI_AREA_LEN (NVMS_PARAM_PART_start - MEMORY_QSPIF_BASE)太误导人了!