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启动代码由汇
编语言编写,具有高度灵活性和直接性。
《Cortex-M0权威指南》之体系结构---程序映像和启动流程
《Cortex-M0权威指南》之体系结构---程序映像和启动
流程
我们先来看看程序映像。
通常,Cortex-M0处理器的程序映像时从地址0x00000000处开始的。
程序映像开始处时向量表,其中包含了异常的其实地址(向量),每个中断向量的地址都等于“异常号*4”,比如,外部IRQ0的异常类型为16,因此其向量地址为16*4=0x40。
这些向量的最低位都被置为1,以表示使用thumb指令。
向量表的大小由实际使用的中断个数决定。
向量表中包含了MSP的初始值,它存储在向量表的头四个字节。
复位时,处理器首先读取向量表的前两个字(8个字节),第一个字为MSP的初始值,第二个字为复位向量,它表示程序执行的起始地址。
例如,如果启动代码位于地址0x000000C0,需要在复位向量处写入这个地址,并且将地址的最低位置为1,以表明当前为thumb代码,因此,地址
0x00000004处的值为0x000000C1。
在取得复位向量值后,处理器开始从这个
地址处执行程序代码。
复位流程也会初始化MSP,假设内存位于
0x20000000~0x20007FFF,可以将0x20008000写在地址0x00000000处,这样
就实现了把主栈指针置于内存的顶部。
如果要使用PSP,在配置CONTROL寄存器切换栈指针前,必须首先通
过软件代码将其初始化,因为复位流程只初始化MSP,不初始化PSP。
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
Arm启动流程解析
Arm启动流程解析谈到arm 的启动流程不得不说的是bootloader,但是我这篇文章主要来谈谈arm 启动流程的,所以bootloader 只是跟大家简介一下就ok。
这篇文章我会谈到以下内容:1、bootloader 简介以及其作用2、2440、6410、210 当下比较常见的3 款处理器的启动流程进行简单分析,通过这三款处理器的分析希望大家掌握arm 处理器的启动分析。
Ok 我们进入主题lBootloader 简介及其作用在我看来bootloader 的作用是初始化必要的硬件,引导内核启动。
(当然这是主要作用,今天的重点不在bootloader,所以在我后面的博文会继续谈到的)l 启动流程分析在分析启动流程的时候我们将会使用的文档是三星公司提供的芯片手册,通过手册我们搞清楚芯片的启动。
在分析启动流程之前我们首先要清楚不论是arm 的何种处理器,其都是从0x0 0 地址处开始执行程序的。
下面的分析我将会通过三个方面:1、芯片支持的启动方式2、地址布局3、启动流程1.2440a)启动方式由上图可知,S3C2440 支持两种启动模式:NAND 和非NAND(这里是Nor Flash),具体采用的方式取决于OM0、OM1 两个引脚的状态。
b)地址布局我们知道arm 从0 地址出运行代码那么我们的零地址处到底存放的是什么东西呢?我们通过地址布局图来分析从上图我们可以清楚的看到左边的是从Nor Flash 启动的地址布局,右边是从NAND 启动的地址布局,因为Nor Flash 内可以运行程序,所以我们在放bootloader 的时候放在0 地址处即可,所以我们重点分析从NAND 启动。
c)启动流程我们从地址布局图中可以看到,当我们从NAND 启动的时候0 地址处是BootSRAM(又叫做stepping stone 垫脚石),当我们上电时其会做以下事情1.上电后处理器自动将nandflash 前4KB的内容到boot sram 开始执行(由硬件完成)。
ARM的启动分析详解
7
程序入口
下面是大小端的一个判断, 条件编译, 下面是大小端的一个判断 条件编译,在编译成机器码前 就设定好,在 里已经设为FALSE。 就设定好 在Option.inc里已经设为 里已经设为 。
8
分配中断向量表
ARM 要求中断向量表必须放置在从 要求中断向量表必须放置在从0x00000000 地址开 始,连续32 个字节的空间内。 连续 个字节的空间内。 每当一个中断发生后,即使移植了操作系统如 每当一个中断发生后,即使移植了操作系统如linux ,处理 处理 器还是会跳转到从0x0开始 强制把 指针指向对应中断类型 开始,强制把 器还是会跳转到从 开始 强制把PC指针指向对应中断类型 的向量表中的地址。 的向量表中的地址。 因为每个中断只占据向量表中4 个字节的存储空间, 因为每个中断只占据向量表中 个字节的存储空间,只能 放置一条ARM 指令,所以,通常放一条跳转指令让程序跳 指令,所以, 放置一条 转到存储器的其他地方,再执行中断处理。 转到存储器的其他地方,再执行中断处理。
根据工作频率设置pll : 根据工作频率设置 Fpllo=(m*Fin)/(p*2^s) m=MDIV+8,p=PDIV+2,s=SDIV Fpllo必须大于 必须大于20Mhz小于 小于66Mhz,Fpllo*2^s必须小于 必须小于170Mhz 必须大于 小于 , 必须小于
14
4、初始化PLL和时钟 、初始化 和时钟
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz str r1,[r0] ;Configure UPLL ldr r0,=UPLLCON ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) ;Fin=12MHz,UPLLout=48MHz str r1,[r0] ] 16
ARM启动代码详细讲解
ARM 启动代码详解(Vectors.c、Init.s、Target.c、 Target.h)2010-05-15 16:03启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,主要是为运行C语言程序提供基本运行环境,如初始化存储器系统等。
ARM公司只设计核,不自己生产芯片,只是把核授权给其它厂商,其它厂商购买了授权且加入自己的外设后生产出各具特色的芯片。
这样就促进了基于ARM处理器核的芯片多元化,但也使得每一种芯片的启动代码差别很大,不易编写出统一的启动代码。
ADS (针对ARM处理器核的C语言编译器)的策略是不提供完整的启动代码,启动代码不足部分或者由厂商提供,或者自己编写。
启动代码划分为4个文件:Vectors.c、Init.s、Target.c、 Target.h。
Vectors.c包含异常向量表、堆栈初始化及中断服务程序与C程序的接口。
Init.s包含统初始化代码,并跳转到ADS提供的初始化代码。
Target.c和 Target.h包含目标板特殊的代码,包括异常处理程序和目标板初始化程序。
这样做的目的是为了尽量减少汇编代码,同时把不需要修改的代码独立出来以减少错误。
§4.2.1 Vectors.c文件的编写§4.2.1.1 中断向量表VectorsLDR PC, ResetAddrLDR PC, UndefinedAddrLDR PC, SWI_AddrLDR PC, PrefetchAddrLDR PC, DataAbortAddrDCD 0xb9205f80LDR PC, [PC, #-0xff0]LDR PC, FIQ_AddrResetAddr DCD ResetUndefinedAddr DCD UndefinedSWI_Addr DCD SoftwareInterruptPrefetchAddr DCD PrefetchAbortDataAbortAddr DCD DataAbortnouse DCD 0IRQ_Addr DCD IRQ_HandlerFIQ_Addr DCD FIQ_Handler异常是由部或外部源产生的以引起处理器处理的一个事件。
arm单片机启动流程
arm单片机启动流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!ARM单片机的启动流程详解ARM单片机,作为一种广泛应用的嵌入式处理器,其启动流程对于理解和调试系统至关重要。
ARM开发流程最小系统启动文件详解
ARM开发流程最小系统启动文件详解ARM(Advanced RISC Machine)是一种基于RISC架构的微处理器设计架构。
在嵌入式系统和移动设备领域,ARM处理器广泛应用。
ARM开发流程包括硬件设计、软件开发和调试等几个核心环节。
最小系统是指能够正常运行ARM处理器的最基本硬件系统,而启动文件则是在最小系统上运行的软件代码。
1.硬件设计:硬件设计是指根据具体应用需求设计ARM处理器系统的硬件部分。
这包括选择合适的ARM处理器芯片、外设及接口设计、电源设计、信号调试等。
2.软件开发:软件开发是针对ARM处理器所设计的硬件系统进行软件编程开发。
这包括选择适当的开发工具和编程语言,编写底层驱动程序、操作系统代码及应用程序等。
3.调试:调试是指在开发过程中解决问题和验证系统功能的过程。
这包括硬件调试和软件调试两个方面,通过使用调试工具和技术来检查和修复问题。
最小系统最小系统是指能够运行ARM处理器的最基本硬件系统。
它通常包括以下组成部分:1.ARM处理器:最小系统中的核心部件是ARM处理器,它是整个系统的中央处理单元。
2. 存储器:最小系统中需要包含足够容量的存储器,包括内部存储器(SRAM、ROM)和外部存储器(SDRAM、Flash),用于存储程序和数据。
3.外设接口:最小系统通常需要接入外部设备,如显示屏、键盘、鼠标等。
这需要通过各种接口,如UART、USB、I2C等实现。
4.时钟:最小系统需要提供时钟信号,用于ARM处理器的运行和各个设备的同步。
5.电源:最小系统需要提供合适的电源,以支持ARM处理器和其他设备的正常工作。
启动文件启动文件是在最小系统上运行的软件代码,用于初始化硬件、加载操作系统和应用程序。
它通常包括以下主要功能:1.硬件初始化:启动文件负责初始化最小系统中的各个硬件设备,例如设置时钟频率、初始化存储器、初始化外设等。
2.加载操作系统:启动文件负责将操作系统从存储器中加载到内存中,并进行必要的初始化配置,为后续的应用程序执行做准备。
M0启动代码详解全
; External Interrupts
; maximum of 32 External Interrupts are possible
DCD BOD_IRQHandler
DCD Default_Handler
DCD I2C_IRQHandler
DCD Default_Handler
DCD Default_Handler
;而是在MAIN中初始化,将会导致编译器因找不到这一程序而报错
;解决的办法是注解这一行,或加上 [WEAK]
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
__heap_base
Heap_Mem SPACE Heap_Size ;分配0x00个连续字节,并初始化为0
__heap_limit
PRESERVE8 ; 指定当前文件堆栈8字节对齐
THUMB ; 告诉汇编器下面是32为的Thumb指令,如果需要汇编器将插入位以保证对齐
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD UART1_IRQHandler
DCD SPI0_IRQHandler
DCD SPI1_IRQHandler
DCD Default_Handler
;/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
;/* 优尔顺电子 整理:马万宏 */
; [WEAK] 选项表示当所有的源文件都没有 定义这样一个标号时,
ARM启动流程
系统初始化流程如下:禁止看门狗——》在中断控制器中屏蔽所有中断——》系统时钟设置——》初始化端口——》DMA设置——》cashe和总线设置——》存储器设置,初始化S DRAM——》初始化堆栈——》设置IRQ和FIQ的入口——》地址重映射通常系统初始化有两个阶段组成,分别为汇编和C写成。
汇编应尽量简单一些,把更多的任务交给C来做,这样可增加整个程序的可读性和灵活性。
必须由汇编来完成的任务有:异常中断向量表的设置、IRQ向量表(向量模式)或I SR初始化(非向量模式)、二级ISR地址表的定义、Flash和SDRAM的设置(否则系统无法加载代码)、堆栈设置和模式切换、拷贝RW和ZI代码、设置系统时钟等。
而端口初始化、cashe和总线的设置、DMA配置以及其它控制器如LC D、UART、SIO、IP等可以在C中第二阶段初始化程序完成,另外也可以继续更改时钟或存储器配置等。
下面是几个关键步骤配置的注意事项。
看门狗设置watch dog即可以作为普通的timer以产生周期性的中断,也可以周期性的产生reset信号(如果每隔一定时间不被清除的话),以防治程序跑飞。
系统时钟的初始化:至少设置三个寄存器:LOCKTIME,PLLCON,LOCKCON。
LOCKTIME,地址0x01D8000C。
用于指定PLL的初始化时间,在PLL初始化时,系统时钟为晶振输入或外部时钟直接提供,即MCLK=Fin;初始化完成后,切换,MCLK=Fout。
初始值为0xfff=4095个输入时钟周期。
一般将其设为初始值。
PLLCON,,地址0x01D80000。
设置MDIV,PDIV,SDIV三个值,用于确定Fo ut和Fin的频率分配比值:Fout = (m * Fin) / (p * 2s),其中m = (MDIV + 8), p = (PDIV + 2), s = SDIV典型的几个值如下:No.FinFoutMDIVPDIVSDIV110Mhz40Mhz0x480x30x2210500x2a0x30x1310600x340x30x144600x340x00x153600x480x00x1610750x3a0x30x1CLKCON,地址0x01D80004。
- 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@加载文件的更多分解说明,网上了解资料。