分散加载文件 ads

来源:互联网 发布:linux的fastboot下载 编辑:程序博客网 时间:2024/04/28 06:05
 

有如下分散加载文件:

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.ovectors+First),其中Startup.oStartup.s的目标文件),接着放置其他代码(即映像文件)(即 *RO));变量区IRAM的起始地址为0x4000000040,放置Startup.oMyStacks);变量区ERAM的起始地址为0x80000000,放置出Startup.o文件之外的其他文件的变量(即 *+RW+ZI));紧靠ERAM变量区之后的是系统堆空间(HEAP),放置描述为Startup.oHeap);堆栈区STACKS使用片内RAM,由于ARM的堆栈一般采用满递减堆栈,所以堆栈区的起始地址设置为0x40004000,放置描述为Startup.oStacks

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

Lpc2368一共有56KRAM,其中通用Ram32K,地址为0x40000000~0x40007fff8KBUSB专用RAM,地址0x7fd00000~0x7fd01ffff16KB Ethernet专用RAM,地址为0x7fe00000~0x7fe03fff;以上的USBEthernet专用RAM也可用做通用RAM,需要做如下设置:(1target.c中将USBEthernet功能打开,需要设置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        /*
变量,放置与Ethernet专用RAM首地址*/
    {
        * (+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://devdiary.blog.sohu.com/52597162.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办 手机拍的视频在电脑上放不了怎么办 炉石传说手机点登陆游戏闪退怎么办 车到信号屏蔽区一键启动不了怎么办 王者荣耀战队活跃度满了怎么办 win10你的账户已被停用怎么办 电脑一键还原后一直黑屏怎么办? 被打了狂犬疫苗的狗咬伤怎么办 美版苹果7系统坏了怎么办 韩服的球球大作战网络不稳定怎么办 球球大作战号删了找不回来怎么办 队友传足球球的时候接不到怎么办 魅族手机中病毒锁机了怎么办? vbs打开是和文本文档一样怎么办 把电脑注册表删了电脑动不了怎么办 注册表删一项后电脑启动不了怎么办 解压过的过的软件安装包损坏怎么办 手机中病毒自动发短信扣费怎么办 苹果手机中的高德地图打不开怎么办 大晚上挂了别人的车怎么办 手机不兼容高版本微信怎么办 绝地求生右下角小地图变大了怎么办 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办 微信游戏刺激战场电脑卡怎么办 电脑更新了以前的东西都没了怎么办 安装黑苹果鼠标键盘不能用怎么办 苹果开机卡在白底黑苹果怎么办 信长之野望14没有剧情触发怎么办 玩cf手游手机屏幕摩擦力大怎么办 网吧有战地1没有橘子平台怎么办 俩人打仗了对方想讹我怎么办 环世界模组装多了打不开怎么办 手机百度云视频播放画面太小怎么办 ps文件说数据似乎已经损坏怎么办 百度云中的压缩包下载的很慢怎么办 游戏压缩出现未知错误或损坏怎么办 百度云里的压缩包解压后损坏怎么办 联创打印时显示压缩文件失败怎么办