不见春山
骑马倚斜桥,满楼红袖招。
Home
Categories
Archives
Tags
About
Home
MDK(Keil) 分散加载
MDK(Keil) 分散加载
取消
MDK(Keil) 分散加载
由
ctaoist
发布于 2019-08-14
·
最后更新:2019-09-10
1
[官网资料](http://www.keil.com/support/man/docs/armlink/armlink_BABDDHBF.htm) 分散加载文件是 sct 格式文件。 **格式**: 1. 每个加载域的加载地址和最大尺寸 2. 每个加载域的属性 3. 从每个加载域派生的执行域 4. 每个执行域的执行地址和最大尺寸 5. 每个执行域的输入节 **特点**: 1. 编译后输出的映像文件中各断是首位相连,中间没有空闲的区域。 2. `scatter file` 用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域 3. 有两类域:**`执行域`**,**`加载域`**,从哪里取址,哪里就是`执行域` 4. `加载域`:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码r0,预定义变量rw,堆栈之类和清不清空无关紧要的大片内存区域Zi,都在这其中 5. `执行域`:把加载域进行解压缩后的样子。例如:RO没有变动还是在ROM中,RW被移动到了SRAM中,而ZI被放置在SDRAM中。 6. `scatter file` 本身并不能对映像实现“解压缩”,编译器读入 `scatter` 文件后会根据其中的各种地址生成启动代码了,实现对映像的加载,而这一段代码是 `*(inRoot&&Sections)` 它是 `__main()` 的一部分。这就是在汇编启动代码最后跳转到__main()而不是 `main()` 的原因。 7. 起始地址与加载域重合的执行域称为 `root region` , `*(inRoot&&Sections)` 必须放在这个执行域中,否则连接的时候会报错。`*(+RO)` 包含了 `*(inRoot&&Sections)`,所以如果在 `root region` 中用到了 `*(+RO)` 可以不再指定 `*(InRoot&&Sections)`。 8. 程序正确编译生成目标文件后,就会连接成可执行的文件,在这个过程中,要用到分散加载文件,它决定可执行代码在存储器中存放的位置。 ``` LR_IROM1 0x00000000 0x00002000 { ; 定义载入区域LR_IROM1的起始地址为0x00000000, 大小为0x2000 ER_IROM1 +0 0x00020000 { ;执行域ER_IROM1的起始地址紧接载于区域LR_IROM1的起始地址,即为0x00000000, 大小为0x20000 *(+R0) ;所有的只读代码段都连续地放在这个区域 } RW_RAM1 +0 { ;可读写数据段RW_RAM1紧接ER_IROM1段的尾地址存放,即0x00000000+LR_IROM1的容量 * (+RW) ;所有的可读写的数据段(可读写的程序)都连续地放在这个区域 } ZI_RAM1 +0 { ;清零数据段ZI_RAM1(初始化为零的变量或者是未初始化的变量)紧接RW_RAM1段的尾地址存放 *(+ZI) ;所有的清零数据段都连续地放在这个区域 } } LR_IROM2 0x00002000 0x0007E000 { VECTOR 0x10000000 EMPTY 0xE4 { ;中断向量区域,空出0xE4的大小 } ER_IRAM1 +0 { ;执行域 .ANY (+RO) ;表示除了上面用到的代码之外的代码 } } ```
嵌入式
分散加载
ARM
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
ROS修改 MTU 和 MSS 解决上网慢和页面显示不全问题
WireGuard 搭建组网教程
EPUB 格式详解
Quartus ii 调用 Modelsim
vscode + verilog 环境配置
热门标签
Tensorflow
VPN
Linux
Router
虚拟组网
ROS
zerotier
C++
WIn10
Math
文章目录
IAR 分散加载
Linux 创建 Swap 分区