历史上的今天
返回首页

历史上的今天

今天是:2025年01月28日(星期二)

2020年01月28日 | ADS分散加载文件使用总结(lpc23xx)

2020-01-28 来源:eefocus

有如下分散加载文件:

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中变量的起始地址,以这种方法,可以固定任何全局变量的地址,以便其被其他系统访问。

推荐阅读

史海拾趣

ABECO公司的发展小趣事

随着业务的发展,ABECO在1970年做出了一个大胆的决定——进军马耳他市场。这一决策既带来了挑战,也带来了机遇。公司需要适应新的市场环境,了解当地的需求和文化。经过一段时间的摸索和努力,ABECO凭借其高品质的产品和专业的服务,成功在马耳他市场打开了局面,为后续的发展奠定了坚实的基础。

AXTAL公司的发展小趣事

随着业务的不断发展,AXTAL公司开始在全球范围内进行布局和扩展。公司的设施位于德国南部的“水晶谷”地区,靠近海德堡。这一地区以其丰富的石英资源和技术优势而闻名,为AXTAL提供了得天独厚的条件。此外,公司还积极拓展海外市场,与全球多家知名企业建立了紧密的合作关系,进一步提升了公司的国际影响力。

Fenghua (HK) Electronics Ltd公司的发展小趣事

人才是企业发展的重要保障。Fenghua (HK) Electronics Ltd高度重视人才队伍建设,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入公司。公司提供了完善的培训体系和晋升机会,激发了员工的积极性和创造力。同时,公司注重营造良好的企业文化氛围,让员工在工作中感受到归属感和成就感。

圣邦微电子(Fangtek)公司的发展小趣事

为了降低成本、提高生产效率,Fenghua (HK) Electronics Ltd不断优化供应链管理。公司与供应商建立了长期稳定的合作关系,实现了原材料的及时供应和成本控制。同时,公司引入了先进的生产管理系统,对生产过程中的各个环节进行精细化管理,确保了产品质量的稳定性和一致性。

FIDELIX公司的发展小趣事

随着技术的不断进步和市场竞争的加剧,FIDELIX意识到单靠自身的力量难以在全球市场上立足。因此,公司开始寻求国际合作,与全球多家知名半导体企业建立合作关系,共同研发新技术、新产品。这些国际合作不仅提升了FIDELIX的技术水平,也为其产品打开了国际市场的大门。

High Voltage Power Solutions Inc公司的发展小趣事

在东芯半导体的支持下,FIDELIX开始将其一部分技术团队迁移到国内,加速了存储芯片的国产替代进程。这些技术团队的加入,不仅提升了国内半导体产业的技术水平,也促进了FIDELIX与国内企业的深度融合和协同发展。

问答坊 | AI 解惑

plc过程控制系统常见故障的分布分析及维护

为了延长 plc 控制系统的寿命,在系统设计和生产使用中要对该系统的设备消耗、元器件设备故障发生点有较明白的估计,也就是说,要知道整个系统哪些部件最容易出故障,以便采取措施。现以我厂特种水泥 / 号线的plc过程控制系统为例,对 pl ...…

查看全部问答>

FPGA的门数如何计算?

经常听FPGA是多少万门的,但FPGA不是以逻辑单元算大小的吗,这两者之间有什么关系吗?多少万门怎么估算呀?…

查看全部问答>

看看Xilinx最新发布的的目标设计平台特定领域专用套件

上图吧,实在是太晚了,也没啥可写的,大概简要说明一下就好。其他如果我在想起什么,会继续补充的。 这是Spartan-6的开发板,我掂了掂,挺沉的。。。AVNET做的,做工应该没得挑。 接口图,包括JTAG UART DVI 以太网接口及指示灯。 右边屏 ...…

查看全部问答>

凌阳单片机简介

SPCE061A简介 文章来源:凌阳科技大学计划 作者:凌阳科技大学计划 发布时间:2005-5-26 15:25:54 1.2.1 总述     SPCE061A 是继µ’nSP™系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。与SPCE500A不 ...…

查看全部问答>

基于EPA的光栅位移测量系统

引 言     目前,国内研究和开发数控定位装置的单位都在研制各种经济型的工作台产品,一般定位精度为1 μm、5 μm、10 μm。工作台的结构布局、位移量的大小、测量速度等都越来越趋于灵活,自动化程度也越来越高,但是这些工作台大多数 ...…

查看全部问答>

关于bootloader中断向量的问题

读完bootloader,一点疑惑: 1、发生异常时,中断向量表是有硬件根据异常强行跳转的,再由那个宏得到服务程序地址?非中断向量处理 是 中断向量处理 的一个补充?这个理解对不 2、在起始代码里reset是直接跳转的,单独设置了irp中断,其余都是未 ...…

查看全部问答>

wince驱动 之 中断问题

最近在学习中断驱动,有几点不明白,向大家请教: 1、在wince 中断里,逻辑中断号和事件关联,那么该事件是如何被触发的呢?需要人为干预吗? 2、某一类型的中断,比如I2C中断,isr_IIC对应一个逻辑中断,但触发该中断的原因可能有好几种吧?读、 ...…

查看全部问答>

wince下获取鼠标空闲时间

请问如何在wince下获取鼠标的空闲时间,在应用程序中使用定时器来计算两次输入的间隔时间这种方法因某种原因不允许使用。…

查看全部问答>

STM32的TIM2的TIM_OCMode_Timing方式疑惑

按固件库的说明,STM32的通用定时器TIM2有6种方式:TIM_OCMode_Timing;TIM_OCMode_Active;TIM_OCMode_Toggle;…………;我写了一个定时器定时100us程序。按下载的固件库程序里的实例,设置通用TIM2为TIM_OCMode_Timing方式,在定时比较中断 ...…

查看全部问答>

CC2431定位测试,发现误差很大!

CC2431定位测试,发现误差很大!用六个参考点,但是测试的误差仍超出3-5米,有做过的吗?…

查看全部问答>