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

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

[复制链接]
STMCU小助手 发布时间:2022-8-4 21:45
1. 前言
最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统 Bootloader 里只需要跳到相应的位置就可以正常执行固件代码。客户希望STM32 代码从 Flash 里执行,不复制到 RAM 里;客户希望是一个完整的映像,而不仅仅是其中某个函数做到了位置无关。

2. 分析
在嵌入式场景下,不一定有操作系统。即使有操作系统,一般也是 RTOS。一般 RTOS没有一个通用的程序加载器。因此,存储位置无关的需求,在这时可以说无关紧要。但是,如果客户需要进行在线固件更新,例如 IoT 应用的固件升级,那么位置无关就存在价值了。
位置无关之后,对于不同的软件版本,不需要频繁的为烧写位置的反复改变而修改编译链接脚本。也不需要在代码里显式的在两个 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)]
是否只要选一下-fPIC 选项就大功告成了呢?答案是没有那么简单。

VR@E_]RKCHBPD2LM~WDO`AY.png


事实上,对于完整应用程序工程,用户应该经过这些步骤将其变成位置无关:
• 选择正确的编译器选项
• 去掉或者替换掉那些包含绝对位置的库文件
• 修改代码中的 Flash 绝对地址(这里以 STM32H7 的 CRC_Example 例程为例,其他情况下有可能要修改更多)
o 在 startup_xxx.s 汇编代码里的 sidata
o 在 system_xxx.c 里的 SCB->VTOR 以及中断向量表内容
o GOT
对于完整工程,要正确的跳转到应用程序进行执行,还需要由 Bootloader 向应用程序提供或者由应用程序在链接时自身解析计算,得到以下信息:
• Flash 偏移量
• 中断向量表的开始以及结束地址
• GOT 的开始以及结束地址
我们接下来就举例说明这些步骤。


完整版请查看:附件





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

下载

682.82 KB, 下载次数: 49

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

举报

0个回答

所属标签

相似分享

官网相关资源

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