CH32V203 IAP 升级 双image解决方案?

你好,目前遇到一个问题:


0 ~ 0x4000, 放bootloader 可以指定跳到0x4000 或者0xA000


0x4000 ~ 0x9000 app bank0, size 0x5000.

0x9000 ~ 0xE000 app bank1, size 0x5000.

尾部剩余区域做 flash 配置 存储。


启动后bootloader去判断调用哪个bank。


现在问题来了,编译app的时候,需要预设 Ld 文件指定起始地址是0x4000。但是编译出来的文件,放在0x9000 ~ 0xE000 app bank1 却无法启动。如果重新修改Ld的地址为0x9000,又不能用在bank 0.


所以,能不能建议一个通用的方案,让相同的app.bin 既可以运行在bank 0 又可以运行在bank 1?


谢谢!



您好,请问一下,APP1和APP2两个程序是一样的么?按照我的理解,若程序中有两个APP,在将这两个APP固件写入对定的区域后,你跳转没问题应该都是可以运行的。你是将APP1和APP2合为一个固件的?可以邮箱(lzs@wch.cn)具体和我沟通说一下你的需求,若是两个APP都是一样的,没必要分两个区域,或者说直接在APP程序中判断执行哪部分程序。可以邮箱和我具体沟通一下。


@TECH62


我也遇到这个问题了。就是我boot+app1+app2。app1和app2的程序是类似的,可能有小的改动,但是基本一样。


我最开始这样设计是想,如果升级失败,还有另一个APP可以运行。如果升级成功,就设置选项字节,下次上电的时候,boot能够根据对应的选项字节,来切换运行到对应的app。


目前的问题就是我app根据链接文件里面设置了地址了,两个app,有两个地址。比如第一个版本在APP A的位置,第二版本在APP B的位置。但是一些设备可能跳过了某个版本。


我目前能想到的解决办法就是,每出一版固件,生成两个bin,一个LD地址是APP A的,一个LD地址是APP B的。然后上位机发请求和boot通信,目前设备上哪个的位置是当前运行的APP,哪个位置是之前运行的APP,然后选择合适的文件来更新。


不知道这么说是否清楚。


一楼和我,其实就是想问,能不能一个bin,不被LD文件里面的地址限制。


我觉得最主要的问题就是中断向量表和数据的绝对定位问题。LD文件给定了Flash的起始位置,因此中断向量表的重定位、指定闪存地址寻址的操作都会受到LD文件的影响。所以除非没有这种从闪存读数据(不用任何常量,甚至都是立即数)的情况,也不用任何中断(免表除外),不然想要在不同的偏移量上运行可能还是很困难的。


-fPIC ?


楼上建议的-fPIC应该可以?这样的话只需要重定向中断向量表即可。


您好,@winwin,感谢你的解释说明,目前无法用一个bin,若两个APP,都需要单独编译生成bin文件。关于4楼和5楼用户讨论的方法,目前没有试过。


看了下,Mounriver GCC 的 multilib 并没有纳入 -fPIC 的选项。

那意味着所有的库都需要重新编译,那就很麻烦


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