有如下分散加载文件:

ROM_LOAD 0x00000000              ;// Origination Point of Code (Code in Flash)
{
    ROM_EXEC 0x00000000           ;// Origination Point of Executing
    {
        Startup.o (vectors, +First)
        * (+RO)
    }
    IRAM 0x40000040                 ;// Origination Point of Internal SRAM
    {                              ;// 0x40000000 ~ 0x4000003F for Vector
        Startup.o (MyStacks)
    }
    STACKS_BOTTOM +0 UNINIT
    {
        Startup.o (StackBottom)
    }
    STACKS 0x40004000 UNINIT      ;// End Point of Internal SRAM

{

Startup.o (Stacks)

}
    ERAM 0x81000000                ;// Origination Point of External SRAM
    {
        * (+RW,+ZI)
    }
    HEAP +0 UNINIT   
    {
        Startup.o (Heap)
    }
    HEAP_BOTTOM 0x81800000 UNINIT   ;// End Point of External SRAM
    {
        Startup.o (HeapTop)
    }
}
  其中,ROM_LOAD为加载区的名称,其后面的0x00000000表示加载区的起始地址(存放程序代码的起始地址),也可以在后面添加其空间大小,如“ROM_LOAD 0x00000000 0x20000”表示加载区起始地址为0x00000000,大小为128K字节;ROM_EXEC描述了执行区的地址,放在第一块位置定义,其起始地址、空间大小与加载区起始地址、空间大小要一致。从起始地址开始放置向量表(即Startup.o(vectors,+First),其中Startup.o为Startup.s的目标文件),接着放置其他代码(即映像文件)(即 *(RO));变量区IRAM的起始地址为0x4000000040,放置Startup.o(MyStacks);变量区ERAM的起始地址为0x80000000,放置出Startup.o文件之外的其他文件的变量(即 *(+RW,+ZI));紧靠ERAM变量区之后的是系统堆空间(HEAP),放置描述为Startup.o(Heap);堆栈区STACKS使用片内RAM,由于ARM的堆栈一般采用满递减堆栈,所以堆栈区的起始地址设置为0x40004000,放置描述为Startup.o(Stacks)

2.使用地址不连续的内存(LPC2368)

  Lpc2368一共有56K的RAM,其中通用Ram32K,地址为0x40000000~0x40007fff;8KB的USB专用RAM,地址0x7fd00000~0x7fd01ffff;16KB Ethernet专用RAM,地址为0x7fe00000~0x7fe03fff;以上的USB和Ethernet专用RAM也可用做通用RAM,需要做如下设置:(1)target.c中将USB和Ethernet功能打开,需要设置PCONP寄存器,详见Datasheet。(2)设置分散加载文件,分配这两段内存。

在DebugInRam模式下,有如下分散加载文件:

ROM_LOAD 0x40000000
{
    ROM_EXEC 0x40000000     //加载映像文件(通用RAM首地址)
    {
        Startup.o (vectors, +First)
        * (+RO)
    }
    IRAM 0x40007000        //用户堆栈
    {
        Startup.o (MyStacks)
    }     
    STACKS 0x40008000 UNINIT     //系统堆栈
    {
        Startup.o (Stacks)
    }
    ERAM 0x7fe00000       
    {
        * (+RW,+ZI)
    }
    HEAP +0 UNINIT
    {
        Startup.o (Heap)
    }
 }

3.分散使用Flash地址(LPC2368)

  项目中,要求将片内Flash起始几个扇区空出来留作他用,或者当用到的Flash地址不连续的时候,都可用以下方法来编写分散加载文件:

ROM_LOAD 0x00000000
{
       ROM_EXEC 0x00000000    
        {
        Startup.o (vectors,+First)  
        }
    。。。
}
ROM_LOAD1 0x00004000   //加载映像文件,从第四个扇区开始
{
       ROM_EXEC1 0x00004000
        {
          * (+RO)
        }
}
值得注意的是,中断向量表必须放在flash起始地址处,否则无法启动。根据以上分散加载文件编译生成的Hex文件会有两个,分别如下:

Hex1:
:020000040000FA
:1000000018F09FE518F09FE518F09FE518F09FE5C0
。。。

Hex2:
:020000040000FA
:1040000090808FE20F0098E8080080E0081081E0BF
。。。

可以看出,生成的两段Hex文件的起始地址是不同的,其中一段为中断向量表;另一段为用户映像文件。

4.固定变量内存地址

  嵌入式开发中,有时会需要在同一片内的不同段程序(比如Bootloader和主程序间)间传递数据,这时候往往需要固定变量地址。一般来言,C语言编写的程序,变量地址是由C编译器来分配内存的,程序员无法实现知道变量地址。而ADS中的分散加载文件可以告知编译器,固定某些变量的地址,如下:

ROM_LOAD 0x00000000
{
    ROM_EXEC 0x00000000
    {
        Startup.o (vectors, +First)
        * (+RO)
    }
     RAM 0x40000000 UNINIT   //Mfile.c中的所有变量地址从0x40000000开始
    {
        Mfile.O(+RW,+ZI)
    }
    IRAM 0x40000010
    {
        Startup.o (MyStacks)
        * (+RW,+ZI)
    }
    HEAP +0 UNINIT
    {
        Startup.o (Heap)
    }
    STACKS 0x40004000 UNINIT
    {
        Startup.o (Stacks)
    }
}

上述分散加载文件固定了Mfile.c中变量的起始地址,以这种方法,可以固定任何全局变量的地址,以便其被其他系统访问。

本文摘自:http://blog.sina.com.cn/s/blog_518318f50100i410.html

转载于:https://www.cnblogs.com/it_mac/archive/2010/09/14/1825560.html

【转载】ADS分散加载文件使用总结(lpc23xx)相关推荐

  1. Scatterfile分散加载文件和 mem.scf

     今天仔细学习周立功的模板的过程中,发现了几个.scf文件,自己不知道这是什么东西,所以学习了下: (一) 这是一位网友写的关于mem_a.scf,mem_b.scf,mem_c.scf文件的见解 ...

  2. keil的sct文件_keil .sct分散加载文件及其应用(重点必看)

    (3)分散加载文件语法 load_region_name  start_address | "+"offset  [attributes] [max_size] { executi ...

  3. IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小

    分散加载 MXRT1052/1064芯片的RAM空间分为四种类型:ITCM,DTCM,OCRAM以及外部SDRAM,其中前面三个属于芯片内部RAM,RT1052有512KB,RT1064为1MB,支持 ...

  4. 从MDK分散加载文件学习STM32启动流程

    一直在用ARM的Cortex-M系列做产品开发,也陆陆续续学习了ARM的启动流程.汇编启动文件,但是总感觉没有连贯的把全部知识串起来,不知道某些汇编语句为什么要这么写,没法按照自己的情况进行修改.今天 ...

  5. keil STM32中sct 分散加载文件学习

    sct 分散加载文件简介 MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节 ...

  6. 浅析keil的scf分散加载文件-基于STM32的例程

    浅析keil的scf分散加载文件-基于STM32的例程 关于分散加载文件 分散加载文件.sct 关于分散加载文件 keil编译器在链接的时候,是根据分散加载(.scf后缀的文件)来确定程序的加载域和运 ...

  7. 小猫爪:嵌入式小知识06-KEIL scf分散加载文件解析-链接代码至RAM

    小猫爪:嵌入式小知识06-KEIL scf分散加载文件解析-链接代码至RAM 1 前言 2 执行域和加载域 2 相关语法解析 3 实例解说 4 链接代码至RAM运行 4.1 链接单个section至R ...

  8. [STM32] 分散加载文件 之一 (初探)

    转载自: http://bbs.21ic.com/icview-2579020-1-1.html 本帖最后由 千岁寒 于 2018-11-5 13:00 编辑 1.什么是分散加载            ...

  9. [STM32] 分散加载文件之二 (分散加载的结构)

    转载自: http://bbs.21ic.com/icview-2579052-1-1.html 本帖最后由 千岁寒 于 2018-11-5 13:01 编辑 举个例子: ; ************ ...

最新文章

  1. 转:C#中的abstract与virtual
  2. 脑机相连的狂想,马斯克实现了吗?智源观点:还很遥远
  3. SDN和OpenFlow的区别—Vecloud微云
  4. Campus Address
  5. DayDayUp:那些属于程序猿江湖的鄙视链(看完别笑^~^,哈哈,haha)
  6. 18年石油大学c语言网考答案,石油大学华东C语言2018在线考试.doc
  7. Window平台 mysql8.0下载安装方式
  8. 关于Apahce服务器安装中遇到的问题
  9. Spring4基础 学习笔记(5) ---- Spring与Dao
  10. video4linux简介
  11. Centos7.5 VMtools的安装与卸载
  12. 驱动框架3——初步分析led驱动框架源码
  13. html怎么让图片自动动起来,css如何让图片动起来?
  14. Linux操作Oracle(17)——linux oracle启动时 :各种报错 解决方案(2020.07.30更新...)
  15. tensorflow sigmoid 如何计算训练数据的正确率_“来自蒙娜丽莎的凝视”— 结合 TensorFlow.js 和深度学习实现...
  16. 【写作技巧】毕业论文写作资料搜索库大全
  17. 华为网络配置(路由配置)
  18. web前端开发学习经验分享——css,js进阶篇
  19. 计算机打不开管理没反应,为什么电脑上的软件打不开点了没有反应任务管理器也打不开...
  20. 关于电赛应该了解的事

热门文章

  1. OllyDbg笔记-暴力破解简单判断程序(TraceMe.exe与简单Qt程序)
  2. C++ | Qt 获取局域网中存在的主机(IP以及主机名)
  3. Java学习笔记-Spring IoC 通过XML把Bean给IoC容器
  4. C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示
  5. C/C++ OpenCV直方图均衡化
  6. oracle中ora-02049,ORA-02049 ‘timeout: distributed transaction waiting for lock’ 解决
  7. java 连等_java并发之LBQ和ABQ(1)
  8. 中山市区电信5g覆盖地图_热点 | 百度与中国电信达成战略合作 覆盖5G、互联网等领域...
  9. java dump分析工具_Java虚拟机详解(七)------虚拟机监控和分析工具(1)
  10. then 微信小程序_微信小程序 引入es6 promise