【求助】ch582 OTA升级疑问

image.png

  1. 使用方式一升级时imageA和B大小都是216K,那是不是更新的固件大小不能超过216K? 我使用adv_vendor_self_provision_with_peripheral这个例程测试升级时,更新的固件大小为288K,也可以正常升级;

    image.png

  2. 使用方式二升级,进入IAP程序执行升级是必须从复位进入IAP吗;

您好,方式一中,APP层代码确实是不能超过216K;方式二中,也可以通过类似接口jumpAPP()的方式跳到0地址起始的codeflash重新运行,不过没必要,这样跟软复位效果一样的,也是要重新加载启动文件的。

288K的大小是从哪里得出的,要以编译器编译后的结果为准,一般来讲APP层代码的LD文件会在编译时限制codeflash的最大使用量。

如果您修改了LD文件中对codeflash使用量的限制,实际编译结果就是288K,并且使用方式二+mesh文件夹中的固定库,理论上也是可以的,因为在手机配网例程中,使用了精简的BLE固定库,只占用了136Kcodeflash,除去方式二中12K大小的IAP和4K大小的JumpIAP,还剩296K的空间可以存放代码。

mesh文件夹下的手机配网例程是结合了方式一和方式二的,既使用了BLE固定库,又使用了备份升级,对于一同编译的mesh库和APP层逻辑来说,是有备份的。如果您直接用手机配网例程的三个工程,即4K的IAP+4K的JumpIAP+288K的APP层代码+136K的固定库,会出问题,可能会擦掉一部分BLE固定库导致升级后BLE无法使用或其他异常。


好的,感谢解答;现在我自己的工程代码编译出来已经有300k了,我想用备份升级方式,但是ch582m的资源又不够;现在想外加一块512k的外置flash进行备份升级使用。这个方案可行吗


可以的,这样的话外置flash就相当于存放升级固件的区域B;在区域A运行无线通信,接收升级固件并暂存到区域B,确认接受完固件后复位到IAP代码中搬运区域B的数据到区域A运行。这样可以把手机配网例程中,除去4K的IAP、4K的JumpIAP和136K的BLE固定库,剩下的304Kcodeflash区域都用来存放用户代码。

注意IAP中搬运外部flash到内部codeflash,一般要用到SPI,可能会导致代码量增加,IAP代码占用变多,可以以4K大小为单位扩大IAP工程下LD文件中的限制。


好的;还想问一下MESH_LIB和LIB两个库有什么区别,上述说的精简的BLE固定库是指的什么;我看官方例程adv_vendor_self_provision_with_peripheral这个工程里面配置如下:

image.png

为什么里面定义的是CH58xBLE_ROM而不是CH58xBLE_ROM_MESH呢;

此外,使用ble mesh升级,资源够的情况下是不是也可以不使用固定LIB库的方式升级,把LIB库直接编进工程里面吧,以后升级也可以把LIB库一起升级;


MESH_LIB文件夹中包含有mesh协议栈及其头文件,以及meshOTA升级使用的BLE固定库,这个BLE固定库精简掉了BLE主机的功能,所以大小被压缩到了136K;LIB文件夹中包含有一般BLE工程用到的BLE协议栈及其头文件,两个不同起始地址的包含有BLE主从机功能的OTA升级用的固定库。

CH58xBLE_ROM只用来表明该工程使用固定库,而具体固定库存放的地址,由LIB_FLASH_BASE_ADDRESSS决定。头文件中没有CH58xBLE_ROM_MESH相关的处理,也用不到它,因为有了LIB_FLASH_BASE_ADDRESSS将固定库起始地址配置到0x0004E000,并用CH58xBLE_ROM选择使用固定库,就已将库的位置锁定,烧录时和固定库一并烧录后,APP层代码就能找到接口函数。

资源够的话确实是可以带BLE库和mesh库一起编译后备份升级,在APP层代码接收固件后在IAP代码里搬运备份区域代码到运行区域,好处也是两个库都能升级到。



只有登录才能回复,可以选择微信账号登录