ARM启动代码设计及中断的处理.ppt_第1页
ARM启动代码设计及中断的处理.ppt_第2页
ARM启动代码设计及中断的处理.ppt_第3页
ARM启动代码设计及中断的处理.ppt_第4页
ARM启动代码设计及中断的处理.ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM启动代码设计及中断的处理 第5章ARM启动代码 设计及中断的处理 ARM启动代码设计及中断的处理 内 容 5.1 嵌入式软件开发 5.2 启动代码分析 5.3 BootLoader分析 5.4 ARM中断处理 ARM启动代码设计及中断的处理 5.1 嵌入式软件开发 无操作系统的软件开 发 v启动代码 v应用程序 基于操作系统的软件 开发 vbootloader v操作系统移植 vBSP板级支持包 v应用程序开发 ARM启动代码设计及中断的处理 启动代码 功能 v硬件初始化 v引导C代码 特征 v通常用汇编语言编写 v程序复位运行入口点 v代码量非常小 程序流程 v设置中断、异常入口 v关中断 v硬件寄存器初始化( GPIO配置、总线配置 、PLL时钟) v初始化栈指针 v数据区初始化 vC入口函数调用 BL Main ARM启动代码设计及中断的处理 应用程序(无操作系统) 功能 v硬件驱动 v应用 特征 v通常用C语言或者嵌入 式汇编语言编写 v程序较复杂,代码量 较大 ARM启动代码设计及中断的处理 bootloader 功能 v硬件初始化 v引导操作系统 v下载程序(串口、网口 、USB) v烧写flash 特征 v程序复位运行入口点 v通常用汇编语言+C语言 编写 v代码量较小 ARM启动代码设计及中断的处理 嵌入式操作系统移植 Linux Windows CE uC/OS II uClinux Nucleus ARM启动代码设计及中断的处理 BSP板级支持包 功能 v为应用程序提供统一的 硬件操作接口 特征 v高度硬件相关 v高度依赖于具体硬件平 台 v各种操作系统各异 ARM启动代码设计及中断的处理 应用程序开发(操作系统) 功能 vGUI图形、人机交互 v控制 v算法 特征 v硬件依赖程度小 v部分可仿真调试 v各种操作系统各异 ARM启动代码设计及中断的处理 嵌入式软件设计和调试流程 编辑 v创建工程 v添加文件、编写程序 v汇编语言加C语言 编译 v配置编译、汇编和连 接参数 v编写连接脚本文件 v编译 调试 v连接调试器 v下载程序 v运行、调试 固化 v通过仿真器烧写flash v专用或通用的编程器 v通过bootloader烧写 flash ARM启动代码设计及中断的处理 交叉编译 GNU交叉编译 v编译.c arm-elf-gcc v汇编.S arm-elf-gas v连接.o arm-elf-ld 操作文件 v汇编文件.S vC文件.c v链接脚本文件ldscript v库文件.o .lib .a 生成调试格式文件.elf vDWARF-1 vDWARF-2 生成bin文件 velf2bin varm-elf-objcopy ARM启动代码设计及中断的处理 ARM代码结构 ARM程序编译后得到的二进制代码通常包含: v代码段(text段或code段):编译后的代码,只读 v读写数据段(data段):可读写的全局变量,读写 v只读数据段(rodata段):只读数据,如const类型 的全局变量 vBSS段:需要清0的数据 这些段在链接(link)过程中产生,并且在链 接过程中都应该设置各段的起始地址。程序必 须从代码段指定的起始位置处运行。 根据代码段运行所在地址的硬件介质不同可以 将程序分为在RAM运行的程序和在ROM运行 的程序。 ARM启动代码设计及中断的处理 链接脚本 段 vText段 vrodata段 vdata段 vbss段 符号 vImage_RO_Limit vImage_RW_Base vImage_ZI_Base vImage_ZI_Limit GCC库专用 调试信息 ARM启动代码设计及中断的处理 链接脚本示例 程序在SDRAM中运行程序在FLASH中运行 ARM启动代码设计及中断的处理 在RAM运行程序结构图 ARM启动代码设计及中断的处理 在ROM运行程序结构图 ARM启动代码设计及中断的处理 GCC库 q GCC库 标准C函数库lib.a -lc 标准数学函数库libm.a -lm 标准函数库的支持库libg.a -lg GCC的支持库libgcc.a -lgcc q 链接排列顺序 -lm lc lgcc -lg ARM启动代码设计及中断的处理 5.2 启动代码 由于ARM软件编程一般采用高级语言,如C语 言,因此在系统启动后必须有一段程序能够将 CPU带入到能够运行C语言的状态,这段程序 就是启动代码。 启动代码通常用汇编语言完成,并在系统复位 入口点(ARM系统中为0地址)运行。 在嵌入式系统中系统复位入口点所在的硬件通 常是Flash等芯片,存储在这些芯片中的数据即 使掉电也能够保存,而且这个地方的硬件的访 问宽度是由硬件设计决定,软件不能更改,这 样就能保证上电后该地址的数据有效。 ARM启动代码设计及中断的处理 启动代码主要功能(1) 1、建立异常向量表 2、初始化硬件:初始化RAM、关闭中 断、关闭看门狗等 3、初始化堆栈 4、初始化读写数据段、BSS段: v在ROM中运行的程序必须将数据段从ROM 中拷贝到RAM中,并将BSS段清零; v在RAM中运行的程序则需要将BSS段清零 ,然后将整个代码段、只读数据段、读写数 据段和BSS段从ROM拷贝到RAM。 ARM启动代码设计及中断的处理 启动代码主要功能(2) 5、重定向 v位置无关的代码是指该代码不用在编译指定的地址 运行也能保证程序的执行流程和执行逻辑不会改变 。 v位置相关代码运行的地址必须和编译时的地址一致 ,否则将导致程序运行流程改变。 v在初始化程序区、数据区之后需要一条跳转指令将 PC跳转到编译时指定的运行地址接着运行。LDR指 令及之前的指令都在ROM中运行,而startram标号 之后的代码则跳转到编译时指定的地址(RAM或者 ROM中)中运行了,因为startram标号表示的地址 是由编译时就确定的。这个过程就是重定向。 LDRPC, = startram startram : 重定向之前运行的代码必须是位置无关的代码。 ARM启动代码设计及中断的处理 启动代码主要功能(3) 6、跳转到C代码 LDRPC,=Main ARM启动代码设计及中断的处理 5.2 启动代码分析 在基于ARM920T core的嵌入式系统中,系统 在上电或复位时都从地址0x00000000开始执行 ,因此在这个地址处安排的通常就是系统的启 动代码。 它通常也是BootLoader程序的一部分,可以在 启动代码基础上编写BootLoader。 用汇编语言编写。 启动代码是在复位后运行其它程序之前运行的 一段小程序。通过它,初始化硬件设备、建立 内存空间的映射图,从而将系统的软硬件环境 带到一个合适的状态,以便为最终调用C函数 准备好正确的环境。 ARM启动代码设计及中断的处理 启动代码的移植和修改 启动代码除了依赖于 CPU 的体系结构外,实 际上也依赖于具体的嵌入式板级设备的配置, 比如板卡的硬件地址分配,RAM芯片的类型 ,其他外设的类型等。 对于两块不同的嵌入式板而言,即使它们是基 于同一种 CPU而构建的,如果他们的硬件资源 和配置不一致的话,要想让运行在一块板子上 的启动代码也能运行在另一块板子上,也还是 需要作一些必要的修改。 ARM启动代码设计及中断的处理 启动代码流程图 启动代码的功能:RAM 初始化,设置各个部件的 时钟和片选,将 BootLoader拷贝到RAM 中,设置堆栈,调用C函 数。 注意:在本阶段,特别是 在堆栈设置之前,进行函 数调用(也有些汇编子程 序不需要使用堆栈)或者 使用堆栈保存数据将产生 不可预知的结果; ARM启动代码设计及中断的处理 设置异常跳转表 复位异常直接跳转到ResetHandler处,它是相对 跳转,位置无关。 ARM启动代码设计及中断的处理 关闭看门狗 设置S3C2410 WTCON寄存器 必须设置 0x01e000000x01d30000 ARM启动代码设计及中断的处理 设置中断模式并禁止中断 设置S3C2410中断寄存器 设置所有一级中断源与二级中断源为不可用状态 ARM启动代码设计及中断的处理 配置存储器控制寄存器宽度 0x01e00000配置值 ARM启动代码设计及中断的处理 堆栈初始化 ARM启动代码设计及中断的处理 C代码初始化 拷贝RW数据段 ZI段清零 跳转到Main函 数处执行 ARM启动代码设计及中断的处理 5.3 BOOTLOADER分析 BootLoader是在启动代码的基础之上,通常启 动代码包含于BootLoader之中 BootLoader常用于引导操作系统或者应用程序 BootLoader可以包含一些简单的调试手段 JXARM9-2410使用通用的u-boot ARM启动代码设计及中断的处理 u-boot简介 u-boot是由德国DENX小组开发的交叉平台 BootLoader,其全称为“universal Boot Loader”。 u-boot的开发目标是支持尽可能多的嵌入式处理器和 嵌入式操作系统。它提供数百种嵌入式开发板和各种 CPU,包括PowerPC、ARM、Xscale、MIPS、 Coldfire、NIOS、Microblaze和x86等,同时它除了支 持Linux系统的引导外,还支持NetBSD、VxWorks、 QNX、RTEMS、ARTOS、LynxOS等多种嵌入式操 作系统的引导。 ARM启动代码设计及中断的处理 u-boot简介 u-boot的用户接口类似于Linux的shell界面,通过串口 连接以后,用户可以交互式的输入命令和看到结果,u -boot的启动界面如下所示: U-Boot 1.1.1 (Sep 6 2004 - 12:12:06) U-Boot code: 33F80000 - 33F9CED0 BSS: - 33FA116C RAM Configuration: Bank #0: 30000000 64 MB Flash: 32 MB In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 JX2410 # ARM启动代码设计及中断的处理 BootLoader的基本概念 BootLoader是系统加电后运行的第一段软件代码。 嵌入式系统中,整个系统的加载启动任务完全由 BootLoader来完成。比如在一个基于ARM920T core的 嵌入式系统中,系统在上电或复位时都从地址 0x00000000开始执行,而在这个地址处安排的通常就是 系统的BootLoader程序。 简单地说,BootLoader就是在操作系统内核或用户应用 程序运行之前运行的一段小程序。通过这段小程序,我 们可以初始化硬件设备、建立内存空间的映射图,从而 将系统的软硬件环境带到一个合适的状态,以便为最终 调用操作系统内核或用户应用程序准备好正确的环境。 通常,BootLoader 是依赖于硬件而实现的,特别是在嵌 入式领域,为嵌入式系统建立一个通用的 BootLoader 是很困难的。 ARM启动代码设计及中断的处理 BootLoader 的移植和修改 BootLoader除了依赖于 CPU 的体系结构外, BootLoader 实际上也依赖于具体的嵌入式板级设 备的配置,比如板卡的硬件地址分配,RAM芯片 的类型,其他外设的类型等。 对于两块不同的嵌入式板而言,即使它们是基于 同一种 CPU而构建的,如果他们的硬件资源和配 置不一致的话,要想让运行在一块板子上的 BootLoader程序也能运行在另一块板子上,也还 是需要作一些必要的修改。 ARM启动代码设计及中断的处理 BootLoader 的安装 系统加电或复位后,所有的CPU通常都从CPU制造 商预先安排的地址上取指令。比如,S3C2410在复 位时都从地址 0x00000000 取它的第一条指令。 嵌入式系统通常都有某种类型的固态存储设备(比 如:ROM、EEPROM或FLASH等)被安排这个起 始地址上,因此在系统加电后,CPU将首先执行 BootLoader程序。 也就是说对于基于S3C2410的这套系统,我们的 BootLoader是从0地址开始存放的,而这块起始地 址需要采用可引导的固态存储设备如FLASH。 ARM启动代码设计及中断的处理 用来控制 BootLoader 的设备或机制 串口通讯是最简单也是最廉价的一种双机通讯设备 ,所以往往在BootLoader中主机和目标机之间都通 过串口建立连接,BootLoader 程序在执行时通常 会通过串口来进行 I/O,比如:输出打印信息到串 口,从串口读取用户控制字符等。当然如果认为串 口通讯速度不够,也可以采用网络或者USB通讯, 那么相应的在BootLoader中就需要编写各自的驱动 。 ARM启动代码设计及中断的处理 Boot Loader 的操作模式 启动加载模式:这种模式也称为“自主“(Autonomous)模 式。也即BootLoader从目标机上的某个固态存储设备上将 操作系统加载到RAM中运行,整个过程并没有用户的介入 。这种模式是BootLoader的正常工作模式。 下载模式:在这种模式下,目标机上的BootLoader将通过 串口连接或网络连接等通信手段从主机下载文件,比如:下 载应用程序、数据文件、内核映像等。从主机下载的文件通 常首先被BootLoader保存到目标机的RAM中,然后再被 BootLoader写到目标机上的固态存储设备中。BootLoader 的这种模式通常在系统更新时使用。工作于这种模式下的 BootLoader 通常都会向它的终端用户提供一个简单的命令 行接口。 在uboot中可以通过修改环境变量实现自主模式。 ARM启动代码设计及中断的处理 BootLoader与主机间文件传输的 通信设备及协议 最常见的情况就是,目标机上的 BootLoader 通过 串口与主机之间进行文件传输,传输可以简单的采 用直接数据收发,当然在串口上也可以采用 xmodemymodemzmodem 协议以及 在以太网上采用TFTP协议。 ARM启动代码设计及中断的处理 BootLoader的主要任务与典型结 构框架 从操作系统的角度看,BootLoader的总目标就 是正确地调用内核来执行。 大多数BootLoader都分为stage1和stage2两大部 分。 依赖于CPU体系结构的代码,比如设备初始化 代码等,通常都放在stage1中,而且通常都用汇 编语言来实现,以达到短小精悍的目的,也就是 前面说的启动代码。 而stage2 则通常用C语言来实现,这样可以实现 复杂的功能,而且代码会具有更好的可读性和可 移植性。 ARM启动代码设计及中断的处理 BootLoader的主要任务与典型结 构框架 BootLoader的stage1通常包括以下步骤 为加载 BootLoader 的 stage2 准备 RAM 空间 拷贝 BootLoader 的 stage2 到 RAM 空间中 设置好堆栈 跳转到 stage2 的 C 入口点 BootLoader的stage2通常包括以下步骤 初始化本阶段要使用到的硬件设备 调用应用程序或启动内核 ARM启动代码设计及中断的处理 Stage 1初始化流程图 stage 1的功能: RAM 初始化,设置各个部 件的时钟和片选,将 BootLoader拷贝到 RAM中,设置堆栈, 调用Stage 2。 注意:在本阶段,特 别是在堆栈设置之前 ,进行函数调用(也 有些汇编子程序不需 要使用堆栈)或者使 用堆栈保存数据将产 生不可预知的结果; ARM启动代码设计及中断的处理 Stage 2流程图 stage 2的功能:初始化串口,显示菜单 ,通过控制台获取用户输入,并执行相应的 命令操作。 ARM启动代码设计及中断的处理 板级支持包 BSP(板级支持包)是介于底层硬件和操作系统 之间的软件层次,它完成系统上电后最初的硬件 和软件初始化,并对底层硬件进行封装,使得操 作系统不再面对具体的操作。 ARM启动代码设计及中断的处理 板级支持包的特点 硬件相关性:因为嵌入式实时系统的硬件环境具 有应用相关性,所以,作为高层软件与硬件之间 的接口,BSP必须为操作系统提供操作和控制具 体硬件的方法。 操作系统相关性:不同的操作系统具有各自的软 件层次结构,因此,不同的操作系统具有特定的 硬件接口形式。 ARM启动代码设计及中断的处理 板级支持包的功能 ARM启动代码设计及中断的处理 板级支持包的功能 嵌入式系统初始化 片级初始化 板级初始化 系统级初始化 硬件相关的设备驱动程序 和BootLoader存在一定的重叠 ARM启动代码设计及中断的处理 系统级初始化 这是一个以软件初始化为主的过程,主要进行操 作系统初始化。BSP将控制转交给操作系统,由 操作系统进行余下的初始化操作。包括加载和初 始化与硬件无关的设备驱动程序,建立系统内存 区,加载并初始化其他系统软件模块,比如网络 系统、文件系统等;最后,操作系统创建应用程 序环境并将控制转交给应用程序的入口。 ARM启动代码设计及中断的处理 硬件相关的驱动程序 与初始化过程相反,硬件相关的设备驱动程序的 初始化和使用通常是一个从高层到底层的过程。 尽管BSP中包含硬件相关的设备驱动程序,但是 这些设备驱动程序通常不直接由BSP使用,而是 在系统初始化过程中由BSP把它们

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论