ARM芯片的启动程序的分析

转载 2014年03月04日 18:20:40
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,这样才能保证处理器有正确可用的指令。为了加快对中断的处理以及实现在不同操作系统模式下对中断的处理,这就需要重新映射中断向量表、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开发的读者理解启动代码的内涵与编写出适合自己的启动代码。

一颗ARM架构芯片的软硬件构成

硬件和软件是一颗芯片系统互相依存的两大部分,本文总结了一颗芯片的软硬件组成,作为对芯片的入门级概括吧。...
  • suipingsp
  • suipingsp
  • 2014年06月27日 16:53
  • 3496

ARM上电启动及Uboot代码分析

网上关于ARM的bootloader(以Uboot为例)的启动顺序的资料有好多,但是对于Uboot的地址映射、体系结构级操作介绍很少,都是直接开始Start.s代码的阅读。本文拟详细分析Uboot从上...
  • qianlong4526888
  • qianlong4526888
  • 2014年05月30日 17:30
  • 11740

阅读ARm芯片手册 阅读方法

一 overview 1 table of contents -*** 2 product overview -***  芯片概述 3 feature  ***    每一个功能的特点 ...
  • yuyin86
  • yuyin86
  • 2014年03月10日 23:54
  • 901

关于ARM启动流程的分析(NandFlash Or NorFlash)

学习了S3C2440的启动流程,如何让bootLoader成功加载。并且找到了一篇讲的非常好的博客,试着结合着自己的理解总结一下,以备以后的复习。 第一部分关于内部的SRAM: 部...
  • qq_19670785
  • qq_19670785
  • 2015年09月28日 21:53
  • 1249

ARM启动代码原理和分析

内容大纲 内容关键字: 映像文件 RO代码段 ZI未初始化数据段 RW数据段 Load Address加载地址 Execu o n A ddress 执行地址 Stack Pointer栈空间指针...
  • changyourmind
  • changyourmind
  • 2016年07月10日 17:10
  • 250

技术帝,教你认识海思芯片及ARM芯片技术科普

http://t.cn/zTM2UPo 文章转自手机吧,不是本人写的,但是要感谢这位来自海思的技术帝,我最多做个传播者哈,勿喷~PS:文章很长,我是直接复制过来的呢(华为Ascend吧里的兄弟找到的,...
  • vichie2008
  • vichie2008
  • 2014年03月08日 00:14
  • 3832

DS-5教程-ARM DS-5 添加新芯片至DS-5调试设备列表

设备 1、PC机 x 1台 2、DS-5软件开发工具 x 1套 3、DSTREAM仿真器 x 1套 4、ARM内核开发板(本文以米尔MYD-LPC4357开发板为例) x 1套 ...
  • yandaqijian
  • yandaqijian
  • 2015年11月02日 10:32
  • 832

ARM第一部分-S5PV210启动过程详解1

内存: SRAM          静态内存          特点就是容量小、价格高,优点是不需要软件初始化直接上电就能用 DRAM          动态内存          特点是...
  • Karven_
  • Karven_
  • 2016年03月12日 11:41
  • 568

ARM底层学习笔记-裸板实验程序解析-点亮LED

通过简单的裸板实验程序的书写,分析和学习嵌入式开发底层操作,以深入理解嵌入式系统及其开发...
  • eric41050808
  • eric41050808
  • 2013年12月15日 19:07
  • 3320

arm9启动方式分析

arm9启动方式分析
  • fengjunwang1980
  • fengjunwang1980
  • 2016年06月23日 20:36
  • 1334
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM芯片的启动程序的分析
举报原因:
原因补充:

(最多只允许输入30个字)