OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2320|回复: 6

关于IAP的想法

[复制链接]

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2017-11-16 14:21:17 | 显示全部楼层 |阅读模式
5金钱
在线升级是一个boot,一个APP,boot对APP升级,我能不能不要这里的boot,而是两个APP,分别为APP1区和APP2区,APP1和APP2是相互升级的,每个APP包含了升级程序和主程序。一开始下载APP1,串口接收到特殊帧时开始升级写进app2区,写完之后跳转至app2,app2也是接收到特殊命令帧开始升级,对app1区写,写完之后跳转至app1运行.....,当然重新上电运行哪个app由标志确定,这样可行吗?

最佳答案

查看完整内容[请看2#楼]

理论上可行,如果你的程序链接时是位置无关的话。 运行时自动获取当前FLASH地址,这样性能略低,但功能上没问题,需要编译器配合。 或支持MMU映射地址。 简单点就是,STM32上面不太可行,或不建议使用。 STM32上面常用的是 boot+app+swap 新APP先下载到SWAP,校验通过后再由boot复制到app区。 然后跳转过去运行。 swap区可以使用片内FLASH,也可以使用SPI FLASH等。
最近爱上了stm32
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2017-11-16 14:21:18 | 显示全部楼层
本帖最后由 aozima 于 2017-11-16 14:33 编辑

理论上可行,如果你的程序链接时是位置无关的话。
运行时自动获取当前FLASH地址,这样性能略低,但功能上没问题,需要编译器配合。

或支持MMU映射地址。

简单点就是,STM32上面不太可行,或不建议使用。
STM32上面常用的是  boot+app+swap
新APP先下载到SWAP,校验通过后再由boot复制到app区。
然后跳转过去运行。

swap区可以使用片内FLASH,也可以使用SPI FLASH等。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2017-11-16 15:10:34 | 显示全部楼层
aozima 发表于 2017-11-16 14:32
理论上可行,如果你的程序链接时是位置无关的话。
运行时自动获取当前FLASH地址,这样性能略低,但功能上 ...

不太懂....什么程序链接,或支持MMU地址。。。水平有限。。。
最近爱上了stm32
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2017-11-16 15:40:02 | 显示全部楼层
只要内部flash放的下两个程序,甚至多个程序都可以。
执行完bootloader可以任意让它跳到一个地址,比如0x80010000,然后程序执行时还随时可以跳到80050000去执行第二个程序,执行一会儿还可以用指令跳到其它地址。
代码编译完就是一个bin文件或是一个hex文件,如果是bin文件,下载时其实就是将bin文件一位一位地写到0x80010000(可变)这个位置去。如果下载的是hex文件,就是将hex进行解析,包头、校验、位置之类的都会有,解析完也是一个字节一个字节写到flash里。如要你让代码跳转到了这个程序所在的首地址,就会去不断一句一句执行了。
所以你这么个玩法没有问题呀。
自在随心
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2017-11-16 16:02:53 | 显示全部楼层
yuzeyuan1 发表于 2017-11-16 15:40
只要内部flash放的下两个程序,甚至多个程序都可以。
执行完bootloader可以任意让它跳到一个地址,比如0x8 ...

我这里没有单独的bootloader,整个flash就是两个app,app里面有升级程序,两个可以相互升级,相互跳转。而且二楼的大神好像说比较可以实现但是任务量比较大。。
最近爱上了stm32
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2017-11-17 08:11:51 | 显示全部楼层
带我足够强大 发表于 2017-11-16 16:02
我这里没有单独的bootloader,整个flash就是两个app,app里面有升级程序,两个可以相互升级,相互跳转。 ...

bootloader只是在起始地址的程序而已,它和程序A、B一样,都只是程序,只不过一个里面代码是串口读升级包再跳转,而另一个是各种打印加控制,你把固定的A程序放在0x8000000这个位置也行啊。任务量大不大,你试试嘛,我觉得并不大,逻辑整明白点。二楼说的我也没弄明白
不过这个是对的“STM32上面常用的是  boot+app+swap
新APP先下载到SWAP,校验通过后再由boot复制到app区。
然后跳转过去运行。”,也比较易实现
自在随心
回复

使用道具 举报

16

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-10-31
在线时间
26 小时
发表于 2017-11-17 09:12:11 | 显示全部楼层
为什么要两个程序呢?用系统2个task不是更好? 想执行直接启动 不想执行 删除就可以。
一般试过后就会发现,还是经典的结构好用,包括windows/linux 都是bootloader+App,各司其职。我的建议是:不要浪费时间走弯路了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表