硬汉嵌入式论坛

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

[STM32H7] flash driver如何实现?(把某些代码固化到flash的固定位置,可以使app与BootLoader共用这部分代码)

[复制链接]

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2025-12-18 20:26:22 | 显示全部楼层 |阅读模式
flash driver如何实现?(把某些代码固化到flash的固定位置,可以使app与BootLoader共用这部分代码)
回复

使用道具 举报

28

主题

402

回帖

486

积分

高级会员

积分
486
发表于 2025-12-19 09:04:56 | 显示全部楼层
本帖最后由 tovinz 于 2025-12-19 09:14 编辑

分散加载或者链接脚本将函数固定到指定的地址。要用的地方直接指针跳转,跟boot跳app一样。
不过要注意被调用的函数在实现及其调用的函数尽量只用栈进行操作,尽量不用全局变量。如果你不指定这些全局变量也固定,并且在boot和app中也没有指定不使用这个位置的数据,那么就有可能是boot或者app中正在使用的数据。
回复

使用道具 举报

28

主题

402

回帖

486

积分

高级会员

积分
486
发表于 2025-12-19 09:23:23 | 显示全部楼层
本帖最后由 tovinz 于 2025-12-19 09:49 编辑

KEIL简单的测试方法就是拿一个最最最最简单的工程,修改工程的分散加载让KEIL下载工程时能把这个工程的固件烧录到你boot和app不用的地方。
然后将需要的函数使用分散加载或者 attribute 属性控制放到指定的位置,为了防止编译器优化没有使用的函数,可以在main中假装调用这个函数,实际上你连这个工程的main都不会调用。
然后烧录进去,再在boot或app中 typedef 定义一个跟函数声明一样的类型,定义一个这样的指针指向对应的地址,调用指针,传递需要的参数。

其实最简单是直接放到 boot 中。这样就不需要3个固件了。不过使用额外的一个固件而不是集成到 boot 的好处就是这个固件可以通过 boot 更新。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120448
QQ
发表于 2025-12-19 10:42:24 | 显示全部楼层
动态APP可以方便实现。

4、第4期ThreadX视频教程:单片机动态APP加载玩法,像手机电脑一样加载卸载多个应用软件(2022-05-01)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=112203

5、第5期ThreadX视频教程:单片机动态APP加载MPU玩法,隔离应用和系统,APP死机了系统也不会挂(2022-05-15)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=112368
回复

使用道具 举报

3

主题

51

回帖

60

积分

初级会员

积分
60
发表于 2025-12-24 14:51:34 | 显示全部楼层
简单点的做法就是在boot里面固定一个位置存放这些函数的指针表,然后在app里面调用这个表就可以了,但是注意boot内的函数不能再调用boot内的那些全局变量和常量了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-10 17:23 , Processed in 0.061782 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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