能否在一个MDK工程文件中实现bootload和app程序
一般情况下,需要IAP升级功能的话,同时需要两个工程,一个bootload 的MDK工程,一个app的 MDK工程,所有需求都是在app工程里面完成的。我想知道可以将bootload和app合成一个工程文件吗?(网上有些方法是将boot程序的hex文件转换打包成数组,在放在app程序中,但是这样不便于修改boot文件)合并到一个工程里面没问题,合成成一个程序,我认为意义不大,给自己找麻烦。 eric2013 发表于 2022-11-1 11:23
合并到一个工程里面没问题,合成成一个程序,我认为意义不大,给自己找麻烦。
我也认为意义不大,可领导要求一个程序出来,即一个hex文件,说便于整机BOM管理。:'( 枫华雪悦 发表于 2022-11-1 11:36
我也认为意义不大,可领导要求一个程序出来,即一个hex文件,说便于整机BOM管理。
你值得拥有
[开发工具] 使用OpenOCD+VSCode一键烧录Boot+App到内置+外置flash
https://www.armbbs.cn/forum.php?mod=viewthread&tid=116240 大概思路:
1. 通过sct规定好boot和app的flash分布;
2. 去掉app的startup文件,自己在app_main里面实现全局变量初始化;
3. 修改boot的startup文件,时钟初始化完直接跳到boot_main,boot_main再到app_main;
完全可以,只需要解决app和bootloader能分别调用不同的分散加载文件这个问题。
我是这么做的:
1. 自定义一个头文件,里面标识是 app 还是 bootloader
2. 自己写一个c#程序:根据上面头文件里的定义,生成 sct 文件
3. 同样根据这个头文件,根据app 和 bootloader 配置 scb->vector 地址
4. 在 keil里设置:编译前 调用 步骤2的exe文件 cctv180 发表于 2022-11-1 11:57
你值得拥有
[开发工具] 使用OpenOCD+VSCode一键烧录Boot+App到内置+外置flash
https://www.armbbs.cn/f ...
谢谢大佬,这个方法是很可以。但也是两个工程文件 枫华雪悦 发表于 2022-11-1 11:36
我也认为意义不大,可领导要求一个程序出来,即一个hex文件,说便于整机BOM管理。
整了半天,仅仅是为了合并成一个hex吗?
这个超级简单啊。srec_cat.exe合并各种hex文件即可,一个MDK工程可以管理N多程序。 eric2013 发表于 2022-11-1 14:00
整了半天,仅仅是为了合并成一个hex吗?
这个超级简单啊。srec_cat.exe合并各种hex文件即可,一个MDK ...
也不行,需要一个工程文件,不是合并的这种,这个实际意义上还是两个MDK工程文件,要在一个工程文件里面实现 kingdjh 发表于 2022-11-1 12:45
大概思路:
1. 通过sct规定好boot和app的flash分布;
2. 去掉app的startup文件,自己在app_main里面实现全 ...
flash分布是做好了,怎么理解 “app的startup文件” 和“boot的startup文件” 呢?我现在只有一个工程文件,即一个startup文件。还有就是怎么才能保证boot烧录在里面了,烧app时候断电不会成板砖 枫华雪悦 发表于 2022-11-1 14:03
也不行,需要一个工程文件,不是合并的这种,这个实际意义上还是两个MDK工程文件,要在一个工程文件里面 ...
必须可以,此贴。
爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://www.armbbs.cn/forum.php?mod=viewthread&tid=101011&fromuid=58
(出处: 硬汉嵌入式论坛)
看这个问题,有点模模糊糊,简单回答一下,以便参考:
要合并boot和app工程,是为了便于修改维护工程?那为什么不弄成一个工程。
如果要boot引导升级,可以将boot生成数组放到app中,也很方便。
如果说要方便编辑编译,记得IAR可以新建一个.eww里面放置多个工程,编辑时来回切换。
枫华雪悦 发表于 2022-11-1 14:19
flash分布是做好了,怎么理解 “app的startup文件” 和“boot的startup文件” 呢?我现在只有一个工 ...
是不是bootloader和app共用了很多驱动,而不想维护两套相同功能的代码?
如果是这样的话,我前面说的就可以实现。
对于我来说,修改startup文件难度略大 渡渡M 发表于 2022-11-1 15:09
看这个问题,有点模模糊糊,简单回答一下,以便参考:
要合并boot和app工程,是为了便于修改维护工程?那 ...
1、目的就是需要合成一个工程。
2、将boot生成数组的话,要是需要需改boot程序的话,比较麻烦。
3、这样实际还是两个工程文件 gallop020142 发表于 2022-11-1 16:02
是不是bootloader和app共用了很多驱动,而不想维护两套相同功能的代码?
如果是这样的话,我前面说的就 ...
boot仅用串口初始化,没有很多驱动。对差不多,意思就是一套代码出来。尝试过不带UCOS貌似可以实现,带来UCOS会HardFault_Handler 枫华雪悦 发表于 2022-11-1 13:59
谢谢大佬,这个方法是很可以。但也是两个工程文件
Project->New Multi-Porject Workspace
大致尝试了一下,但会出现HardFault_Handler Jinsq 发表于 2022-11-1 17:16
Project->New Multi-Porject Workspace
实际意义还是两个工程的 eric2013 发表于 2022-11-1 14:21
必须可以,此贴。
爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户 ...
是将boot程序存储位置在spiflash中吗?还是不是很理解。 eric2013 发表于 2022-11-1 14:00
整了半天,仅仅是为了合并成一个hex吗?
这个超级简单啊。srec_cat.exe合并各种hex文件即可,一个MDK ...
我现在就是用的这种方法,特方便。编译好直接就合成一个HEX文件了 lxianchao 发表于 2022-11-1 17:34
我现在就是用的这种方法,特方便。编译好直接就合成一个HEX文件了
是,这样合成也挺好的。应该需要判断boot程序地址可以实现。但这样有两个工程文件,领导说不行:Q 枫华雪悦 发表于 2022-11-1 17:13
boot仅用串口初始化,没有很多驱动。对差不多,意思就是一套代码出来。尝试过不带UCOS貌似可以实现,带来 ...
那就按照前面说的,只需要额外写个程序(功能:自动根据配置生成 sct 文件)
在 keil 里面设置 before build/rebuild 调用这个exe 可以实现,但没必要。建议考虑搞子工程形式的。
然后用批处理就可以一次编译完成
我可能懂你的意思了, 你可以再MDK里面 添加1个Boot的标签, 然后引用不同的.c .h文件 , 实际上是2个工程, 只不过用一个MDK显示了而已, 这样能修改BOOT 和 APP程序, 自己切换标签即可,
多年以前的公司用的ST芯片,其开发环境就是APP+BOOT搞成一个工程下实现的,现在看看多年以前的代码,都不知道怎么能正常运行:lol 我之前做过一个,不知道对你有没有参考意义:
1. 将驱动部分打包在一个section中,boot在一个section,app在一个section中
2. 设置两个固定的程序入口boot_main, app_main,在入口处根据标志位判断跳转boot还是app,然后执行对应程序
3. 如果不同外设驱动也固定了位置,则修改了驱动时直接往这个位置打补丁即可 本帖最后由 glory 于 2022-11-2 07:53 编辑
楼主放一把菜刀在键盘边上,等领导来……
emwin 发表于 2022-11-1 19:26
可以实现,但没必要。建议考虑搞子工程形式的。
然后用批处理就可以一次编译完成
这样也是不同形式的两个工程文件:) 312456990 发表于 2022-11-1 19:36
我可能懂你的意思了, 你可以再MDK里面 添加1个Boot的标签, 然后引用不同的.c .h文件 , 实际上是2个工程, 只 ...
不,就是需要一个工程文件完成boot和app,不能两个工程文件 yklstudent 发表于 2022-11-1 20:33
多年以前的公司用的ST芯片,其开发环境就是APP+BOOT搞成一个工程下实现的,现在看看多年以前的代码,都不知 ...
哈哈哈,看以前的代码都这样,一大堆警告照样跑。我这边现在程序也是这样跑的,就是若烧app时候掉电了,就成板砖了 合并意义不大,boot程序应该做的足够简单稳定,通用免维护。
单位同一平台下的设备都用的一个boot,几年了至今都没动过。 云琴箫龙 发表于 2022-11-2 08:53
合并意义不大,boot程序应该做的足够简单稳定,通用免维护。
单位同一平台下的设备都用的一个boot,几年了 ...
对,我也这么觉得,boot程序一般情况下是不会改动的,领导想法 glory 发表于 2022-11-2 07:49
楼主放一把菜刀在键盘边上,等领导来……
这表情包也太真实了:lol 1. sct文件是支持预编译的
2. 这两个文档可以解决你的问题
3. 合并两个工作你最需要的是解决全局变量初始化的问题,也就是boot不进入__main(c库的入口,不是main),app才进入__main,
也就是重定位load和修改startup,startup不一定是汇编,可以是c文件的(CMSIS官方例子)
我的理解哈,要把两个工程boot和App合并到一个工程中,可以在MDK中使用不同的Target,在对应的Target里面定义不同的宏来区分 没意义啊。
你们领导不是技术出身的吗?搞这些花里胡哨的。
我们都是一个BOOT,一个APP,APP里编译后执行一个脚本,把两个HEX合并就完事了。
操作起来很方便,不需要额外的东西。
你领导半桶水吧。就搞这些没用的。本来就是两个执行程序,硬要搞一起。没事找事干。给他boot和app的合并脚本:
https://acuity.blog.csdn.net/article/details/106724373 你们领导就是个傻子。APP和BOOT要保证运行在完全独立封闭的区间。 调用过同一个函数就会失去独立性,也就会导致不同版本的BOOT和APP不兼容,这样便失去了BOOT的意义。靠谱的还是BOOT和APP分开,做个文件合并程序。 kingdjh 发表于 2022-11-2 09:50
1. sct文件是支持预编译的
boot里面没有main函数的话,要是已经烧好boot程序之后,下一次烧写app时候,app烧一半断电了那不是boot也要重新烧? Gavin001 发表于 2022-11-2 10:03
我的理解哈,要把两个工程boot和App合并到一个工程中,可以在MDK中使用不同的Target,在对应的Target里面定 ...
这样是不是需要区分app的hex和boot的hex文件?会生成两个hex文件吗
页:
[1]
2