M0系列ARM芯片的启动程序分解
ARM的启动过程详解

基于arm的芯片多数为复杂的片上系统,这种复杂系统里的多数硬件模块都是可配置的,需要由软件来设置其需要的工作状态。
因此在用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。
由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。
一般通用的内容包括:中断向量表初始化存储器系统初始化堆栈初始化有特殊要求的断口,设备初始化用户程序执行环境改变处理器模式呼叫主应用程序中断向量表arm要求中断向量表必须放置在从0地址开始,连续8X4字节的空间内。
每当一个中断发生以后,arm处理器便强制把PC指针置为向量表中对应中断类型的地址值。
因为每个中断只占据向量表中1个字的存储空间,只能放置一条arm指令,使程序跳转到存储器的其他地方,再执行中断处理。
中断向量表的程序实现通常如下表示:AREA Boot,CODE,READONLYENTRYB ResetHandlerB UndefHandlerB SWIHandlerB PreAbortHandlerB DataAbortHandlerBB IRQHandlerB FIQHandler其中关键字ENTRY是指定编译器保留这段代码,因为编译器可能会认为这是一段亢余代码而加以优化。
链接的时候要确保这段代码被链接在0地址处,并且作为整个程序的入口。
初始化存储器系统存储器类型和时序配置通常Flash和SRAM同属于静态存储器类型,可以合用同一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。
存储器端口的接口时序优化是非常重要的,这会影响到整个系统的性能。
因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能的快;而同时又要考虑到由此带来的稳定性问题。
存储器地址分布一种典型的情况是启动ROM的地址重映射。
初始化堆栈因为arm有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。
因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。
M0系列ARM芯片的启动程序分解

周立功NXP LPC21xx/22xx 系列ARM 芯片的启动程序分解作者:钟常慰关于LPC2200 启动程序分散加载描述文件的叙述在ADS LPC2200 的启动模板中有一个scf 文件夹,其中有mem_a.scf、mem_b.scf、mem_c.scf 这3 个文件,这3 个文件是ADS 的分散加载机制,其目的是将代码段和数据段分别定位到指定地址上。
可以在Arm Linker 中选择加载路径。
分散装载技术概述:分散装载技术可以把用户的应用程序分割成多个RO(只读)运行域和RW(可读写)运行域(一个存储区域块),并且给它们制定不同的地址。
一个嵌入式系统中,Flash、16 位RAM、32 位RAM 都可以存在于系统中,所以,将不同功能的代码定位在特定的位置会大大地提高系统的运行效率。
下面是最为常用的2 种情况:1、32 位的RAM 运行速度很快,因此就把中断服务程序作为一个单独的运行域,放在32 位的RAM,使它的响应时间达到最快。
2、程序在RAM 中运行,其效率要远远高于在ROM 中运行,所以将启动代码(Boot loader)以外的所有代码都复制在RAM 中运行,可以提高运行效率。
分散装载技术主要完成了2 个基本的功能:如何分散。
就是如何将输入段组成输出段和域。
如何装载。
就是确定装载域和运行域在存储空间里的地址是多少。
域可以分为装载域和运行域装载域描述运行前输出段和域在ROM/RAM 里的分布状态,运行域描述了运行时输出段和域在ROM/RAM 里的分布状态。
大多数情况下,映像文件在执行前把它装载到ROM 里,而当运行时,域里的有些输出段(比如RW 类型的输出段)必须复制到RAM 里,程序才能正常运行,所以,在装载和运行时,RW 类的输出段处在不同的位置(地址空间)。
Scatterfile 分散加载文件:在scatterfile 中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading 的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。
arm的启动过程

arm的启动过程ARM是一种广泛应用于嵌入式系统和移动设备的处理器架构。
在学习ARM的过程中,了解其启动过程是非常重要的。
本文将详细介绍ARM的启动过程。
ARM的启动过程可以分为四个主要阶段:复位阶段、启动阶段、初始化阶段和操作系统启动阶段。
在复位阶段,当ARM处理器上电或者接收到复位信号时,它会进入复位状态。
在这个阶段,处理器会初始化一些重要的寄存器,例如程序计数器(PC)和堆栈指针(SP)。
此外,处理器还会加载一些固定位置的向量表,这些向量表包含了处理器在不同中断或异常发生时所需要执行的代码。
接下来是启动阶段,处理器会根据向量表中指定的地址跳转到相应的启动代码。
启动代码的任务是设置处理器的工作模式和时钟频率。
在这个阶段,处理器会切换到特权模式,例如特权模式(SVC),以便能够访问特权指令和寄存器。
同时,处理器还会根据外部存储器中的配置信息来设置时钟频率,以确保处理器能够正常工作。
进入初始化阶段后,处理器会执行一系列初始化代码,包括初始化外部存储器、初始化外设和设置中断控制器等。
在这个阶段,处理器会根据配置信息初始化外部存储器,例如SDRAM或Flash存储器。
同时,处理器还会初始化外设,例如串口、GPIO和定时器等,以便与外部设备进行通信。
此外,处理器还会设置中断控制器,以便处理外部中断信号。
最后是操作系统启动阶段,在这个阶段,处理器会加载操作系统的启动代码,并跳转到操作系统的入口地址。
操作系统的启动代码会进一步初始化系统资源,例如内存管理单元(MMU)、进程管理和设备驱动等。
一旦操作系统初始化完成,处理器就可以开始执行操作系统的任务调度和应用程序的执行。
总结起来,ARM的启动过程包括复位阶段、启动阶段、初始化阶段和操作系统启动阶段。
在这个过程中,处理器会进行一系列的初始化操作,包括设置寄存器、加载向量表、设置工作模式和时钟频率、初始化外部存储器和外设、设置中断控制器以及加载操作系统的启动代码。
ARM的启动过程

ARM芯片的启动程序的分析和总结(2009-02-04 14:35:26)转载分类:ARM标签:杂谈1、综述:目前大多基于ARM芯片的系统都是一个比较复杂的片上系统,多数硬件模块都是可配置的,可以通过软件来设置其需要的工作状态。
因此在运行用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。
这一段代码就称为启动程序。
由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。
在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,需要用ARM的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户C程序。
在ARM设计开发中,启动代码的编写是一个极重要的过程。
然而启动代码随具体的目标系统和开发系统有所区别,但通常包含以下部分:·向量表定义·地址重映射及中断向量表的转移·堆栈初始化·设置系统时钟频率·中断寄存器的初始化·进入C应用程序下面就结合PHILIPS的LPC2119的启动代码来分析与说明ARM7处理器的启动代码的编写。
1.1向量表定义ARM芯片上电或复位后,系统进入管理模式、ARM状态、PC(R15寄存器)指向0x00000000地址处。
中断向量表为每一个中断设置1个字的存储空间,存放一条跳转指令,通过这条指令使PC指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。
LPC2119的中断向量表和其它基于ARM核的芯片中断向量表较类似,只要注意LPC2119要使向量表所有数据32位累加和为零(0x00000000-0x0000001C的8个字的机器码累加), 才能使用户的程序脱机运行。
LPC2119的中断向量表如图1所示。
1.2 地址重映射及中断向量表的转移ARM7处理器在复位后从地址0读取第一条指令并执行,因此系统上电后地址0必须是非易失的ROM/FLASH,这样才能保证处理器有正确可用的指令。
arm版本linux系统的启动流程

arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
ARM启动流程

以上说的全是理论,真正在我们使用IDE进行项目开发时需要注意什么呢?
应该说不同的集成开发环境对启动设置的要求不同,开发ARM比较常用的IDE有KEIL、IAR、ADS、MDS、RVDS、CrossWorks等几种。其中RVDS是ARM公司收购KEIL并结合之前的开发工具ADS而推出的一款集大成的IDE,号称支持所有ARM芯片的JTAG调试,目前我使用的开发环境正是RVDS4.0。但它的一个缺点是只是使用RealView ICE这个JTAG调试器,这款调试器内部跑了一个linux操作系统,基本上相当于一款小型电脑,支持局域网共享,支持半主机功能,可以说是我用过的最稳定最强大的调试器(有的时候好的调试器对做项目能起到事半功倍的作用),但价格也贵得离谱,最近公司采购的一批单价高达2万多人民币,要知道平时使用的山寨版的调试器如ULink、JLink、LM-Link等只要100~400元不等,其他几种调试环境没这个问题,支持的调试器种类很多,但大大小小的毛病还是蛮烦人的。因此选择调试环境时还是要看个人的经济实力综合考虑呀!
可以说启动方式解决了我们的代码存储疑问,那么上电后的流程是什么样的呢?
下图是NAND启动流程以及中断执行流程。
SD启动的流程非常类似,只不过一般搬运启动代码时搬运前4K代码,具体搬运多少是在设计芯片时决定的,一般芯片成片后均不能再更改了,但4K的启动代码我相信基本上是够用的了。 其实还有一种方式,但不能叫做启动方式,那就是JTAG调试。 JTAG调试是目前最流行的调试方式,它比ISP方式多出了很多功能,比如断点、单步调试等,特别在大型项目中,这些非常有用。 使用JTAG时可以通过JTAG将代码放到任意一个可byte寻址的地址,然后会直接从此处开始执行代码,说到这里,你们应该也明白了,这仅仅是一种调试方式,不可能你的产品还非得要连上一个JTAG调试器才能用吧? 对于嵌入式操作系统来说,启动过程又会变得稍微复杂些。 我对这种情况的启动顺序总结为:启动代码->bootload->操作系统,其中bootload和操作系统通称为功能代码。一般启动流程如下图所示:
ARM的启动分析详解及应用

ARM的启动分析详解及应用ARM是一款广泛应用于嵌入式系统和移动设备的处理器架构。
在ARM的启动过程中,主要涉及到硬件初始化、加载引导程序和启动操作系统等步骤。
下面将对ARM的启动过程进行详细分析,并讨论其在实际应用中的应用。
硬件初始化:在ARM的启动过程中,首先需要对硬件进行初始化。
这包括对中央处理器(CPU)、存储器、外设等进行初始化操作。
例如,初始化CPU的控制和配置寄存器,设置存储器的访问模式和权限等。
硬件初始化的目的是确保系统处于一个稳定的状态,为后续的操作打下基础。
加载引导程序:引导程序是ARM启动的关键部分,它负责初始化系统环境和加载操作系统的镜像文件。
引导程序通常位于启动设备的引导扇区或者特定的存储器地址中。
在ARM中,引导程序可以是U-Boot、Das U-Boot或是其他自定义的引导程序。
加载引导程序的方式可以是通过串口、以太网或者其他类似的介质。
引导程序的主要功能是初始化设备和外设,配置内存和中断控制器等。
它会加载操作系统的镜像文件到内存中,并跳转到操作系统的起始地址,从而将控制权交给操作系统。
启动操作系统:在引导程序加载并跳转到操作系统的起始地址后,操作系统开始运行。
操作系统负责管理硬件资源、提供系统服务和支持应用程序的运行。
常见的ARM操作系统有Linux、Android等。
ARM的启动分析步骤在实际应用中具有重要的意义。
首先,通过硬件初始化可以确保系统处于一个稳定的状态,避免因为硬件问题导致系统崩溃或运行不正常。
其次,加载引导程序可以实现自定义的系统启动流程和初始化操作,满足特定应用需求。
最后,启动操作系统可以为用户提供高效、稳定的系统环境,并支持各种应用程序的运行。
在实际的应用中,ARM的启动分析步骤具有广泛的应用。
例如,嵌入式系统可以通过自定义的引导程序来实现特定的启动流程和初始化操作,以满足设备的需求。
移动设备则可以通过加载引导程序和启动操作系统来提供稳定的系统环境和良好的用户体验。
ARM启动代码分析

ARM启动代码分析
ARM启动代码的第一步是设置处理器的模式和栈指针。
ARM处理器有
多种模式,如用户模式、系统模式、中断模式和监视模式等,而每种模式
都有自己的寄存器集合,因此需要选择一个合适的模式。
一般情况下,一
开始会进入特权模式(如系统模式),然后将栈指针设置到RAM的一些合
适位置。
ARM启动代码的第三步是设置不同的中断服务例程。
ARM处理器支持
多种中断,如IRQ中断和FIQ中断等。
具体中断处理过程包括保存现场、
执行中断服务例程、恢复现场等步骤,这些都需要在启动代码中进行相关
的设置。
ARM启动代码的第四步是初始化内存管理单元(MMU)。
MMU是用来处
理虚拟地址和物理地址之间的映射关系的硬件单元,它可以提供更高的系
统性能和更灵活的内存管理能力。
初始化MMU需要设置页表和相关的控制
寄存器。
除了上述主要的步骤,ARM启动代码还可能包括其他一些完成特定任
务的代码,如初始化外设、配置中断控制器、设置缓存等。
这些任务的完
成都是为了保证系统正常启动和运行。
总之,ARM启动代码是用来初始化ARM处理器和系统环境的一段代码,它完成了处理器模式设置、时钟频率配置、中断服务例程设置、MMU初始
化以及跳转到操作系统内核等主要任务。
通常情况下,ARM启动代码由汇
编语言编写,具有高度灵活性和直接性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
周立功NXP LPC21xx/22xx 系列ARM 芯片的启动程序分解作者:钟常慰关于LPC2200 启动程序分散加载描述文件的叙述在ADS LPC2200 的启动模板中有一个scf 文件夹,其中有mem_a.scf、mem_b.scf、mem_c.scf 这3 个文件,这3 个文件是ADS 的分散加载机制,其目的是将代码段和数据段分别定位到指定地址上。
可以在Arm Linker 中选择加载路径。
分散装载技术概述:分散装载技术可以把用户的应用程序分割成多个RO(只读)运行域和RW(可读写)运行域(一个存储区域块),并且给它们制定不同的地址。
一个嵌入式系统中,Flash、16 位RAM、32 位RAM 都可以存在于系统中,所以,将不同功能的代码定位在特定的位置会大大地提高系统的运行效率。
下面是最为常用的2 种情况:1、32 位的RAM 运行速度很快,因此就把中断服务程序作为一个单独的运行域,放在32 位的RAM,使它的响应时间达到最快。
2、程序在RAM 中运行,其效率要远远高于在ROM 中运行,所以将启动代码(Boot loader)以外的所有代码都复制在RAM 中运行,可以提高运行效率。
分散装载技术主要完成了2 个基本的功能:如何分散。
就是如何将输入段组成输出段和域。
如何装载。
就是确定装载域和运行域在存储空间里的地址是多少。
域可以分为装载域和运行域装载域描述运行前输出段和域在ROM/RAM 里的分布状态,运行域描述了运行时输出段和域在ROM/RAM 里的分布状态。
大多数情况下,映像文件在执行前把它装载到ROM 里,而当运行时,域里的有些输出段(比如RW 类型的输出段)必须复制到RAM 里,程序才能正常运行,所以,在装载和运行时,RW 类的输出段处在不同的位置(地址空间)。
Scatterfile 分散加载文件:在scatterfile 中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading 的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。
执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。
映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。
scatter 文件语法scatter 文件是一个简单的文本文件,包含一些简单的语法。
My Region 0x0000 0x1000 ;我的名字My Region 起始地址0x0000 属性0x1000{;the context of region 这个域的范围}标题每个块由一个头标题开始定义,头中至少包含块的名字和起始地址,如(0x0000),另外还有最大长度等其他一些属性选项(注:这些属性是可选的,如0x1000)。
内容块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。
1、一个加载块必须至少含有一个执行块;实践中通常有多个执行块。
2、一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。
有以下几种属性:RO:只读的代码段和常量RW:可以读写的全局变量和静态变量ZI:RW 段中要被初始化为零的变量。
Scatterfile 中的定义要按照系统冲定向后的存储器分布情况进行,在引导程序完成初始化任务后,应该把主程序转移到RAM 中运行以加快系统的运行速度。
2008.11.25zhongcw1002@分(消)散LPC2200 的分散加载文件分析:ROM_LOAD 0x80000000 (1){ROM_EXEC 0x80000000 (2){ Startup.o (vectors, +First) (3)* (+RO) } (4)IRAM 0x40000000 (5){ Startup.o (MyStacks) } (6)STACKS_BOTTOM +0 UNINIT (7){ Startup.o (StackBottom) } (8)STACKS 0x40004000 UNINIT (9){ Startup.o (Stacks) } (10)ERAM 0x80040000 (11){ * (+RW,+ZI) } (12)HEAP +0 UNINIT (13){ Startup.o (Heap) } (14)HEAP_BOTTOM 0x80080000 UNINIT (15){ Startup.o (HeapTop) } (16)}FLASH_LOAD 0x81000000 0x1000 (17){ FLASH_EXEC 0x81000000 (18){ main.o (+RO) } (19)}(1) 加载时域描述,名称位ROM_LODA 它的地址为0x80000000;0x80000000 为LPC 片外RAM 地址,即将以下的加载的段和域都在RAM 中。
(2) 第一个运行时域描述。
ROM_EXEC 描述了执行区的地址,放在第一块定义,其起始地址、空间大小域加载区起始地址、空间大小要一样。
(2)-(4)从起始地址开始放置向量表。
Startup.o 是Startup.s 的目标文件。
Vectors 为中断向量表。
模块Startup 位于该加载域的开头(+First),vectors 作为入口点,包含全部的RO 代码。
ARM 在芯片复位之后,系统进入管理模式、ARM 状态,PC(R15)寄存器的值为0x00000000,所以必须保证用户的向量表代码定位在0x00000000 处,或者映射到0x00000000 处(例如向量表代码在0x80000000处,通过存储器映射,访问0x0000000 就是访问(0x80000000)。
(5)-(6)第二运行时域描述。
将MyStacks 堆栈段装载到片内静态RAM 中。
(7)-(8)将栈底放入堆栈的后面(+0)不进行初始化(UNINIT), 栈底为Startup 中的StackBottom。
(9)-(10) 将栈放入地址为0x40004000 并且不进行初始化(UNINIT)。
(11)-(12 将所有的RW 和ZI 段放入外部存储器中以0x80040000 为开头的地址中。
并且全部清零(+ZI)外部RAM 中指定的区域。
(13)-(14)在RW ZI 段后放入堆底(Startup.o(Heap))并且不进行初始化。
(15)-(16)将堆定放入外部RAM 中(0x80080000)。
(17)-(19)自己添加的加载代码,把main.c 的目标文件加载到片外Flash 中并且占用了0x1000 的大小。
2008.11.25加载时域描述第一个运行时域描述放置向量表将MyStacks 堆栈段装载到片内静态RAM 中。
将栈底放入堆栈的后面(+0)不进行初始化(UNINIT),栈底为Startup 中的StackBottom。
将栈放入地址为0x40004000 并且不进行初始化(UNINIT)。
将所有的RW 和ZI 段放入外部存储器中以0x80040000为开头的地址中。
并且全部清零(+ZI)外部RAM 中指定的区域。
在RW ZI 段后放入堆底(Startup.o(Heap))并且不进行初始化。
自己添加的加载代码,把main.c 的目标文件加载到片外Flash 中并且占用了0x1000 的大小。
将堆定放入外部RAM 中(0x80080000)。
;******************************************************************************************* *************/;** File Name: men_a.scfROM_LOAD 0x80000000 // ROM加载{ROM_EXEC 0x80000000 // ROM执行(起始地址)程序0x80000000 外部存储区{ Startup.o (vectors, +First) // Startup.o文件(向量,程序入口)* (+RO)} // 只读IRAM 0x40000000 // Indexed Random Access Method,索引随机存取方法0x40000000{ Startup.o (MyStacks)} // Startup(堆栈)装载到片内SRAM中STACKS_BOTTOM +0 UNINIT // 堆栈栈底,将栈底放入堆栈的后面(+0),不初始化{ Startup.o (StackBottom)} // 将栈放入地址为0x40004000 并且不进行初始化(UNINIT)STACKS 0x40004000 UNINIT // 堆栈0x40004000 16kb的SRAM片内存储区{ Startup.o (Stacks)} // Startup.o文件(堆栈)ERAM 0x81000000 // 将所有的RW和ZI段放入外部存储器中0x81000000为开头的地址中{ * (+RW,+ZI)} // 并且全部清零(+ZI)外部RAM中指定的区域读写(无输入ZI)HEAP +0 UNINIT // 在RW ZI段后放入堆底(Startup.o(Heap))并且不进行初始化{ Startup.o (Heap)} // Startup.o文件(堆栈)HEAP_BOTTOM 0x81080000 UNINIT // 将堆定放入外部RAM中0x81080000{ Startup.o (HeapTop)} // Startup.o文件(堆栈栈顶)};******************************************************************************************* *************/;** File Name: men_b.scfROM_LOAD 0x80000000{ROM_EXEC 0x80000000{ Startup.o (vectors, +First)* (+RO)}IRAM 0x40000000{ Startup.o (MyStacks)}STACKS_BOTTOM +0 UNINIT{ Startup.o (StackBottom)}STACKS 0x40004000 UNINIT{ Startup.o (Stacks)}ERAM 0x80040000{ * (+RW,+ZI)}HEAP +0 UNINIT{ Startup.o (Heap)}HEAP_BOTTOM 0x80080000 UNINIT{ Startup.o (HeapTop)}};******************************************************************************************* *************/;** File Name: men_c.scfROM_LOAD 0x0{ROM_EXEC 0x00000000{ Startup.o (vectors, +First)* (+RO)}IRAM 0x40000000{ Startup.o (MyStacks)}STACKS_BOTTOM +0 UNINIT{ Startup.o (StackBottom)}STACKS 0x40004000 UNINIT{ Startup.o (Stacks)}ERAM 0x80000000{ * (+RW,+ZI)}HEAP +0 UNINIT{ Startup.o (Heap)}HEAP_BOTTOM 0x80080000 UNINIT{ Startup.o (HeapTop)}};/****************************************************************************************** **************2008.11.25zhongcw1002@加载文件的更多分解说明,网上了解资料。