硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3949|回复: 59
收起左侧

[BOOT/IAP] 能否在一个MDK工程文件中实现bootload和app程序

  [复制链接]

2

主题

24

回帖

30

积分

新手上路

积分
30
发表于 2022-11-1 10:57:26 | 显示全部楼层 |阅读模式
一般情况下,需要IAP升级功能的话,同时需要两个工程,一个bootload 的MDK工程,一个app的 MDK工程,所有需求都是在app工程里面完成的。我想知道可以将bootload和app合成一个工程文件吗?(网上有些方法是将boot程序的hex文件转换打包成数组,在放在app程序中,但是这样不便于修改boot文件)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106688
QQ
发表于 2022-11-1 11:23:45 | 显示全部楼层
合并到一个工程里面没问题,合成成一个程序,我认为意义不大,给自己找麻烦。
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 11:36:46 | 显示全部楼层
eric2013 发表于 2022-11-1 11:23
合并到一个工程里面没问题,合成成一个程序,我认为意义不大,给自己找麻烦。

我也认为意义不大,可领导要求一个程序出来,即一个hex文件,说便于整机BOM管理。
回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2022-11-1 11:57:21 | 显示全部楼层
枫华雪悦 发表于 2022-11-1 11:36
我也认为意义不大,可领导要求一个程序出来,即一个hex文件,说便于整机BOM管理。

你值得拥有
[开发工具] 使用OpenOCD+VSCode一键烧录Boot+App到内置+外置flash
https://www.armbbs.cn/forum.php?mod=viewthread&tid=116240
回复

使用道具 举报

3

主题

66

回帖

75

积分

初级会员

积分
75
发表于 2022-11-1 12:45:14 | 显示全部楼层
大概思路:
1. 通过sct规定好boot和app的flash分布;
2. 去掉app的startup文件,自己在app_main里面实现全局变量初始化;
3. 修改boot的startup文件,时钟初始化完直接跳到boot_main,boot_main再到app_main;
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-11-1 13:02:38 | 显示全部楼层
完全可以,只需要解决app和bootloader能分别调用不同的分散加载文件这个问题。
我是这么做的:
1. 自定义一个头文件,里面标识是 app 还是 bootloader
2. 自己写一个c#程序:根据上面头文件里的定义,生成 sct 文件
3. 同样根据这个头文件,根据app 和 bootloader 配置 scb->vector 地址
4. 在 keil里设置:编译前 调用 步骤2的exe文件
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 13:59:49 | 显示全部楼层
cctv180 发表于 2022-11-1 11:57
你值得拥有
[开发工具] 使用OpenOCD+VSCode一键烧录Boot+App到内置+外置flash
https://www.armbbs.cn/f ...

谢谢大佬,这个方法是很可以。但也是两个工程文件
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106688
QQ
发表于 2022-11-1 14:00:55 | 显示全部楼层
枫华雪悦 发表于 2022-11-1 11:36
我也认为意义不大,可领导要求一个程序出来,即一个hex文件,说便于整机BOM管理。

整了半天,仅仅是为了合并成一个hex吗?

这个超级简单啊。srec_cat.exe合并各种hex文件即可,一个MDK工程可以管理N多程序。
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 14:03:10 | 显示全部楼层
eric2013 发表于 2022-11-1 14:00
整了半天,仅仅是为了合并成一个hex吗?

这个超级简单啊。srec_cat.exe合并各种hex文件即可,一个MDK ...

也不行,需要一个工程文件,不是合并的这种,这个实际意义上还是两个MDK工程文件,要在一个工程文件里面实现
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 14:19:42 | 显示全部楼层
kingdjh 发表于 2022-11-1 12:45
大概思路:
1. 通过sct规定好boot和app的flash分布;
2. 去掉app的startup文件,自己在app_main里面实现全 ...

flash分布是做好了,怎么理解 “app的startup文件”   和  “boot的startup文件” 呢?我现在只有一个工程文件,即一个startup文件。还有就是怎么才能保证boot烧录在里面了,烧app时候断电不会成板砖
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106688
QQ
发表于 2022-11-1 14:21:35 | 显示全部楼层
枫华雪悦 发表于 2022-11-1 14:03
也不行,需要一个工程文件,不是合并的这种,这个实际意义上还是两个MDK工程文件,要在一个工程文件里面 ...

必须可以,此贴。

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://www.armbbs.cn/forum.php? ... 1011&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

17

回帖

32

积分

新手上路

积分
32
发表于 2022-11-1 15:09:35 | 显示全部楼层
看这个问题,有点模模糊糊,简单回答一下,以便参考:
要合并boot和app工程,是为了便于修改维护工程?那为什么不弄成一个工程。
如果要boot引导升级,可以将boot生成数组放到app中,也很方便。
如果说要方便编辑编译,记得IAR可以新建一个.eww里面放置多个工程,编辑时来回切换。
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-11-1 16:02:51 | 显示全部楼层
枫华雪悦 发表于 2022-11-1 14:19
flash分布是做好了,怎么理解 “app的startup文件”   和  “boot的startup文件” 呢?我现在只有一个工 ...

是不是bootloader和app共用了很多驱动,而不想维护两套相同功能的代码?
如果是这样的话,我前面说的就可以实现。
对于我来说,修改startup文件难度略大
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 17:10:02 | 显示全部楼层
渡渡M 发表于 2022-11-1 15:09
看这个问题,有点模模糊糊,简单回答一下,以便参考:
要合并boot和app工程,是为了便于修改维护工程?那 ...

1、目的就是需要合成一个工程。
2、将boot生成数组的话,要是需要需改boot程序的话,比较麻烦。
3、这样实际还是两个工程文件
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 17:13:51 | 显示全部楼层
gallop020142 发表于 2022-11-1 16:02
是不是bootloader和app共用了很多驱动,而不想维护两套相同功能的代码?
如果是这样的话,我前面说的就 ...

boot仅用串口初始化,没有很多驱动。对差不多,意思就是一套代码出来。尝试过不带UCOS貌似可以实现,带来UCOS会HardFault_Handler
回复

使用道具 举报

5

主题

11

回帖

26

积分

新手上路

积分
26
发表于 2022-11-1 17:16:40 | 显示全部楼层
枫华雪悦 发表于 2022-11-1 13:59
谢谢大佬,这个方法是很可以。但也是两个工程文件

Project->New Multi-Porject Workspace
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 17:17:33 | 显示全部楼层
image.png image.png
大致尝试了一下,但会出现HardFault_Handler
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 17:24:46 | 显示全部楼层
Jinsq 发表于 2022-11-1 17:16
Project->New Multi-Porject Workspace

实际意义还是两个工程的
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 17:28:00 | 显示全部楼层
eric2013 发表于 2022-11-1 14:21
必须可以,此贴。

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户 ...

是将boot程序存储位置在spiflash中吗?还是不是很理解。
回复

使用道具 举报

6

主题

36

回帖

54

积分

初级会员

积分
54
发表于 2022-11-1 17:34:36 | 显示全部楼层
eric2013 发表于 2022-11-1 14:00
整了半天,仅仅是为了合并成一个hex吗?

这个超级简单啊。srec_cat.exe合并各种hex文件即可,一个MDK ...

我现在就是用的这种方法,特方便。编译好直接就合成一个HEX文件了
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-1 17:47:45 | 显示全部楼层
lxianchao 发表于 2022-11-1 17:34
我现在就是用的这种方法,特方便。编译好直接就合成一个HEX文件了

是,这样合成也挺好的。应该需要判断boot程序地址可以实现。但这样有两个工程文件,领导说不行
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-11-1 18:21:20 | 显示全部楼层
枫华雪悦 发表于 2022-11-1 17:13
boot仅用串口初始化,没有很多驱动。对差不多,意思就是一套代码出来。尝试过不带UCOS貌似可以实现,带来 ...

那就按照前面说的,只需要额外写个程序(功能:自动根据配置生成 sct 文件)
在 keil 里面设置 before build/rebuild 调用这个exe
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2022-11-1 19:26:53 | 显示全部楼层
可以实现,但没必要。建议考虑搞子工程形式的。
image.png
然后用批处理就可以一次编译完成
image.png
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2022-11-1 19:36:25 | 显示全部楼层
我可能懂你的意思了, 你可以再MDK里面 添加1个Boot的标签, 然后引用不同的.c .h文件 , 实际上是2个工程, 只不过用一个MDK显示了而已, 这样能修改BOOT 和 APP程序, 自己切换标签即可,
image.png
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2022-11-1 20:33:42 | 显示全部楼层
多年以前的公司用的ST芯片,其开发环境就是APP+BOOT搞成一个工程下实现的,现在看看多年以前的代码,都不知道怎么能正常运行
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2022-11-1 21:07:20 | 显示全部楼层
我之前做过一个,不知道对你有没有参考意义:
1. 将驱动部分打包在一个section中,boot在一个section,app在一个section中
2. 设置两个固定的程序入口boot_main, app_main,在入口处根据标志位判断跳转boot还是app,然后执行对应程序
3. 如果不同外设驱动也固定了位置,则修改了驱动时直接往这个位置打补丁即可
回复

使用道具 举报

3

主题

335

回帖

344

积分

高级会员

积分
344
发表于 2022-11-2 07:49:39 | 显示全部楼层
本帖最后由 glory 于 2022-11-2 07:53 编辑

楼主放一把菜刀在键盘边上,等领导来…… d01373f082025aaf80ee8ab2f0edab64024f1aee.gif
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-2 08:43:38 | 显示全部楼层
emwin 发表于 2022-11-1 19:26
可以实现,但没必要。建议考虑搞子工程形式的。

然后用批处理就可以一次编译完成

这样也是不同形式的两个工程文件
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-2 08:44:33 | 显示全部楼层
312456990 发表于 2022-11-1 19:36
我可能懂你的意思了, 你可以再MDK里面 添加1个Boot的标签, 然后引用不同的.c .h文件 , 实际上是2个工程, 只 ...

不,就是需要一个工程文件完成boot和app,不能两个工程文件
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-2 08:48:52 | 显示全部楼层
yklstudent 发表于 2022-11-1 20:33
多年以前的公司用的ST芯片,其开发环境就是APP+BOOT搞成一个工程下实现的,现在看看多年以前的代码,都不知 ...

哈哈哈,看以前的代码都这样,一大堆警告照样跑。我这边现在程序也是这样跑的,就是若烧app时候掉电了,就成板砖了
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2022-11-2 08:53:23 | 显示全部楼层
合并意义不大,boot程序应该做的足够简单稳定,通用免维护。
单位同一平台下的设备都用的一个boot,几年了至今都没动过。
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-2 09:28:06 | 显示全部楼层
云琴箫龙 发表于 2022-11-2 08:53
合并意义不大,boot程序应该做的足够简单稳定,通用免维护。
单位同一平台下的设备都用的一个boot,几年了 ...

对,我也这么觉得,boot程序一般情况下是不会改动的,领导想法
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-2 09:31:15 | 显示全部楼层
glory 发表于 2022-11-2 07:49
楼主放一把菜刀在键盘边上,等领导来……

这表情包也太真实了
回复

使用道具 举报

3

主题

66

回帖

75

积分

初级会员

积分
75
发表于 2022-11-2 09:50:41 | 显示全部楼层
1. sct文件是支持预编译的
1667353263374.png

2. 这两个文档可以解决你的问题
keil.png

3. 合并两个工作你最需要的是解决全局变量初始化的问题,也就是boot不进入__main(c库的入口,不是main),app才进入__main,
也就是重定位load和修改startup,startup不一定是汇编,可以是c文件的(CMSIS官方例子)
load.png


回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
发表于 2022-11-2 10:03:18 | 显示全部楼层
我的理解哈,要把两个工程boot和App合并到一个工程中,可以在MDK中使用不同的Target,在对应的Target里面定义不同的宏来区分
回复

使用道具 举报

38

主题

195

回帖

319

积分

高级会员

积分
319
发表于 2022-11-2 16:29:39 | 显示全部楼层
没意义啊。
你们领导不是技术出身的吗?搞这些花里胡哨的。
我们都是一个BOOT,一个APP,APP里编译后执行一个脚本,把两个HEX合并就完事了。
操作起来很方便,不需要额外的东西。
image.png
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2022-11-2 23:14:03 | 显示全部楼层
你领导半桶水吧。就搞这些没用的。本来就是两个执行程序,硬要搞一起。没事找事干。给他boot和app的合并脚本:
https://acuity.blog.csdn.net/article/details/106724373
回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2022-11-3 08:10:26 | 显示全部楼层
你们领导就是个傻子。  APP和BOOT要保证运行在完全独立封闭的区间。 调用过同一个函数就会失去独立性,也就会导致不同版本的BOOT和APP不兼容,这样便失去了BOOT的意义。靠谱的还是BOOT和APP分开,做个文件合并程序。
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-3 08:48:28 | 显示全部楼层
kingdjh 发表于 2022-11-2 09:50
1. sct文件是支持预编译的

boot里面没有main函数的话,要是已经烧好boot程序之后,下一次烧写app时候,app烧一半断电了那不是boot也要重新烧?
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2022-11-3 08:49:41 | 显示全部楼层
Gavin001 发表于 2022-11-2 10:03
我的理解哈,要把两个工程boot和App合并到一个工程中,可以在MDK中使用不同的Target,在对应的Target里面定 ...

这样是不是需要区分app的hex和boot的hex文件?会生成两个hex文件吗
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 02:59 , Processed in 0.438668 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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