打印
[STM32]

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

[复制链接]
1419|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
千岁寒|  楼主 | 2018-11-5 12:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 千岁寒 于 2018-11-5 13:01 编辑

举个例子:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x00000000 0x00008000 {    ; load region size_region
  ER_IROM1 0x00000000 0x00008000 {  ; load address = execution address
   *.o (RESET, +First)    ;异常&中断向量, +First表示强制放到首地址
   *(InRoot$$Sections)    ;ARM相关库,InRoot$$Sections即ARM库的链接器标号
   .ANY (+RO)             ;其他代码段,主要是用户代码
  }
  RW_IRAM1 0x00048000 0x00001800  {  ; RW data
   .ANY (+RW +ZI)         ;在SRAM上的RW、ZI数据段
  }
}
;[0x00000000 0x00008000] ----- [Flash起始地址, Flash大小]
;[0x00048000 0x00001800]----- [片内SRAM的始地址, 片内SRAM的大小]

-----------------------------------------------------------------------------
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) ;另一个输入节
    }
}


烧录到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-------->运行程序!

整理参考: https://blog.csdn.net/weixin_39118482/article/details/79895378  
  https://www.xuebuyuan.com/3201298.html


相关帖子

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

本版积分规则

72

主题

244

帖子

4

粉丝