ARM核的Bootloader代码

发布者:Yuexiang666最新更新时间:2016-08-07 来源: eefocus关键字:ARM核  Bootloader代码 手机看文章 扫描二维码
随时随地手机看文章

一.  Bootloader

      是 ARM系统的开机程序,用汇编语言编写,完成系统的初始化操作.是系统上电复位后,操作系统或用户应用程序运行前,首先必须运行的一段程序.

作用: 1,初始化硬件; 2,建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0).

二. 启动流程

    2种启动方式:

  • 直接从Flash 启动
  • 将压缩的内存映像文件从Flash中复制,解压到RAM,再从RAM启动

       (节省Flash资源,提高速度)

启动流程图:

                  ARM核的Bootloader代码 - xling - Miss Lee,come on!

1. 启动代码的第一步是设置中断和异常向量

2. 完成系统启动所必须的最小配置.

    某些处理器芯片包含一个或几个全局寄存器,这些寄存器必须在系统启动的最初进行配置.

3. 设置看门狗,拥护设置的部分外围电路如果必须在系统启动时初始化,就可以放在这一步.

4. 配置系统所使用的寄存器,包括Flash,SRAM,DRAM等,并为他们分配地址空间.如果系统使用了DRAM或其他外设,就需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息,初始化存储器系统

     有些芯片可通过寄存器编程初始化存储器系统,而对于较复杂系统通常集成有 MMU 来管理内存空间。

5. 为处理器的每个工作模式设置栈指针.
 ARM 处理器有多种工作模式,每种工作模式都需要设置单独的栈空间。 
6. 变量初始化.     

     这里的变量指的是在软件中定义的已经赋好初值的全局变量,启动过程中需要将这部分变量从只读区域,也就是 Flash 拷贝到读写区域中,因为这部分变量的值在软件运行时有可能重新赋值。还有一种变量不需要处理,就是已经赋好初值的静态全局变量,这部分变量在软件运行过程中不会改变,因此可以直接固化在只读的 Flash 或 EEPROM 中。 
 7. 数据区准备

     对于软件中所有未赋初值的全局变量,启动过程中需要将这部分变量所在区域全部清零。 
 8. 调用高级语言函数 .比如 main 函数等。 
三.程序分析

下面根据实际经过测试的代码详细讲述系统的启动过程。 
    .text      /* 将此操作符开始的代码编译到代码段或代码段子段中 */ 

 /* 集成开发环境( IDE )可以通过链接脚本文件将下面的语句定位在零起始地址,系统上电后 CPU 从此处开始执行 */ 
    ENTRY:                                 /*用于指定汇编程序的入口点*/
        b ResetHandler   /* 跳至 ResetHandler ,此句被定位在零起始地址 */ 
/* 除用户模式外的其他 6 种模式称为特权模式。特权操作模式主要处理异常和监控调用(有时称为软件中断),它们可以自由的访问系统资源和改变模式。特权模式中除系统模式以外的 5 种模式又称为异常模式,下面的代码用于出现异常时 CPU 就会根据以下的语句自动跳转到对应的异常处理程序处 */
    b HandlerUndef        /* handlerUndef         */ 
    b HandlerSWI         /* SWI interrupt handler  */ 
    b HandlerPabort       /* handlerPAbort        */ 
    b HandlerDabort       /* handlerDAbort       */ 
    b .                   /* handlerReserved      */ 
    b HandlerIRQ 
    b HandlerFIQ 
... 
... 
ResetHandler:  /* 上电后跳转到此处开始执行 */ 
    LDR    R0,  =WTCON  /* 禁止看门狗 */ 
    LDR    R1,  =0x0 
    STR    R1, [R0] 
    LDR    R0, =INTMSK    /* 屏蔽所有中断请求 */ 
    LDR    R1, =0x07FFFFFF   

    STR    R1,  [R0] 
  /* 设置时钟控制寄存器 */ 
    ldr  r0,=LOCKTIME 
    ldr  r1,=0xfff 
    str  r1,[r0] 
.if PLLONSTART 
 ldr  r0,=PLLCON   /* 设置 PLL */ 
 ldr  r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) /*Fin=8MHz,Fout=64MHz*/ 
 str  r1,[r0] 
.endif 
    ldr     r0,=CLKCON  
    ldr     r1,=0x7ff8      /* 所有单元时钟允许 */ 
    str     r1,[r0] 
/* 为 BDMA 设置复位值 */ 
    ldr     r0,=BDIDES0 
    ldr     r1,=0x40000000     /* BDIDESn 复位值应为 0x40000000 */ 
    str     r1,[r0] 
    ldr     r0,=BDIDES1 
    ldr     r1,=0x40000000     /* BDIDESn 复位值应为 0x40000000 */ 
str     r1,[r0] 
    /* 设置存储器控制寄存器,存储器的配置数据都存储在 SMRDATA 为起始地址的数据表中,下面的代码可以一次将预先配置好的初始化数据存入与存储器控制器相关的 13 个寄存器,这些寄存器则是以 0x01c80000 为起始地址的 13 个连续的 32 位寄存器 */ 
    ldr     r0,=SMRDATA 
    ldmia   r0,{r1-r13} 
    ldr     r0,=0x01c80000    /* BWSCON 存储控制寄存器地址 */ 
    stmia   r0,{r1-r13} 
/* 初始化堆栈 */ 
/* CPU 复位后是处于管理模式下的,所以首先要初始化管理模式下的堆栈寄存器 */ 
    ldr     sp, =SVCStack 
    /* 由于处理器的每种运行模式都要有自己独立的物理堆栈寄存器 R13 ,在用户应用程序的初始化部分,一般都要初始化每种模式下的 R13 ,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入 R13 所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行 */ 
     bl     InitStacks   /* 跳转至其它堆栈初始化程序并返回 */ 
 /* 设置 IRQ 中断处理 */ 
/*44B0 有两种中断模式:一种是没有中断向量表;一种是使用了中断向量表,使用中断向量表只能是 IRQ 方式。当使用中断向量表的时候,中断发生时由 S3C44B0 的中断控制器根据中断向量表,利用硬件方式自动跳转到相应的中断处理服务程序所在的位置;不使用中断向量表时按下面的代码,利用软件方式跳转而进行中断处理,因为 S3C44B0 有 30 个中断源,所以需要程序判断以确定调用那个中断服务程序 */ 
    ldr     r0,=HandleIRQ /* 如果在 0x18 和 0x1c 地址处无 “subs pc,lr,#4”*/ 
    ldr     r1,=IsrIRQ  /* 为了中断正常返回这些语句是必须的 */ 
    str     r1,[r0] 
 /* 拷贝读写区域数据 / 数据区准备,将系统需要读写的数据和变量从 ROM 拷贝到 RAM 里。  Image_RO_Limit 、 Image_RW_Base 、 Image_ZI_Base 等这些符号还会在另外的链接脚本文件中出现,这些符号是用来定位程序各个段的参考信息。集成开发环境在编译链接的时候会根据我们编写的程序,把它们转换成用来对各个段定位的地址信息 */ 
    LDR     r0, =Image_RO_Limit /* 取只读数据区域地址指针 */ 
    LDR     r1, =Image_RW_Base /* 准备执行拷贝操作 */ 
    LDR     r3, =Image_ZI_Base 
     CMP     r0, r1        /* 检查是否相同 */ 
    BEQ     F1         /* 相同则跳过拷贝操作 */ 
F0: 
    CMP     r1, r3    /* 执行拷贝操作 */ 
    LDRCC   r2, [r0], #4 
    STRCC   r2, [r1], #4 
    BCC     F0 
F1: 
    LDR     r1, =Image_ZI_Base /* 零数据准备区起始地址 */ 
    MOV     r2, #0 
F2: 
    CMP     r3, r1       /* 执行数据区清零 */ 
    STRCC   r2, [r3], #4 
    BCC     F2

 MRS r0, CPSR 
 BIC r0, r0, #NOINT     /* 中断请求允许 */ 
 MSR CPSR_cxsf, r0 
/* 跳转到 C 入口程序 */ 
    BL Main 
    B .

四 .  总结: 
    启动过程中的初始化程序就是初始化 CPU 内部各个关键的寄存器、配置外围硬件电路相关寄存器、建立中断向量表等,然后跳转到一般由高级语言编写的主函数的应用程序代码去执行,这样就可以利用高级语言来编写完成系统设计所要求的各种功能。初始化的过程对大多数初学者来说,比较难理解的是中断的处理和一些少见的操作符号,这些符号多是一些宏定义或系统用于在内存空间中对各个段的定位标识符号。掌握了S3C44B0的启动代码之后,对系统功能程序设计会起到很大的帮助,是进行下一步程序设计的基础。


关键字:ARM核  Bootloader代码 引用地址:ARM核的Bootloader代码

上一篇:C语言和ARM汇编混合编程实现阶乘运算
下一篇:Keil C编译器常见警告与错误信息解决方法

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

内嵌ARM的FPGA芯片EPXA10及其在图像驱动和处理方面的应用
随着亚微米技术的发展,FPGA芯片密度不断增加,并以强大的并行计算能力和方便灵活的动态可重构性,被广泛地应用于各个领域。但是在复杂算法的实现上,FPGA却远没有32位RISC处理器灵活方便,所以在设计具有复杂算法和控制逻辑的系统时,往往需要RISC和FPGA结合使用。这样,电路设计的难度也就相应大大增加。随着第四代EDA开发工具的使用,特别是在IP核产业的迅猛发展下产生的SOPC技术的发展,使嵌入RISC的通用及标准的FPGA器件呼之欲出。单片集成的RISC处理器和FPGA大大减小了硬件电路的复杂性和体积,同时也降低了功耗、提高了系统可靠性。Altera公司的EPXA10芯片就是应用SOPC技术,集高密度逻辑(FPGA)、存储器(S
[单片机]
内嵌<font color='red'>ARM</font><font color='red'>核</font>的FPGA芯片EPXA10及其在图像驱动和处理方面的应用
基于ARM的音频解码器单芯片系统
摘 要: 简要介绍Cirrus Logic公司的嵌入式处理器产品EP7209的结构、功能、接口特性等,并给出基于EP7209所能构建的最大系统。对使用EP7209构建嵌入式系统有一定参考价值,也有助于了解ARM核。 关键词: 嵌入式处理器 嵌入式系统 ARM核 引 言    EP7209是世界上第一片既支持流行的MP3标准,也支持诸如Microsoft Audio等快速涌现的互联网音频压缩标准的数字音频解码器片上系统。EP7209在74MHz下运行时其性能与基于100MHz英特尔奔腾芯片的个人计算机相同,且消耗的功率特别小:在2.5V电压下,功耗不足170mW。它的ARM核提供了一个优秀的数字信号处理器所能够提供的处理能力,
[嵌入式]
基于<font color='red'>ARM</font><font color='red'>核</font>的音频解码器单芯片系统
基于ARM的ADμC7O26硬件系统开发及其在医疗仪器中的应用
0 引言   随着人们生活水平的不断提高,人们对于自身健康的关注也提升到一个前所未有的高度。在今天,越来越多的高科技手段开始运用到 医疗仪器 的设计当中。心电图、脑电图等生理参数检测设备,各类型的监护仪器,超声波、X射线成影设备,核磁共振仪器,以及各式各样的物理治疗仪都开始在各地医院广泛使用,并且医学仪器正在向着组合式、多功能、智能化和微型化方向发展。现代的医学仪器一般都广泛采用了嵌入式微处理器来增强仪器的智能化程度,提高其稳定性和数据处理的精确性,使医学信号的采集、处理、通信一体化,并具有自诊断、自校验等一系列优点。其中 ARM (Advanced RISC Machines)嵌入式微型主板作为中央处理模块,凭借自身体积小巧、
[医疗电子]
基于<font color='red'>ARM</font><font color='red'>核</font>的ADμC7O26硬件系统开发及其在医疗仪器中的应用
STM32 F4 从bootloader跳转用户代码遇到的问题
代码跳转后运行用户程序遇到的问题: DMA2_Stream3_IRQHandler DMA2_Stream4_IRQHandler ETH_IRQHandler ETH_WKUP_IRQHandler CAN2_TX_IRQHandler CAN2_RX0_IRQHandler CAN2_RX1_IRQHandler
[单片机]
ARM推4Armada XP参与服务器芯片竞争
全球电子产业复苏,使芯片市场也因电脑和手机的增长而受益;2010年9月份全球芯片销售额达到265亿美元,较去年同期增长26%;半导体产业协会在日前预测今年全球芯片销售额将增长33%至3005亿美元。据11月9日国外消息报道,Marvell半导体本周一公布了一款采用ARM架构的服务器芯片——四核芯片Armada XP,分析师认为,当前的ARM架构芯片的设计会影响其在服务器市场的普及。   据悉,今年以来企业用服务器需求强劲,Marvell当地时间周一公布的四核芯片Armada XP采用ARM架构,使得ARM成为英特尔和AMD在服务器芯片市场上的直接竞争对手。ARM向Marvell、德州仪器、三星和高通等芯片厂商许可处理器设计。
[嵌入式]
ARM920T性能优化之MMU
一.虚存的工作原理 为了使任务有各自的虚拟存储映射,MMU硬件采用地址重定位(address relocation),即在地址访问主存之前,转换由处理器核输出的存储器地址。可认为在介于内核和主存间的MMU中有一个重定位寄存器,这样就能很容易理解这个转换过程。 当处理器核产生一个虚拟地址时,MMU取出这个虚拟地址的高位,并用重定位寄存器中的值来替换它,从而形成一个物理地址。虚拟地址的低位是一个偏移量,它转换成物理存储器的一个特定地址。一个重定位寄存器只能转换一块存储空间,这块存储空间的大小由虚拟地址的偏移量部分所占的位数所决定。这样的一块虚拟存储空间称为一页(page),而转换过程中所对应的那块物理存储空间称为一个页帧(pa
[单片机]
<font color='red'>ARM</font><font color='red'>核</font>920T性能优化之MMU
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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