
1. 前言" G. Z: C7 U( r% d# \3 ~* w& f 最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统 Bootloader 里只需要跳到相应的位置就可以正常执行固件代码。客户希望STM32 代码从 Flash 里执行,不复制到 RAM 里;客户希望是一个完整的映像,而不仅仅是其中某个函数做到了位置无关。 ' N, ]; w/ W2 Z6 n 2. 分析 m" N8 b6 q6 J5 _4 U 在嵌入式场景下,不一定有操作系统。即使有操作系统,一般也是 RTOS。一般 RTOS没有一个通用的程序加载器。因此,存储位置无关的需求,在这时可以说无关紧要。但是,如果客户需要进行在线固件更新,例如 IoT 应用的固件升级,那么位置无关就存在价值了。' F1 B* i I% J8 Q 位置无关之后,对于不同的软件版本,不需要频繁的为烧写位置的反复改变而修改编译链接脚本。也不需要在代码里显式的在两个 Bank 之间进行切换。 最简单的情况是所有的代码都复制到内存执行。因为 Flash 的功能只是进行存储,自然对 Flash 的位置没有任何要求。但大部分 MCU 用户面临的真实案例都是 Flash 比较大,例如 ,1M 字节 ;RAM 比较小,例如,128K 字节。在这种情况下,代码在 Flash 原地执行就是一个必须的选择。 Flash 位置改变,会影响从 Bootloader 跳转之后的固件执行时的 PC 指针,也就是 PC指针值会发生相应的变化。位置无关的原理,是让应用程序经过编译后所生成的映像,其中的代码和数据,都是基于相对代码的位置进行引用。那么,当应用被搬到不同位置时,他们的相对位置不变,从而执行不受影响。 代码和数据基于绝对地址还是基于相对地址,是由编译器所决定。以客户要求的STM32CubeIDE 编译工具为例,我们可以看到在[Project]->[Properties]->[C/C++Build]->[Settings]->[Tool Settings]->[MCU GCC Compiler]->[Miscellaneous]已经有一项[Position Independent Code (-fPIC)]。2 n. H2 [ g1 y+ P 是否只要选一下-fPIC 选项就大功告成了呢?答案是没有那么简单。 % Q. U8 V! I5 I% | ![]() 1 ?3 v. Z$ Z! v1 Y8 a2 B 事实上,对于完整应用程序工程,用户应该经过这些步骤将其变成位置无关: • 选择正确的编译器选项 • 去掉或者替换掉那些包含绝对位置的库文件+ G+ z4 S5 l5 {, F% J • 修改代码中的 Flash 绝对地址(这里以 STM32H7 的 CRC_Example 例程为例,其他情况下有可能要修改更多) - I1 v3 U1 @- a: c o 在 startup_xxx.s 汇编代码里的 sidata7 l3 a$ o( {& n( l6 V o 在 system_xxx.c 里的 SCB->VTOR 以及中断向量表内容, W2 m1 I7 e4 ^$ O o GOT# D$ X: g) V1 p5 @ 对于完整工程,要正确的跳转到应用程序进行执行,还需要由 Bootloader 向应用程序提供或者由应用程序在链接时自身解析计算,得到以下信息: • Flash 偏移量8 |, w: ]. B$ t0 x+ \ • 中断向量表的开始以及结束地址 • GOT 的开始以及结束地址 我们接下来就举例说明这些步骤。 完整版请查看:附件. y( x# z2 M7 P' q) j; {3 m v5 W- O " U2 N8 H+ N2 u7 T) b4 N- q + L2 j' n$ ]- T& z3 m) o! L - B( }2 `% A7 X1 _4 v |
LAT1036 如何开发位置无关的STM32应用_V1.0.pdf
下载682.82 KB, 下载次数: 45
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南