[ARM入门]

分散加载文件 之二 分散加载的结构

[复制链接]
915|0
手机看帖
扫描二维码
随时随地手机跟帖
千岁寒|  楼主 | 2018-11-16 10:06 | 显示全部楼层 |阅读模式
LOAD_ROM_1 0x0000 0x3000      ; 加载域描述  这段是要告诉链接器,你的程序是存在哪里?我从哪里去找需要执行的代码。
{                                                                        
    EXEC_ROM_1 0x0000 0x3000  ; 运行域描述  这段是要告诉链接器程序在哪里执行,在ARM Cortex-M系列的绝大多
    {                         ; 数MCU中加载域以及运行域是在同一个空间上的,即片内Flash。
        program1.o (+RO)      ; 输入节描述   就是告诉链接器,具体把哪一个以及怎么把这一个obj文件放到运行域里面
    }
    DRAM 0x18000 0x8000       ; 运行域描述  这里指的是RAM空间的运行域,下面会解释为什么这里会有两个运行域
    {
        program1.o (+RW,+ZI)  ; 输入节描述  告诉链接器,去哪里找执行程序是需要使用的变量以及数据
    }
}

LOAD_ROM_2 0x4000 0x2000     ;另一个加载域描述  同一个工程可以有多个加载域,就好像同一台电脑可以装几个操作系统
{
    EXEC_ROM_2 0x4000 0x2000 ;另一个运行域描述
    {
        program2.o (+RO)     ;另一个输入节
    }
    SRAM 0x8000 0x8000       ;另一个运行域描述
    {
        program2.o (+RW,+ZI) ;另一个输入节
    }
}
TIP:
    ARM_LIB_HEAP域ARM_LIB_STACK是两个编译器之前就定义好的标号(Symbol),可用于在分散加载文件中处理堆栈分配。当然堆栈也可以在启动代码里面指定分配,这是两种不同的方式。
烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。
实际上,ROM中的指令至少应该有这样的功能:
    1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
    2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。RO包含了 Code和RO Data两类数据。

Image$$RO$$Base  :  RO段在运行域中的起始地址
Image$$RO$$Limit  :  RO段在运行域中的截止地址
Image$$RW$$Base
"Image$$RW$$Limit" :::  由于RW和SI相连,Image$$ZI$$Base 等于Image$$RW$$limit
Image$$ZI$$Base
Image$$ZI$$Limit
这几个变量是编译器自动计算并通知的,可以在  makefile文件中使用。

复位运行->拷贝RO->拷贝RW->初始化ZI-------->运行程序!

------------------------------------------------------------------------------------------------------------------------------------
REF:https://blog.csdn.net/weixin_39118482/article/details/79895378

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

244

帖子

4

粉丝