你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何开发与存储位置无关的 STM32 应用

[复制链接]
STMCU小助手 发布时间:2022-8-4 21:45
1. 前言" G. Z: C7 U( r% d# \3 ~* w& f
最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统 Bootloader 里只需要跳到相应的位置就可以正常执行固件代码。客户希望STM32 代码从 Flash 里执行,不复制到 RAM 里;客户希望是一个完整的映像,而不仅仅是其中某个函数做到了位置无关。
, x* a5 t! s; n4 p6 X: N' N, ]; w/ W2 Z6 n
2. 分析  m" N8 b6 q6 J5 _4 U
在嵌入式场景下,不一定有操作系统。即使有操作系统,一般也是 RTOS。一般 RTOS没有一个通用的程序加载器。因此,存储位置无关的需求,在这时可以说无关紧要。但是,如果客户需要进行在线固件更新,例如 IoT 应用的固件升级,那么位置无关就存在价值了。' F1 B* i  I% J8 Q
位置无关之后,对于不同的软件版本,不需要频繁的为烧写位置的反复改变而修改编译链接脚本。也不需要在代码里显式的在两个 Bank 之间进行切换。
7 L" ^9 Q: _+ S. a( ~9 f最简单的情况是所有的代码都复制到内存执行。因为 Flash 的功能只是进行存储,自然Flash 的位置没有任何要求。但大部分 MCU 用户面临的真实案例都是 Flash 比较大,例如 ,1M 字节 ;RAM 比较小,例如,128K 字节。在这种情况下,代码在 Flash 原地执行就是一个必须的选择。
2 A. n+ q2 Z% ~. u( w0 eFlash 位置改变,会影响从 Bootloader 跳转之后的固件执行时的 PC 指针,也就是 PC指针值会发生相应的变化。位置无关的原理,是让应用程序经过编译后所生成的映像,其中的代码和数据,都是基于相对代码的位置进行引用。那么,当应用被搬到不同位置时,他们的相对位置不变,从而执行不受影响。
0 Y2 H, x& G0 D9 Q代码和数据基于绝对地址还是基于相对地址,是由编译器所决定。以客户要求的STM32CubeIDE 编译工具为例,我们可以看到在[Project]->[Properties]->[C/C++Build]->[Settings]->[Tool Settings]->[MCU GCC Compiler]->[Miscellaneous]已经有一项[Position Independent Code (-fPIC)]2 n. H2 [  g1 y+ P
是否只要选一下-fPIC 选项就大功告成了呢?答案是没有那么简单。
( p, b6 k% F0 ]% B4 w% Q. U8 V! I5 I% |
VR@E_]RKCHBPD2LM~WDO`AY.png
4 H3 T; O: |9 ]' e1 ?3 v. Z$ Z! v1 Y8 a2 B

% ^# p% t3 Q% A# I" E事实上,对于完整应用程序工程,用户应该经过这些步骤将其变成位置无关:
3 e/ i$ m! u3 x• 选择正确的编译器选项
$ ~; v! e8 w  X4 R* O) ^" `7 o• 去掉或者替换掉那些包含绝对位置的库文件+ 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 向应用程序提供或者由应用程序在链接时自身解析计算,得到以下信息:
7 C/ x  M# i- n2 M! J1 A• Flash 偏移量8 |, w: ]. B$ t0 x+ \
• 中断向量表的开始以及结束地址
( b) Y9 X4 V+ o. f. X  P• GOT 的开始以及结束地址
" r+ W2 D; q4 b& T  P6 w我们接下来就举例说明这些步骤。
& f8 c; `1 \" B

  o3 x& ?  {4 L- O& w# ~" h
# m. v0 t  U8 R7 f2 E* F; Q完整版请查看:附件. 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

8 |9 d5 P+ O+ Y

# D# c0 Q- R8 O  o' Q6 L5 ]- B( }2 `% A7 X1 _4 v

LAT1036 如何开发位置无关的STM32应用_V1.0.pdf

下载

682.82 KB, 下载次数: 45

收藏 评论0 发布时间:2022-8-4 21:45

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版