STMCU小助手
发布时间:2022-8-25 22:24
|
一、什么是散列文件 我们可以看到,在编译过程中有多个.o文件,而最后生成的只是一个文件,那么这些文件要怎么以什么方式生成一个文件呢?说的专业一点,这个过程就是链接,而在Keil-MDK下就是使用散列文件来指导链接的。! ~0 T' k S. |# R2 s' H5 c$ ^, M' S 如图所示,将【Use Memory Layout from Target Dialog】勾选上
2 F0 M$ ^9 T- S c$ M 然后重新编译,我们就可以在【Objects】目录下得到一个.sct文件如下所示 ; ~2 [- H9 p4 D6 c
二、散列文件的格式( s3 v: Y% P8 `, d/ Z 如下所示,一个散列文件由一个或多个Load region组成,一个Load region中含有一个或多个Execution region,一个Execution region中又含有一个或多个Input section。8 R8 _$ u8 I* j" d: |3 z A: c 首先,LR_IROM1是Load region的区域名,紧接着0x08000000是其加载地址,然后0x00080000是其区域最大容量;8 }+ C- y) B0 N2 |5 i% Q 然后,ER_IROM1是Execution region的区域名,紧接着0x08000000是其可执行地址,也可以叫链接地址,然后0x00080000也是其区域最大容量;1 L3 Q+ ]/ e/ `8 m, A5 h
接下来就是各种文件的链接方式了,解释如下7 o; g% s B8 ~* [5 Z* ^2 y, n% G 0 z3 j& L( t( l! v' ^. ~# l
三、分析散列文件 打开uart.dis文件,可以看到有个__main,这就是keil添加的可执行代码,因为我们使用了main函数,所以这段代码被添加进去了,8 ?- | ]) U) ]& o7 R- ^6 n 0 x' H j. n* H; k: r; e1 K
5 H4 [/ y. V: ^' G 我们将我们代码中的main改为mymain,可以看到,这段代码没有了 - n8 k7 Z7 ^# R) v
我们在main.c中添加如下所示变量定义,: l3 N: W0 N6 ^; \ b
$ O$ a* }0 E6 M- b7 w3 r! I 然后编译,打开uart.dis文件,可以看到,myconst变量被链接到0x08…开头的地址,即ER_IROM1 区域,而my、mydate和myzero即被链接到0x20…开头的地址,即RW_IRAM1 区域;与之相对应的,ER_IROM1 区域为该STM32的Flash地址,RW_IRAM1 区域为该STM32的RAM地址。
然后我们再看一下,uart.dis文件中,ER_IROM1 区域的最后一个位置0x080001ac存放的即我们定义的只读变量myconst
但我们使用STM32Cubeprg打开uart.hex文件可以看到,在0x080001ac后还有三个位置,而这三个位置存放的刚好就是我们定义的三个my、mydate和myzero变量。
实际上,对于在STM32F103这类资源紧缺的单片机芯片中:' L% |0 e: ~0 a3 G& S( h 代码段保存在Flash上,直接在Flash上运行(当然也可以重定位到内存里)3 c$ f8 O' x& A 数据段暂时先保存在Flash上,然后在使用前被复制到内存里(只读数据段不复制)* `) p( c3 H# J* o5 m 3 ~( t# B: e1 ^0 i5 t" P6 z# }) P 四、验证数据段的存放 修改main.c如下所示
编译烧录运行,可以看到,只有myconst变量值是正确的,其他三个变量值都是错误的,这是因为我们并没有将那三个变量的值从Flash上复制到内存里,所以读取出来的只是上电后该RAM地址的一个随机值。+ M( S9 E: I/ W) @8 o) i! E) j 3 w4 V$ E7 j y6 O
然后再添加一下地址的打印' s @, C1 b+ S/ j" u1 Z . r& T X7 ]$ U6 h; w: Z7 G, y( o
编译烧录运行,可以看到,确实只有myconst变量值是保存在Flash的,其他三个变量值都是在内存里的& [% D: Y: [: d* H& C ' p# z) |$ J( D8 [
另外我们也可以顺便看一下栈地址,在mymain函数里定义一个变量并打印其地址9 e k4 r$ l6 ^7 x r6 \4 s 0 H' x$ `* Y8 o) p3 u) G8 a2 O1 w9 C4 B
编译烧录运行,可以看到,其地址确实在我们设置的栈中% N9 r# p. _( A$ l4 R, P$ R
————————————————1 S% ]' G w7 v) q$ w& F! e, i 转载:Willliam_william$ ?: V% [2 s: G4 h- N. v- j % M9 U2 S9 k \$ l4 e |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版