OpenEdv-开源电子网

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

IAP更新程序可不可以不用bootloader,直接在app里串口接收了直接往0x08000000开始写flash?

[复制链接]

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
发表于 2016-8-11 14:58:03 | 显示全部楼层 |阅读模式
1金钱
IAP更新程序可不可以不用bootloader,直接在app里串口接收了直接往0x08000000开始写flash?完了重启一下?

最佳答案

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

必须有bootloader,完成串口接收数据到写入flash这个操作。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-11 14:58:04 | 显示全部楼层
必须有bootloader,完成串口接收数据到写入flash这个操作。  
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-11 15:37:06 | 显示全部楼层
有人解答吗
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2016-8-11 15:54:58 | 显示全部楼层
程序是从0x08000000开始运行的,只能是超过0x08000000的位置
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
发表于 2016-8-11 16:00:51 | 显示全部楼层
帮顶。。。。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-11 16:02:35 | 显示全部楼层
k-ad 发表于 2016-8-11 15:54
程序是从0x08000000开始运行的,只能是超过0x08000000的位置

那我在程序里用串口接收bin然后往0x08000000开始写应该可以?完了重启后跑的就是新程序了?
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-11 16:06:24 | 显示全部楼层
不行,除非你的IAP不是跑在flash。但是就算这样也很危险,万一升级过程出错,你的设备就变砖头了。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2016-8-11 16:07:41 | 显示全部楼层
你的程序正在0x08000000开始的地方运行,你现在的做法好像就是程序自己把自己删掉后还要程序做别的事
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-11 16:28:42 | 显示全部楼层
ysq7120 发表于 2016-8-11 16:06
不行,除非你的IAP不是跑在flash。但是就算这样也很危险,万一升级过程出错,你的设备就变砖头了。

我主要是怕bin太大,ram里放不下,所以想一边接收一边往flash里写。那我可以app里串口收到指令后跳进iap,然后在iap里一边接收bin一边往app的起始地址里开始写吗,完了应该就可以跑新的app了?
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-11 16:29:25 | 显示全部楼层
k-ad 发表于 2016-8-11 16:07
你的程序正在0x08000000开始的地方运行,你现在的做法好像就是程序自己把自己删掉后还要程序做别的事

我错了,我以为程序在ram里跑,那我可以app里串口收到指令后跳进iap,然后在iap里一边接收bin一边往app的起始地址里开始写吗,完了应该就可以跑新的app了?
回复

使用道具 举报

48

主题

208

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1371
金钱
1371
注册时间
2015-3-24
在线时间
190 小时
发表于 2016-8-11 16:31:58 | 显示全部楼层
肯定不行啊、
小时在工地上玩,捡了一个根木棒回家,麻麻问我捡这破玩意回来有什么用?我脑子一热,就说“你可以用它来打我啊!!”
于是,一根木棒伴随了我很多年。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-11 16:39:20 | 显示全部楼层

那我可以app里串口收到指令后跳进iap,然后在iap里一边接收bin一边往app的起始地址里开始写吗,完了应该就可以跑新的app了?
回复

使用道具 举报

48

主题

208

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1371
金钱
1371
注册时间
2015-3-24
在线时间
190 小时
发表于 2016-8-11 17:11:34 | 显示全部楼层
在收到要升级的命令的时候,就跳到IAP函数里面,在IAP升级函数,把串口发出的数据保存到flash里面去,判断保存完成了你又跳到应用程序里面,执行新的应用程序!
小时在工地上玩,捡了一个根木棒回家,麻麻问我捡这破玩意回来有什么用?我脑子一热,就说“你可以用它来打我啊!!”
于是,一根木棒伴随了我很多年。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-12 08:16:32 | 显示全部楼层
jeffreymiau 发表于 2016-8-11 16:29
我错了,我以为程序在ram里跑,那我可以app里串口收到指令后跳进iap,然后在iap里一边接收bin一边往app的 ...

这样是可以的,但是app地址不会是你说的这个地址了。
还要需要上位机辅助才可能边传送边写。
需要带有数据校验,串口传数据是不安全的。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-12 08:41:34 | 显示全部楼层
ysq7120 发表于 2016-8-12 08:16
这样是可以的,但是app地址不会是你说的这个地址了。
还要需要上位机辅助才可能边传送边写。
需要带有 ...

app地址不会是我说的这个地址了是啥意思?边传边写是不是需要上位机配合发一段数据等一会?现在校验一般用哪种?md5之类的有点复杂啊,异或好像又不靠谱。另外还有一个问题就是写了bootloader和app两个程序后,可以用ulink或者isp之类的工具烧吗?会不会烧完bootloader之后在烧app的时候把bootloader给覆盖了啊?
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-8-12 08:56:21 | 显示全部楼层
我觉得可以参考LM3S5739芯片boot的写法,boot代码是跟用户代码放在同一个工程,区别就是boot代码在keil里设置在sram运行。
后面还是分开工程写了,因为下载到一半失败就必须要重新写入带boot的完整工程,而LM3S芯片又没有ISP,所以就必须要用JATG来写,
一个设备拆机是痛苦且不可取的,画板还必须留JATG口,LM3S这样设计无默认ISP是考虑到安全性
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-12 08:57:39 | 显示全部楼层
jeffreymiau 发表于 2016-8-12 08:41
app地址不会是我说的这个地址了是啥意思?边传边写是不是需要上位机配合发一段数据等一会?现在校验一般 ...

你都自己说在app里面跳转到iap,那么app地址还会是0x08000000吗?
校验不需要太复杂,学ip头的校验算法或者crc之类的就行。如果你的数据一次发的比较短,其实简单累加就可以了。我建议是用ip头的校验算法。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-12 09:33:57 | 显示全部楼层
DongInker 发表于 2016-8-12 08:56
我觉得可以参考LM3S5739芯片boot的写法,boot代码是跟用户代码放在同一个工程,区别就是boot代码在keil里设 ...

装机之后再烧程序,isp和jtag有区别嘛,都要拆机啊装机之后还是iap最方便
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-12 09:35:48 | 显示全部楼层
ysq7120 发表于 2016-8-12 08:57
你都自己说在app里面跳转到iap,那么app地址还会是0x08000000吗?
校验不需要太复杂,学ip头的校验算法 ...

哦哦哦,这个意思,地址肯定不是0x08000000啦。关于烧录呢,能用jtag或者isp先烧bootloader再烧app且bootloader不被覆盖吗?
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-12 10:57:16 | 显示全部楼层
jeffreymiau 发表于 2016-8-12 09:35
哦哦哦,这个意思,地址肯定不是0x08000000啦。关于烧录呢,能用jtag或者isp先烧bootloader再烧app且boot ...

hex文件是带地址的,bin是不带地址,你要在升级过程中自己配置好地址
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-8-11
在线时间
17 小时
 楼主| 发表于 2016-8-12 11:15:47 | 显示全部楼层
ysq7120 发表于 2016-8-12 10:57
hex文件是带地址的,bin是不带地址,你要在升级过程中自己配置好地址

其实可以把bootloader和app的hex拼在一起供第一次上电烧录吧,这样就一次性把bootloader和app都烧好了,后期需要更新程序的话再通过iap单独更新app好了
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-4-29
在线时间
13 小时
发表于 2016-8-13 22:53:48 来自手机 | 显示全部楼层
楼主,我感觉你想得复杂了。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-4-29
在线时间
13 小时
发表于 2016-8-13 22:54:20 来自手机 | 显示全部楼层
不小心点了回复。。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-4-29
在线时间
13 小时
发表于 2016-8-13 23:18:04 来自手机 | 显示全部楼层
楼主,我理解BootLoader有点简单,不对的大家指教一下。BootLoader就是一个从0X80000000开始的程序,功能就是接收从通讯口传来的数据,然后把数据写入到flash里,再跳转到刚写入的APP(刚刚写入flash的数据)。楼主说的RAM不够大,只要你使用可以重发数据的协议传输就可以啦,每接收一部分数据就写入flash(这段时间可能通讯口还有数据发送过来,你不响应,传输数据的另一端可以稍后重发,具体看协议)。另外,你更新APP怎么会覆盖IAP。。你在写IAP的时候就要分配好,留给IAP的空间,而APP的起始地址肯定会设置在IAP空间以外。你绝对不会傻到写FLASH直接从8000000开始把程序覆盖吧,就像一个人挖坑填自己??而且更新APP通常根据你的设定的通讯方式来,如果是串口你可以开发一个支持协议传输的串口软件,或者直接使用现成XCOM也可以。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 15:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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