Download presentation
Presentation is loading. Please wait.
1
嵌入式系统教案 武汉创维特信息技术有限公司 2018/11/24
2
第六章 嵌入式软件系统设计 提纲 1 2 3 4 5 6 7 嵌入式软件开发过程 ARM软件开发工具-ADT IDE简介
3
嵌入式系统软件开发流程 嵌入式软件开发过程 软件需求分析:确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。
概要设计:描述系统如何实现所述的需求,包括软件模块的划分、系统的软件开发工具选择以及关键问题的论证等。 详细设计:详细描述各个模块的实现方法与过程,模块间接口等问题,以作为编码人员的编码准则。 ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。 ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得ARM技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。 编码
4
嵌入式系统的开发流程 嵌入式软件开发过程 单元调试:编码完成后,对各个模块进行单元调试,以保证模块正常工作。 集成调试
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。 ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得ARM技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。
5
ARM主流开发工具 Windows操作系统 Linux操作系统 ARM软件开发工具-ADT IDE简介 ARM ADS/SDT + 调试器
GNU + Cygwin + 调试器 ARM SDT + 简易电缆 Linux操作系统 GNU + GDB
6
常用调试方法 ARM软件开发工具-ADT IDE简介 软件仿真 驻留监控程序 JTAG仿真器 在线仿真器 硬件要求高,一般在硬件稳定之后进行
需要占用目标板上的一部分资源 不能对程序的全速运行进行完全仿真 JTAG仿真器 完全非插入式调试,不使用片上资源,无需目标存储器,不占用目标系统的任何端口 仿真效果更加接近于目标硬件 在线仿真器 驻留监控程序(Resident Monitors)是一段运行在目标板上的程序集成开发环境中的调试模块通过以太网口并行端口或者串行端口等通讯端口与驻留监控软件进行交互由调试模块发送命令通知驻留监控软件控制程序的执行读写存储器读写寄存器设置断点等。 驻留监控软件是一种比较低廉而有效的调试方式,不需要任何其他的硬件调试和仿真设备。ARM公司的Angel就是该类软件,大部分嵌入式实时操作系统也是采用该类软件进行调试,不同的是在嵌入式实时操作系统中,驻留监控软件是作为操作系统的一个任务存在的。 驻留监控软件的一个不便之处在于它对硬件设备的要求比较高,一般在硬件稳定之后才能进行应用程序的开发,同时它占用目标板上的一部分资源,而且不能对程序的全速运行进行完全仿真,所以对一些要求严格的情况下不是很合适。 JTAG仿真器也称为JTAG调试器,是通过ARM芯片的JTAG边界扫描口进行调试的设备。 JTAG仿真器连接比较方便,通过现有的JTAG边界扫描口与ARM CPU核通信,属于完全非插入式调试,不使用片上资源,无需目标存储器,不占用目标系统的任何端口,而这些是驻留监控软件所必须的。 另外,由于JTAG调试的目标程序是在目标板上执行,仿真更加接近于目标硬件。 ADT1000是JTAG仿真器,它配合ADT IDE集成开发环境组成为ARM开发的一种有效调试手段。 在线仿真器使用仿真头,完全取代目标板上的CPU,可以完全仿真ARM芯片的行为,提供更加深入的调试功能。但这类仿真器为了能够全速仿真时钟速度高于100MHz的处理器,通常必须采用及其复杂的设计和工艺,因而其价格比较昂贵。 在线仿真器通常用在ARM的硬件开发中,在软件的开发中很少使用。
7
ARM软件开发工具-ADT IDE简介 ADT for ARM集成开发系统
8
ARM软件开发工具-ADT IDE简介 ADT 1000 Emulator for ARM
9
ADT 1000 Emulator for ARM ARM软件开发工具-ADT IDE简介
ADT Emulator for ARM是连接主机核目标机之间的硬件设备,它实现ADT IDE for ARM与目标机之间的连接。 它具有如下特征: 支持ARM核CPU 非插入式调试,无需目标存储器,不占用目标系统的任何端口 2.5V/3.3V/5V兼容电平接口 支持标准的14/20针JTAG接口 运行状态指示 与主机之间通过并口连接 下载速度达到25Kbytes/S
10
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM
11
ADT IDE for ARM主要特征 - 可视化编程环境
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM主要特征 - 可视化编程环境 支持ARM7、ARM9、SecurCore等。 运行于Windows98 、NT、2000、XP等平台。 中文、英文版本支持 可视化的源码编辑和工程管理功能 界面友好,使用方便:类似MS Visual Studio的用户界面,支持打印功能,支持文件内查找功能和Find in Files功能
12
ADT IDE for ARM主要特征 - 可视化编程环境
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM主要特征 - 可视化编程环境 工程管理器:ADT IDE提供图形化的工程管理工具,实现文件级、文件目录级、工程级的多级编译连接选项管理以及工程级的调试参数管理 源码编辑器:支持标准的文本编辑功能,支持C语言、汇编语言语法高亮显示 辅助编辑工具:提供一系列辅助编辑工具,方便开发人员。包括:多剪贴板工具、代码模板工具、头文件和源文件切换工具、注释工具、符号配对书写工具等多种辅助编辑工具。
13
ADT IDE for ARM主要特征 - 交叉编译功能
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM主要特征 - 交叉编译功能 支持开发语言:ANSI C;Embedded C++;汇编语言 编译工具:使用著名优秀自由软件GNU的GCC交叉编译工具,并经过优化和严格测试,支持C语言、汇编语言等 编译参数设置:完全图形界面方式的编译参数设置,提供可视化的设置功能。支持工程级、文件目录级、文件级编译参数设置
14
ADT IDE for ARM主要特征 - 调试功能
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM主要特征 - 调试功能 同时提供了图形和命令行两种调试方式 程序的单步执行 程序下载 存储区下载和上载功能。 工程级调试参数管理 支持源程序、反汇编程序和混合窗口显示,支持ARM/THUMB方式显示 具有与MS Visual Studio类似的调试菜单功能:Go,Stop,Reset,Restart,Step into,Step over,Step out,Run to Cursor等 丰富的示例程序
15
ADT IDE for ARM主要特征 - 调试功能
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM主要特征 - 调试功能 断点功能:支持软件断点和硬件断点,实现断点设置、断点屏蔽、断点取消、断点列表等功能 变量监视功能:随程序运行同步更新变量,即时修改变量值,可设置自动/手动刷新方式、十进制/十六进制显示 ARM各种模式的寄存器即时查看与修改,当前模式指示,寄存器值修改时红色突显 存储器查看与修改,可设置自动/手动刷新方式、字节/双字节/四字节显示、大/小端方式显示,存储器值修改时红色突显
16
ADT IDE for ARM主要特征 - 调试功能
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM主要特征 - 调试功能 函数堆栈显示,可设置自动/手动刷新方式、十进制/十六进制显示、参数值显示,参数类型显示 板上寄存器(On Board Register)的查看和修改,可以查看支持CPU的所有板上寄存器的具体意义、当前值、各个位的意义,可设置自动/手动刷新方式、二进制/十进制/十六进制显示、大/小端方式显示,支持十进制/十六进制方式修改寄存器值,寄存器值修改时红色突显。 flash在线编程器,支持对多种flash芯片的空白检查、擦除、编程、校验等操作,支持单一操作和自动操作两种操作方式,支持8/16/32位flash访问宽度,支持多片flash同时编程,编程速度达15Kbytes/s。提供统一的flash编程接口,可以方便地添加flash编程方案。
17
(Arm7Lpt、Arm9Lpt、SoftSim、Arm7Simple)
ARM软件开发工具-ADT IDE简介 ADT IDE for ARM ADT IDE (Arm7Lpt、Arm9Lpt、SoftSim、Arm7Simple) 用户手册、编程指南 丰富例程
18
ARM软件开发工具-ADT IDE简介 多版本支持 软件仿真版本 ARM7版本 ARM9版本 简易仿真版本
19
ARM软件开发工具-ADT IDE简介 多工程管理 工程 当前活动工程
20
ARM软件开发工具-ADT IDE简介 可视化编辑器 编辑菜单 语法高亮编辑器 辅助编辑工具条 书签
21
ARM软件开发工具-ADT IDE简介 编译菜单 GCC交叉编译 编译工具条 编译结果输出 错误定位
22
ARM软件开发工具-ADT IDE简介 编译器设置 多参数配置 多配置管理 多工程设管理
23
ARM软件开发工具-ADT IDE简介 汇编器设置 多参数配置 多配置管理 多工程设管理
24
ARM软件开发工具-ADT IDE简介 连接器设置 多参数配置 多配置管理 多工程设管理
25
ARM软件开发工具-ADT IDE简介 调试功能 调试工具条 调试菜单 命令行调试窗口
26
ARM软件开发工具-ADT IDE简介 多种调试模式 混合模式 源码模式 汇编模式
27
ARM软件开发工具-ADT IDE简介 断点 断点列表 断点
28
ARM软件开发工具-ADT IDE简介 存储器窗口 半字模式 修改凸显标记 字模式 字节模式
29
ARM软件开发工具-ADT IDE简介 存储区上载下载功能 存储区上载 存储区下载
30
ARM软件开发工具-ADT IDE简介 寄存器观察窗口 修改凸显标记 多模式寄存器显示
31
ARM软件开发工具-ADT IDE简介 函数调用栈窗口 函数调用栈
32
ARM软件开发工具-ADT IDE简介 变量观察窗口 局部变量 全局变量 多个观察窗口
33
ARM软件开发工具-ADT IDE简介 命令窗口
34
ARM软件开发工具-ADT IDE简介 单步调试 - STEP INTO
35
ARM软件开发工具-ADT IDE简介 单步调试 - STEP OVER
36
ARM软件开发工具-ADT IDE简介 单步调试 - STEP OUT
37
ARM软件开发工具-ADT IDE简介 单步调试 - RUN TO CURSOR
38
ARM软件开发工具-ADT IDE简介 板上寄存器 寄存器组 寄存器 寄存器位域 热点描述信息 修改凸显标记
39
ARM软件开发工具-ADT IDE简介 板上寄存器
40
ARM软件开发工具-ADT IDE简介 FLASH在线编程器
41
ARM软件开发工具-ADT IDE简介 工具菜单 可自定制
42
ARM软件开发工具-ADT IDE简介 在线帮助
43
嵌入式软件开发 ARM软件设计与代码分析 无操作系统的软件开发 基于操作系统的软件开发 启动代码 应用程序 bootloader
操作系统移植 BSP板级支持包 应用程序开发
44
启动代码 ARM软件设计与代码分析 程序流程 功能 特征 设置中断、异常入口 硬件初始化 关中断 引导C代码
硬件寄存器初始化(GPIO配置、总线配置、PLL时钟) 初始化栈指针 数据区初始化 C入口函数调用 BL Main 功能 硬件初始化 引导C代码 特征 通常用汇编语言编写 程序复位运行入口点 代码量非常小 启动代码是用来初始化电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言,是任何处理器上电复位时的程序运行入口点
45
ARM软件设计与代码分析 应用程序(无操作系统) 功能 硬件驱动 应用 特征 通常用C语言或者嵌入式汇编语言编写 程序较复杂,代码量较大
46
bootloader ARM软件设计与代码分析 功能 特征 硬件初始化 引导操作系统 下载程序(串口、网口、USB) 烧写flash
程序复位运行入口点 通常用汇编语言+C语言编写 代码量较小 引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。 本文将从 Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及 Boot Loader 的安装等四个方面来讨论嵌入式系统的 Boot Loader。 简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。
47
嵌入式操作系统移植 ARM软件设计与代码分析 Linux Windows CE uC/OS II uClinux Nucleus
Linux和Windows CE需要MMU支持,其余三个可以不用。 Linux特点,源代码开放,资源丰富,支持平台多 uClinux是在Linux基础上,专门为没有MMU的嵌入式应用修改后的,目前广泛应用于嵌入式开发中。 uC/OS II的特点是源代码开放,内核高度裁减,可以裁减到非常小 Nucleus
48
BSP板级支持包 ARM软件设计与代码分析 功能 特征 为应用程序提供统一的硬件操作接口 高度硬件相关 高度依赖于具体硬件平台
各种操作系统各异 BSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。 BSP的特点: 硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。 操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。 BSP包括如下功能: 1、嵌入式系统初始化 A、片级初始化 B、板级初始化 C、系统级初始化 2、硬件相关的设备驱动程序 1)片级初始化:主要完成微处理器的初始化, 包括设置微处理器的核心寄存器和控制寄存器,微处理器核心工作模式以及其局部总线模式等。片级初始化把微处理器从上电时的缺省状态逐步设置成为系统所要求的工作状态。这是一个纯硬件的初始化过程 2)板级初始化:完成微处理器以外的其他硬件设备的初始化。除此之外,还要设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件和软件环境。这是一个同时包含软硬件两部分在内的初始化过程。 3)系统级初始化:这是一个以软件初始化为主的过程, 主要进行操作系统初始化。BSP将控制转交给操作系统, 由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并将控制转交给应用程序的入口 1)BSP另一个主要功能是硬件相关的设备驱动。与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。尽管BSP 中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP 把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。 2)设计与硬件相关的驱动程序是BSP设计中另一个关键环节
49
应用程序开发(操作系统) ARM软件设计与代码分析 功能 特征 GUI图形、人机交互 控制 算法 硬件依赖程度小 部分可仿真调试
各种操作系统各异
50
嵌入式软件设计和调试流程 ARM软件设计与代码分析 调试 编辑 固化 编译 连接调试器 创建工程 下载程序 添加文件、编写程序 运行、调试
通过仿真器烧写flash 专用或通用的编程器 通过bootloader烧写flash 编辑 创建工程 添加文件、编写程序 汇编语言加C语言 编译 配置编译、汇编和连接参数 编写连接脚本文件
51
交叉编译 ARM软件设计与代码分析 GNU交叉编译 操作文件 生成调试格式文件.elf 生成bin文件 编译.c arm-elf-gcc
汇编.S arm-elf-gas 连接.o arm-elf-ld 操作文件 汇编文件.S C文件.c 链接脚本文件ldscript 库文件.o .lib .a 生成调试格式文件.elf DWARF-1 DWARF-2 生成bin文件 elf2bin arm-elf-objcopy
52
链接脚本 ARM软件设计与代码分析 GCC库专用 段 调试信息 符号 Text段 rodata段 data段 bss段
Image_RO_Limit Image_RW_Base Image_ZI_Base Image_ZI_Limit
53
ARM软件设计与代码分析 链接脚本示例 程序在SDRAM中运行 程序在FLASH中运行
54
GCC库 ARM软件设计与代码分析 GCC库 链接排列顺序 标准C函数库lib.a -lc 标准数学函数库libm.a -lm
标准函数库的支持库libg.a -lg GCC的支持库libgcc.a lgcc 链接排列顺序 -lm –lc –lgcc -lg
55
它通常也是BootLoader程序的一部分,可以在启动代码基础上编写BootLoader。 用汇编语言编写。
ARM软件设计与代码分析 JX44B0启动代码分析 在基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0x 开始执行,因此在这个地址处安排的通常就是系统的启动代码。 它通常也是BootLoader程序的一部分,可以在启动代码基础上编写BootLoader。 用汇编语言编写。 启动代码是在复位后运行其它程序之前运行的一段小程序。通过它,初始化硬件设备、建立内存空间的映射图(JX44B0不需要),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用C函数准备好正确的环境。
56
ARM软件设计与代码分析 启动代码的移植和修改 启动代码除了依赖于 CPU 的体系结构外,实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。 对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的启动代码也能运行在另一块板子上,也还是需要作一些必要的修改。
57
ARM软件设计与代码分析 启动代码流程图 启动代码的功能:RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用C函数。 注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;
58
该段向量表除了复位异常外,只有位于0地址处有效,也就是必须将该段代码烧写到FLASH中。
ARM软件设计与代码分析 设置中断向量表 该段向量表除了复位异常外,只有位于0地址处有效,也就是必须将该段代码烧写到FLASH中。 复位异常直接跳转到ResetHandler处,它是相对跳转,位置无关。 其余的异常将跳转到0c 向量地址的位置,使用绝对跳转。
59
复位入口:切换到超级模式 系统复位成功后,将自动进入SVC模式 在初始化之前必须关闭中断,以免引起异常 ARM软件设计与代码分析
MODE_MASK:0x1f SUP_MODE:0x13 LOCKOUT:0xc0 Bit6,7 = 1
60
设置中断模式并禁止中断 设置S3C44B0 INTCON寄存器 缺省值为0x07,可以 不作该工作 ARM软件设计与代码分析
0x01e00000
61
ARM软件设计与代码分析 关闭看门狗 设置S3C44B0 WTCON寄存器 必须设置 0x01e00000 0x01d30000
62
ARM软件设计与代码分析 系统配置寄存器 使能回写buffer 打开Cache 0x01e00000 0x01c00000
63
设置非Cache区域 使能回写buffer 打开Cache ARM软件设计与代码分析 0-0x0b000000
0c -0xc
64
ARM软件设计与代码分析 端口设置
65
ARM软件设计与代码分析 设置外部中断的触发方式 0x01e00000 0x01d20050
66
ARM软件设计与代码分析 配置总线访问宽度
67
ARM软件设计与代码分析 配置总线访问时序
68
ARM软件设计与代码分析 C代码初始化
69
ARM软件设计与代码分析 堆栈初始化
70
ARM软件设计与代码分析 跳转到C入口函数
71
BootLoader是在启动代码的基础之上,通常启动代码包含于BootLoader之中
ARM软件设计与代码分析 JX44B0 BOOTLOADER分析 BootLoader是在启动代码的基础之上,通常启动代码包含于BootLoader之中 BootLoader常用于引导操作系统或者应用程序 BootLoader可以包含一些简单的调试手段
72
BootLoader的基本概念 ARM软件设计与代码分析 BootLoader是系统加电后运行的第一段软件代码。
嵌入式系统中,整个系统的加载启动任务完全由 BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0x 开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。 简单地说,BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。 通常,BootLoader 是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的 BootLoader 是很困难的。
73
BootLoader 的移植和修改 ARM软件设计与代码分析
BootLoader除了依赖于 CPU 的体系结构外,BootLoader 实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等。 对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,也还是需要作一些必要的修改。
74
BootLoader 的安装 ARM软件设计与代码分析
系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C44B0在复位时都从地址 0x 取它的第一条指令。 嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执行BootLoader程序。 也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引导的固态存储设备如FLASH。
75
用来控制 BootLoader 的设备或机制
ARM软件设计与代码分析 用来控制 BootLoader 的设备或机制 串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader 程序在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在BootLoader中就需要编写各自的驱动。
76
Boot Loader 的操作模式 ARM软件设计与代码分析
启动加载模式:这种模式也称为"自主"(Autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。 下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被 BootLoader写到目标机上的固态存储设备中。BootLoader 的这种模式通常在系统更新时使用。工作于这种模式下的 BootLoader 通常都会向它的终端用户提供一个简单的命令行接口。 在教学系统中提供的BootLoader中没有实现自主模式,可以通过修改代码来实现该功能。
77
BootLoader与主机间文件传输的通信设备及协议
ARM软件设计与代码分析 BootLoader与主机间文件传输的通信设备及协议 最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmodem/ymodem/zmodem 协议以及 在以太网上采用TFTP协议。
78
BootLoader的主要任务与典型结构框架
ARM软件设计与代码分析 BootLoader的主要任务与典型结构框架 从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。 大多数BootLoader都分为stage1和stage2两大部分。 依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,也就是前面说的启动代码。 而stage2 则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。
79
BootLoader的主要任务与典型结构框架
ARM软件设计与代码分析 BootLoader的主要任务与典型结构框架 BootLoader的stage1通常包括以下步骤 为加载 BootLoader 的 stage2 准备 RAM 空间 拷贝 BootLoader 的 stage2 到 RAM 空间中 设置好堆栈 跳转到 stage2 的 C 入口点 BootLoader的stage2通常包括以下步骤 初始化本阶段要使用到的硬件设备 调用应用程序或启动内核
80
Stage 1初始化流程图 ARM软件设计与代码分析
stage 1的功能: RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用Stage 2。 注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;
81
ARM软件设计与代码分析 Stage 2流程图 stage 2的功能: 初始化串口,显示菜单,通过菜单获取用户输入,并执行相应的操作。
82
Bootloader更新程序流程图 ARM软件设计与代码分析
通过BootLoader更新程序的流程。注意为了使用Bootloader更新FLASH中的程序,需要首先将Bootloader搬迁到RAM中运行。
83
ARM软件设计与代码分析 嵌入式实时操作系统 将在后面介绍
84
ARM软件设计与代码分析 板级支持包 BSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。
85
操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。
ARM软件设计与代码分析 板级支持包的特点 硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。 操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。
86
ARM软件设计与代码分析 板级支持包的功能
87
板级支持包的功能 嵌入式系统初始化 片级初始化 板级初始化 系统级初始化 硬件相关的设备驱动程序 ARM软件设计与代码分析
和BootLoader存在一定的重叠
88
ARM软件设计与代码分析 系统级初始化 这是一个以软件初始化为主的过程,主要进行操作系统初始化。BSP将控制转交给操作系统,由操作系统进行余下的初始化操作。包括加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,比如网络系统、文件系统等;最后,操作系统创建应用程序环境并将控制转交给应用程序的入口。
89
与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。
ARM软件设计与代码分析 硬件相关的驱动程序 与初始化过程相反,硬件相关的设备驱动程序的初始化和使用通常是一个从高层到底层的过程。 尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP把它们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。
90
ARM软件设计与代码分析 JX44B0应用代码设计及中断处理 连接脚本
91
除复位异常外,其余异常入口地址由FLASH跳转得到
ARM软件设计与代码分析 JX44B0应用代码中断向量 起始地址0x0c000008 除复位异常外,其余异常入口地址由FLASH跳转得到
92
JX44B0中断处理流程 ARM软件设计与代码分析 执行0x18处指令:LDR pc, = 0x0c000020,由Bootloader控制
执行0x0c000020处指令:HandlerIRQ,ramstart.s 执行HandlerIRQ,ramstart.s 执行HandleIRQ处保存的中断分发例程,ramstart.s中初始化为IsrIRQ
93
用汇编代码编写的中断分发例程 ARM软件设计与代码分析 保护现场 R9中保存中断状态
IsrIRQ: /*using I_ISPR register.*/ sub lr,lr,#4 stmfd sp!,{lr} /* 保存中断返回的PC值 */ stmfd sp!,{r0-r4} /* 备份寄存器R0-R4 */ sub sp,sp,# /* 为PC预留栈空间 */ stmfd sp!,{r8-r9} /* 备份寄存器R8-R9 */ ldr r9,=I_ISPR /* 读取中断状态 */ ldr r9,[r9] R9中保存中断状态
94
用汇编代码编写的中断分发例程 ARM软件设计与代码分析 寻找中断源 找到中断则跳转到i1,R8保存找到的中断偏移 未找到中断则跳转到i2
cmp r9, #0x /* 检查中断状态 */ beq i2 mov r8,#0x /* R8保存中断表的偏移 */ i0: /* 逐位检查中断状态 */ movs r9,r9,lsr #1 bcs i1 /* 如果该位等于1,则处理这一中断 */ add r8,r8,#4 /* 修改当前的中断偏移 */ b i /* 处理下一比特 */ 找到中断则跳转到i1,R8保存找到的中断偏移 未找到中断则跳转到i2
95
用汇编代码编写的中断分发例程 ARM软件设计与代码分析 处理中断并返回 i1:
ldr r9,=HandleADC /* HandleADC位于中断向量表起始位置,我们将该地址用作是中断向量表的基地址 */ add r9,r9,r8 /* 计算入口地址指针:中断基地址加上偏移 */ ldr r9,[r9] /* 从地址向量表中获取入口地址 */ str r9,[sp,#8] /* 将入口地址保存到堆栈,并移动堆栈指针 */ mov lr,pc /* 保存当前PC*/ ldmfd sp!,{r8-r9,pc} /* 调用中断例程 */ ldmfd sp!,{r0-r4, pc}^/* 中断返回,并恢复中断前的处理器模式*/ i2: ldmfd sp!,{r8-r9} /* 如果当前没有任何中断,直接返回 */ add sp,sp,# /* 移动堆栈指针,该空间由第4句指令预留 */
96
用C代码编写的中断分发例程 ARM软件设计与代码分析 函数声明 typedef (*ISR_ROUTINE_ENTRY)(void);
void IsrIRQ() __attribute__ ((interrupt("IRQ")));
97
用C代码编写的中断分发例程 ARM软件设计与代码分析 函数实现 void IsrIRQ(){ int count = 0;
unsigned int isr_pending; unsigned int isr_mask = 0x ; unsigned int isr_mask_set = rINTMSK; /* 读取中断掩码 */ ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0; isr_pending = (rINTPND & ~isr_mask_set); /* 读取中断状态 */ /* 查表 */ while(isr_mask) { if(isr_pending&isr_mask) /* 找到中断源,获取中断例程入口地址 */ isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count)); break; } count+=4; isr_mask <<= 1; /* 调用中断服务例程 */ if(isr_routine_entry) (*isr_routine_entry)();
98
中断处理例程 ARM软件设计与代码分析 注册例程 函数实现
*(unsigned int*)(HandleEINT0) = (unsigned int) EINT0_Isr; 函数实现 void EINT0_Isr() { rI_ISPC=BIT_EINT0;/* 清除中断标志 */ …… }
Similar presentations