基于MDK的分散加载文件

原创 2015年11月18日 17:18:17

面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西都有了,BAIDU来的都不全面,这是一种学习方法。

http://www.keil.com/support/man/docs/armlink/armlink_BABDDHBF.htm

这个链接是我在官网上找到的关于分散加载文件的资料。讲的比较详细了。这里通过一个例子记录下我学习的过程,通过分散加载文件把代码从flash里拷贝到ram里运行, 基于LPC1788。

先贴下我的sct文件:

LR_IROM1 0x00000000 0x00002000  
{ 
    ER_IROM1 0x00000000 0x00020000  
    {
        *.o (RESET, +First)
        *(InRoot$$Sections)
        startup_lpc177x_8x.o (+RO)
        system_LPC177x_8x.o (+RO)
    }

    RW_IRAM1 0x20000000 0x00004000  
    {
        .ANY (+RW +ZI)
    }
}

LR_IROM2 0x00002000 0x0007E000
{
    VECTOR 0x10000000 EMPTY 0xE4
    {
    }

    ER_IRAM1 +0
    {
        .ANY (+RO)
    }
}

这里有两个加载域(load region)LR_IROM1和LR_IROM2,LR_IROM1是初始化程序,拷贝代码等,从ROM的地址0开始,LR_ROM2是应用程序,从ROM的0x2000开始。+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。大括号里面的为运行域(execution region),一个加载域可以包含几个运行域,LR_ROM2里面有两个运行域,VECTOR和ER_IRAM1,我用VECTOR来表示中断向量区域,ER_IRAM1来表示应用程序区,+0表示紧接着VECTOR排放,EMPTY表示空的,这里空出0xE4的大小,用来放中断向量,.ANY表示除了上面用到的代码之外的代码,官网上有专门解释.ANY的一节。

下面用一张图来表示这个程序的加载域和执行域:
这里写图片描述

其实加载域的empty这块区域是不用空出来的,主要是运行域要空出来,用来拷贝中断向量,看个人喜好了,我觉得空出来方便引用这块区域的执行域地址。

这样框架就比较清楚了,拷贝的程序清单如下:

extern unsigned char Image$$VECTOR$$Base;
extern unsigned char Image$$VECTOR$$Length;

extern unsigned char Load$$ER_IRAM1$$Base;
extern unsigned char Image$$ER_IRAM1$$Base;
extern unsigned char Image$$ER_IRAM1$$Length;

void CopyCode2Ram ()
{
    unsigned char *pSrc, *pDes;
    unsigned int count;

    SCB->VTOR = 0x10000000;

    pSrc = 0;
    pDes = (unsigned char*)&Image$$VECTOR$$Base;
    count = 0xE4;

    while (count--)
    {
        *pDes++ = *pSrc++;
    }


    count = (unsigned int)&Image$$ER_IRAM1$$Length;
    pDes = (unsigned char*)&Image$$ER_IRAM1$$Base;
    pSrc = (unsigned char*)(&Load$$ER_IRAM1$$Base + 0xE4);

    while (count--)
    {
        *pDes++ = *pSrc++;
    }
}

其中拷贝中断向量的时候要指定中断向量的偏移地址。Load$$ER_IRAM1$$Base表示执行域ER_IRAM1的加载地址;Image$$ER_IRAM1$$Base表示执行域ER_IRAM1的执行地址;Image$$ER_IRAM1$$Length表示执行域ER_IRAM1的实际长度,VECTOR区域因为是EMPTY,所以实际长度是0,而中断向量的长度是固定的,所以程序里就写了个常数。

基于MDK的分散加载文件

关于分散加载文件
  • tracing
  • tracing
  • 2013年08月03日 08:45
  • 9040

Keil sct分散加载文件

首先介绍几个概念: 1.ARM映像文件 ARM映像文件是一个层次性结构的文件,其中包含了域(region)、输出段(output section)和输入段(input section)。各部分关系...
  • kobesdu
  • kobesdu
  • 2014年07月29日 09:50
  • 12205

关于keil里的分散加载文件.scf

昨天,修改程序的时候,修改到了scf文件,之前对于scf文件没有了解,趁着这个机会略知一二。 scf文件,全名scatter file,中文名分散加载文件,是ARMlink的输入参数,如果你想把你的代...
  • jiujiujiuqiuqiuqiu
  • jiujiujiuqiuqiuqiu
  • 2015年07月17日 13:32
  • 1557

基于MDK的分散加载文件

origin: http://blog.csdn.net/tracing/article/details/49910055 面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西...
  • yazhouren
  • yazhouren
  • 2017年06月25日 20:51
  • 349

试图搞懂MDK程序下载到flash(二)--分散加载文件scatter

分散加载文件概念      对于分散加载文件的概念,在《ARM体系结构与编程》书第11章有明确介绍。      分散加载文件(即 scatter file,后缀为 .scf)是一个文本文件,通过编...
  • mybelief321
  • mybelief321
  • 2013年05月19日 18:09
  • 5135

基于MDK的分散加载文件

关于分散加载文件
  • tracing
  • tracing
  • 2013年08月03日 08:45
  • 9040

STM32 分散加载文件 IAP —MDK

作者:阿拉丁神丢 转自:http://blog.sina.com.cn/s/blog_6035432c0100u5v6.html ; ******************************...
  • whw8007
  • whw8007
  • 2013年06月07日 12:33
  • 1099

在MDK环境下使用分散加载描述文件

发现出错了……编译通过仿真没问题,但运行不了,估计还是没设置好。等待改进!调研中……   为免我把这两天的学习成果忘了,还是在这里做个备忘吧,同时也希望对正在迷茫的同道中人有所帮忙。    ...
  • helenfish
  • helenfish
  • 2011年09月22日 12:18
  • 1546

搞懂MDK的分散加载文件

格式:    1.每个加载区的加载地址和最大尺寸    2.每个
  • u013988485
  • u013988485
  • 2014年05月21日 14:19
  • 661

【C语言常识】Keil MDK的分散加载文件.sct

出处:http://blog.csdn.net/tracing/article/details/9720157 面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西都有...
  • wuhenyouyuyouyu
  • wuhenyouyuyouyu
  • 2017年05月04日 16:11
  • 791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于MDK的分散加载文件
举报原因:
原因补充:

(最多只允许输入30个字)