ARM7启动代码编写的分析与设计

发布者:陈熙琼最新更新时间:2018-02-14 来源: eefocus关键字:ARM7  启动代码 手机看文章 扫描二维码
随时随地手机看文章

    前 言

    随着生活水平的提高和IT技术的进步,8位处理器的处理能力已经不能满足嵌入式系统的需要了;而16位处理器在性能和成本上都没有很大的突破。并且在8位机的开发中,大多使用汇编语言来编写用户程序。这使得程序的可维护性、易移植性等都受到了极大的挑战。正是基于此,ARM公司适时的推出了一系列的32位嵌入式微控制器。目前广泛使用的是ARM7和ARM9系列,ARM7TDMI内核的ARM7处理器广泛应用于工业控制、仪器仪表、汽车电子、通讯、消费电子等嵌入式设备。本文主要以philips公司ARM7TDMI核的LPC2119为例来分析如何编写ARM7的启动代码。

 

    1、启动代码

    在嵌入式系统软件的开发中,应用程序通常是在嵌入式操作系统的开发平台上采用C语言编写的。然而,在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率等,而这些过程都是针对ARM内部寄存器结构的操作,用C语言编程是很难实现的。因此在转到应用程序的c/c++编写之前,需要用ARM的汇编语言编写启动代码,由启动代码完成系统初始化以及跳转到用户C程序。在ARM设计开发中,启动代码的编写是一个极重要的过程。然而启动代码随具体的目标系统和开发系统有所区别,但通常包含以下部分:

    ·向量表定义

    ·地址重映射及中断向量表的转移

    ·堆栈初始化

    ·设置系统时钟频率

    ·中断寄存器的初始化

    ·进入C应用程序

    下面就结合PHILIPS的LPC2119的启动代码来分析与说明ARM7处理器的启动代码的编写。

    1.1向量表定义

    ARM芯片上电或复位后,系统进入管理模式、ARM状态、PC(R15)指向0x00000000地址处。中断向量表为每一个中断设置1个字的存储空间,存放一条跳转指令,通过这条指令使PC指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。LPC2219的中断向量表和其它基于ARM核的芯片中断向量表较类似,只要注意LPC2219要使向量表所有数据32位累加和为零(0x00000000-0x0000001C的8个字的机器码累加), 才能使用户的程序脱机运行。

    1.2 地址重映射及中断向量表的转移

    ARM7处理器在复位后从地址0读取第一条指令并执行,因此系统上电后地址0必须是非易失的ROM/FLASH,这样才能保证处理器有正确可用的指令。为了加快对中断的处理以及实现在不同操作系统模式下对中断的处理,这就需要重新映射中断向量表、BootbLOCk和SRAM空间的一小部分。ARM具有非常灵活的存储器地址分配特性。ARM处理器的地址重映射机制有两种情况:

    ①由专门的寄存器完成重映射(Remap),只需对相应的Remap寄存器相应位设置即可。

    ②没有专门的Remap控制寄存器需要重新改写用于控制存储器起始地址的块(Bank)寄存器来实现Remap。在LPC2119上的重映射,可以通过存储器映射控制器来实现。实现REMAP操作的程序实现如下:

    MOV R8,#0x40000000; /设置新向量表起始地址/

    LDR R9,=Interrupt_Vector_Table; /读原向量表源地址/

    LDMIA R9!,(R0-R7); /复制中断向量表及中断处理程序的入口地址到RAM中(64字节)/

    STMIA R8!,(R0-R7)

    LDMIA R9!,(R0-R7)

    STMIA R8!,(R0-R7)

    LDR R8,=MEMMAP ; /REMMAP操作/

    MOV R9,#0x02

    STR R9, [R8]

    1.3 堆栈初始化

    启动代码中各模式堆栈空间的设置是为中断处理和程序跳转时服务的。当系统响应中断或程序跳转时,需要将当前处理器的状态和部分重要参数保存在一段存储空间中,所以对每个模式都要进行堆栈初始化工作,给每个模式的SP定义一个堆栈基地址和堆栈的容量。堆栈的初始化有两种方法:第一种方法是结合ADS开发套件中的分散加载文件来定义堆栈。第二种方法是最简单也是最常用的一种就是直接进入对应的处理器模式,为SP寄存器指定相应的值。下面给出了用第二种方法初始化管理模式和中断模式堆栈的程序:

    MSR CPSR_c, #0xD3 ; /切换到管理模式,并初始化管理模式的堆栈/

    LDR SP, Stack_Svc

    MSR CPSR_c, #0xD2 ; /切换到IRQ模式,并初始化IRQ模式的堆栈/

    LDR SP, Stack_Irq

    …

    1.4 系统部分时钟初始化

    时钟是芯片各部分正常工作的基础,应该在进入main()函数前设置。部分ARM7片子内部集成有PLL(锁相环)电路,用户可以用低频率的晶振通过PLL电路获得一个较高频率的时钟。LPC2119内部的PLL电路接受的输入时钟频率范围为10~25MHz,输入频率通过一个电流控制振荡器(CCO)倍增到范围10~60MHz。同时为了使高速的ARM处理器与低速的外设正常通讯和降低功耗(降低外设运行速度使功耗降低),LPC2119又集成了一个额外的分频器。PLL的激活是由PLLCON寄存器控制。PLL倍频器和分频器的值由PLLCFG寄存器控制。对PLLCON或PLLCFG寄存器的更改必须遵循严格的顺序,否则所作更改是无法生效的(在连续的VPB周期内向PLLFEED寄存器写入0xAA、0x55,在此期间中断必须是被禁止的。)

    1.5 中断初始化

    ARM7的向量中断控制器(Vectored Interrupt Controller)可以将中断编程为3类:FIQ、向量IRQ、非向量IRQ。FIQ中断请求的优先级最高,其次是IRQ中断请求,非向量IRQ的优先级最低。VIC具有32个中断请求输入,但在LPC2219中只占用了17个中断输入。对于这17个中断源的IRQ/FIQ选择,由VICIntSelect寄存器控制,当对应位设置位1时,则此中断为FIQ中断,否则为IRQ中断。若再将IRQ中断设置到向量控制寄存器(VICVectCntIn)中,则此中断为向量IRQ中断,否则为非向量IRQ中断。FIQ中断是专门用来处理那些需要及时响应的特殊事件,尽可能地只给FIQ分配一个中断源。

    1.6 进入C应用程序

    至此,系统各部分的初始化基本完成,可以直接从启动代码转入到应用程序的main()函数入口。从启动代码转入到应用程序的实例代码如下:

    IMPORT main

    LDR R0,=main

    BX R0

    2、总结

    一个优秀的启动代码将给应用程序的开发提供一个良好的开发平台。本文中较详细的讨论了启动代码的编写及难点。其中在堆栈初始化过程中要特别的注意两点:

    ①要尽量给堆栈分配快速和高带宽的存储器。

    ②尽量避免过早将处理器切换到用户模式,一般在系统初始化的最后阶段才切换到用户模式(用户模式没有权限通过修改CPSR来进行模式切换)。

    嵌入式系统的迅猛发展,使启动代码的编写成为嵌入式系统开发人员应该具备的能力。本文有助于正在从事嵌入式ARM开发的读者理解启动代码的内涵与编写出适合自己的启动代码。


关键字:ARM7  启动代码 引用地址:ARM7启动代码编写的分析与设计

上一篇:μCOS-II 中USB 主机系统的设计
下一篇:基于嵌入式及无线通讯技术设计的远程无线供水测控系统

推荐阅读最新更新时间:2024-03-16 15:55

ARM7(LPC2xxx)芯片的小总结
7种工作模式: fiq/irq/abt/und/sys/usr/svc。通过 MSR cpsr_c,#0xdx 切换。上电时进入svc模式。 svc和usr的区别是:svc可以通过 MSR cpsr_c,#0xdx 自由切换到其它任何模式,但是usr不可以。 各模式下有自己的堆栈。要在程序启动后依次进入各个模式分别设置自己的堆栈,最后进入usr模式。 Prefetch Abort和Data Abort模式: Prefetch Abort通常会发生在自修改指令之后。而Data Abort发生于向无效内存中取操作数时,通常是数据指针越过边界了。如果在scatter文件中不指定边界,若编译时内存分配超过了实际物理内存,一定会
[单片机]
ARM7内核的中断屏蔽方法
引言 CPU在执行程序的过程中,由于外部的某种原因,有必要尽快地中止当前程序的执行,而去执行相应的处理程序,待处理结束后再回来继续执行被中止了的原程序,这种情况称为“中断”。从事嵌入式开发的工程师对中断的概念都很熟悉,在x86系列CPU体系中,软件设计人员会调用enable()函数和disable()函数来允许或屏蔽中断。enable()和disable()是两个库函数,函数disable()的作用是屏蔽中断,它唯一允许执行的中断是NMI(不可屏蔽中断);函数enable()的作用与函数disable()相反,是将被屏蔽的中断打开,允许中断。这两个函数的原型都是在头文件DOS.H中定义的,DOS.H定义的都是一些DOS接口函数
[工业控制]
<font color='red'>ARM7</font>内核的中断屏蔽方法
解读ARM7内核微控制器LPC2148以太网接口电路
  嵌入式主控模块采用了基于ARM7TDMI-S内核的微控制器LPC2148,集成度非常高。内嵌40kB的片内静态RAM和512kB的片内 Flash存储器,片内集成ADC、DAC转换器,看门狗,实时时钟RTC,2个UART,2个I2C还有SPI等多个总线接口,及USB2.0全速接口。方便扩展USB接口、JTAG调试接口、触摸屏,外扩芯片少,而且采用超小的LQFP64封装,使得仪器的微型化得到了保证。而且电路相对简单,降低了开发和生产的成本。芯片可以实现最高60MHz的工作频率,有着较强的功能,能够满足嵌入式系统μC/OS—II及人性化的人机界面的要求。本设计中 LPC2148所有的接口都有使用。   以太网接口部分采用了具有
[单片机]
解读<font color='red'>ARM7</font>内核微控制器LPC2148以太网接口电路
ARM9学习4-S3C2410的启动代码分析-For ADSv1.2
通常,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码.这是由于C语言程序的运行需要具备一定的条件,比如:分配好外部数据空闿堆栈空间和中断入口等筿另外汇编代码可以更直接的对硬件进行操使效率更高. 通常启动代码是放在2410init.s汇编文件;特殊功能寄存器定义在2410addr.s;Memory Bank 配置在mencfg.s;还有系统的选项等在option.s文件;2410init.s不仅包括复位后执行的代码,还包括CPU进入掉电模式,产生中断等和处理器直接相关的,用汇编实现的代码. ;========================================= ; NAME: 2410IN
[单片机]
基于ARM7芯片S3C44BOX的嵌入式定量分析系统
煤矸石是采煤和洗煤过程中排放的固体废物,是一种在成煤过程中与煤层伴生的黑灰色岩石。全国现有矸石山1500余座,堆积量30亿吨以上,占中国工业固体废物排放总量的40%以上。煤矸石的大量堆放,不仅占用土地资源,而且造成环境污染。用洗中煤和矸石混烧发电,是解决污染的有效途径。2009年,煤矸石综合利用量3.9亿吨以上,利用率达到70%以上。如何快速、精确地定量分析混合燃料中煤与矸石的搭配比例,就成为监管部门及企业需要解决的问题。为解决上述问题,本文基于ARM7芯片S3C44BOX,设计了一个集数据采集、处理、显示为一体的嵌入式定量分析系统,并可以通网络将数据传送到远程PC。 1 系统原理及总体方案设计 1.1 系统原理 Γ射线,它与物
[单片机]
基于<font color='red'>ARM7</font>芯片S3C44BOX的嵌入式定量分析系统
基于LPC2214和μC/OS-II的家庭智能终端的设计与实现
智能家居是指利用先进的计算机技术、网络通信技术、综合布线技术,将与家居生活有关的名种子系统有机地结合,通过统筹管理,使家居生活更加舒适、安全、有效。作为小区智能化的重要组成部分,智能家居平台是通过其核心——家庭智能终端实现家居智能化。智能家居终端可实现系统信息的采集、信息输入、逻辑处理、信息输出、联动控制等功能。早期的家庭智能终端网络是基于电话网实现远程监控和远程控制。由于电话网络的带宽限制以及较高的使用成本,使得家庭智能终端无法推广。随着计算机技术和通信技术的发展,基于IP技术的远程通信已经成为家庭智能终端开发的重点。目前,基于8位单片机和TCP/IP协议的远程通信设备已大量出现。但是由于8位单片机工作频率和存储量的限制
[单片机]
基于LPC2214和μC/OS-II的家庭智能终端的设计与实现
基于S3C44B0XARM7处理器的嵌入式统扩展USB接口的技术方案
  常用的主机与嵌入式外设的高速通信接口有LPT 并行口、USB、1394 及10/100M 以太网等接口。RS232 不适合高速数据传送,1394 接口需要专门的适配器接口成本过高,一般较少使用,USB 接口被广泛用于高、中、低不同速度设备与主机通信,USB2.0 的最高速度可达480Mb/s, 可传送高清晰数字视频码流,完全可以替代1394 接口,USB 与以太网接口相比,采用主从结构,有即插即用特性,驱动程序丰富,互操作性好等优点。   USB(Universal Serial Bus,通用串行总线)接口是1994 年Intel、Microsoft 等多家公司联合推出的计算机外设互连总线协议。USB 接口支持1.5Mb/
[单片机]
基于S3C44B0XARM7处理器的嵌入式统扩展USB接口的技术方案
STM32启动代码分析问题
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢! 我现在看反汇编如下 0x08000000 0678 LSLS r0,r7,#25 (查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故) 0x08000002 2000 MOVS r0,#0x00 0x08000004 1105 ASRS r5,r0,#408 0x08000006 0800 LSRS r0,r0,#00A 。。。。。。。。。。。。。。。。。。。。。。 上面应该对应 __Vectors DCD __initial_sp ; To
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved