1.52k likes | 1.64k Vues
2.2 嵌入式系统的软件基础. 2.2.1 软件系统概述 软件 (software) 是计算机系统中与硬件 (hardware) 相互依存的另一部分,它包括程序 (program) 、相关数据 (data) 及其说明文档 (document) 。 其中: 程序 是按照事先设计的功能和性能要求执行的指令序列; 数据 是程序能正常操纵信息的数据结构; 文档 是与程序开发维护和使用有关的各种图文资料。. 软件系统概述. 软件没有明显的制造过程。 一旦研制开发成功,就可以大量拷贝同一内容的副本。所以对软件的质量控制,必须着重在软件开发方面下工夫。.
E N D
2.2 嵌入式系统的软件基础 2.2.1 软件系统概述 软件(software)是计算机系统中与硬件(hardware)相互依存的另一部分,它包括程序(program)、相关数据(data)及其说明文档(document)。 其中: • 程序是按照事先设计的功能和性能要求执行的指令序列; • 数据是程序能正常操纵信息的数据结构; • 文档是与程序开发维护和使用有关的各种图文资料。
软件系统概述 • 软件没有明显的制造过程。 • 一旦研制开发成功,就可以大量拷贝同一内容的副本。所以对软件的质量控制,必须着重在软件开发方面下工夫。 • 软件是一种逻辑实体,具有抽象性。 这个特点使它与其它工程对象有着明显的差异。人们可以把它记录在纸上、内存、和磁盘、光盘上,但却无法看到软件本身的形态,必须通过观察、分析、思考、判断,才能了解它的功能、性能等特性。 • 软件在使用过程中,没有磨损、老化的问题。 软件在生存周期后期不会因为磨损而老化,但会为了适应硬件、环境以及需求的变化而进行修改,而这些修改有不可避免的引入错误,导致软件失效率升高,从而使的软件退化。当修改的成本变得难以接受时,软件就被抛弃。 软件产品的特性 • 软件对硬件和环境有着不同程度的依赖性。这导致了软件移植的问题。 • 软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低。 • 软件是复杂的,而且以后会更加复杂。 软件是人类有史以来生产的复杂度最高的工业产品。软件涉及人类社会的各行各业、方方面面,软件开发常常涉及其它领域的专门知识,这对软件工程师提出了很高的要求。 • 软件的成本相当昂贵。 • 软件开发需要投入大量、高强度的脑力劳动,成本非常高,风险也大。现在软件的开销已大大超过了硬件的开销。 • 软件工作牵涉到很多社会因素。 许多软件的开发和运行涉及机构、体制和管理方式等问题,还会涉及到人们的观念和心理。这些人的因素,常常成为软件开发的困难所在,直接影响到项目的成败。
软件系统概述 • 嵌入式系统软件也是嵌入式系统的核心之一,它由嵌入式操作系统及相应的各种应用软件构成。面向嵌入式系统的操作软件有以下特点: • 编码体积小,在嵌入式系统的有效存储空间运行; • 面向应用,可裁减和移置; • 实时性强,有时也称为实时多任务操作系统RTOS; • 可靠性高,无需人工干预独立运行,并处理不同时间的故障。
1、嵌入式软件系统的分类 控制、管理计算机系统的资源 嵌入式操作系统 嵌入式中间件(CORBA、 Java)等等 系统软件 嵌入式软件 系统分析设计工具 仿真开发工具 交叉开发工具 测试工具 配置管理工具 维护工具等 支撑软件 辅助软件开发的工具 应用软件 面向应用领域 手机软件、路由器软件 交换机软件、飞控软件 视频图像、语音、网络等
嵌入式软件系统的分类 • 从运行平台来分,嵌入式软件可以分为 • 运行在开发平台上的软件:设计、开发、测试工具等。 • 运行在嵌入式系统上的软件:嵌入式操作系统、应用程序、驱动程序及部分开发工具。
应用 任务1 应用 任务2 应用 任务n …… 嵌入式CORBA 嵌入式JAVA 嵌入式 DCOM 面向应用领域的中间件 TCP/IP 网络系统 内核 文件 系统 嵌入式GUI 电源 管理 板级 初始化 FLASH驱动 RTC/定时器驱动 以太网驱动 键盘 驱动 其他 驱动 串口 驱动 LCD 驱动 2、嵌入式软件系统的体系结构 应用层 中间件层 操作系统层 驱动层 硬件
嵌入式系统软件设计的层次结构 嵌入式系统软件结构一般包含4个层面:设备驱动层、操作系统OS、中间层、应用程序层。也有些书籍将应用程序接口API归属于OS层。由于硬件电路的可裁减性和嵌入式系统本身的特点,其软件部分也是可裁减的。
(1)驱动层 驱动层程序是嵌入式系统中不可缺少的重要部分,使用任何外部设备都需要有相应驱动层程序的支持,它为上层软件提供了设备的接口。上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。驱动层程序一般包括硬件抽象层HAL(提高系统的可移植性)、板极支持包BSP(提供访问硬件设备寄存器的函数包)和设备驱动程序。
驱动层 • 板级初始化程序 这些程序在嵌入式系统上电后初始化系统的硬件环境,包括嵌入式微处理器、存储器、中断控制器、DMA、定时器等的初始化。 • 与系统软件相关的驱动 • 这类驱动是操作系统和中间件等系统软件所需的驱动程序,它们的开发要按照系统软件的要求进行。
目前操作系统内核所需的硬件支持一般都已集成在嵌入式微处理器中了,因此操作系统厂商提供的内核驱动一般不用修改。目前操作系统内核所需的硬件支持一般都已集成在嵌入式微处理器中了,因此操作系统厂商提供的内核驱动一般不用修改。 • 与应用软件相关的驱动 与应用软件相关的驱动不一定需要与操作系统连接,这些驱动的设计和开发由应用决定。
(2)操作系统OS层 • 在设计一个简单的应用程序时,可以不使用操作系统。仅有应用程序和设备驱动程序。 • 比如一个指纹识别系统只是完成简单的指纹录入和指纹识别,它在指纹识别的过程中需要高速的算法,所以需要32位处理器。但是它的任务并不复杂,也不牵连什么复杂的协议和管理,对于这样的系统就没有安装操作系统的必要。如果一定要安装操作系统,反而会带来新的系统开销,降低系统的性能。因为运行和存储操作系统需要大量的RAM和ROM,启动操作系统需要时间。
在设计较复杂的程序时,可能就需要一个操作系统(OS)来管理和控制内存、多任务、周边资源等。依据系统所提供的程序界面来编写应用程序,可大大减少应用程序员的负担。现代高性能嵌入式系统的应用越来越广泛,操作系统的使用成为必然发展趋势。在设计较复杂的程序时,可能就需要一个操作系统(OS)来管理和控制内存、多任务、周边资源等。依据系统所提供的程序界面来编写应用程序,可大大减少应用程序员的负担。现代高性能嵌入式系统的应用越来越广泛,操作系统的使用成为必然发展趋势。 • 一般如果系统具有以下特点,系统运行较多任务,任务调度、内存分配复杂;系统需要大量协议支持,如网络协议、文件系统等;系统需要很好的图形用户接口GUI。那么建议使用操作系统。
操作系统的功能简单来说就是隐藏硬件细节,而只提供给应用程序开发人员一个个抽象的接口。用户只需要和这些抽象的接口打交道,而不用在意这些抽象的接口和函数是如何与物理资源相联系的,也不用去管那些功能是如何通过操作系统调用具体的硬件资源来完成的。这样,如果以后硬件体系发生变化,只要在新的硬件体系下还运行着同样的操作系统,那么原来的程序还能一丝不错的完成原有的功能。操作系统的功能简单来说就是隐藏硬件细节,而只提供给应用程序开发人员一个个抽象的接口。用户只需要和这些抽象的接口打交道,而不用在意这些抽象的接口和函数是如何与物理资源相联系的,也不用去管那些功能是如何通过操作系统调用具体的硬件资源来完成的。这样,如果以后硬件体系发生变化,只要在新的硬件体系下还运行着同样的操作系统,那么原来的程序还能一丝不错的完成原有的功能。
操作系统OS层构成 • 操作系统层包括嵌入式内核、嵌入式TCP/IP网络系统、嵌入式文件系统、嵌入式GUI系统和电源管理等部分。 • 其中嵌入式内核是基础和必备的部分,其他部分要根据嵌入式系统的需要来确定。
对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。以μCLinux为例子,在系统开发完成之后,将整个系统部分做成内核映像文件,与文件系统一起传送到目标系统中。然后通过BootLoader指定地址运行μCLinux内核,启动已经下载好的嵌入式Linux系统;再通过操作系统解开文件系统,运行应用程序。对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。以μCLinux为例子,在系统开发完成之后,将整个系统部分做成内核映像文件,与文件系统一起传送到目标系统中。然后通过BootLoader指定地址运行μCLinux内核,启动已经下载好的嵌入式Linux系统;再通过操作系统解开文件系统,运行应用程序。
整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多。整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多。 内核中通常必需的基本部件是进程管理、进程间通信、内存管理部分,其他部件如文件系统、驱动程序、网络协议等都可根据用户要求进行配置,并以相关的方式实现。
系统中最重要的资源是中央处理单元(CPU),一般由很多正在执行的程序所共用。操作系统负责确定可在CPU上执行的程序及其执行时间的长短,此功能称为进程调度,调度的方法由操作系统所定的优先策略决定。另一个很重要的资源是存储器,包括存储空间,这些也由在CPU上执行的应用程序共享。系统中最重要的资源是中央处理单元(CPU),一般由很多正在执行的程序所共用。操作系统负责确定可在CPU上执行的程序及其执行时间的长短,此功能称为进程调度,调度的方法由操作系统所定的优先策略决定。另一个很重要的资源是存储器,包括存储空间,这些也由在CPU上执行的应用程序共享。 除了为高级应用程序管理提供环境以外,操作系统还提供各种硬件中断服务所需的软件,以及驱动系统中存在的外设驱动程序。总之,操作系统将底层硬件细节抽象化,并通过系统调用提供应用程序与硬件之间的接口。
一般而言,开机后操作系统会初始化所有外设,如存储器控制器、计时器和输入/输出设备,并安装硬件中断服务子程序,以便处理这些设备所产生的各种信号;然后安装软件中断(由软件所产生的中断),以便处理下面将介绍的系统调用(高级应用程序为请求操作系统服务所产生的调用)。一般而言,开机后操作系统会初始化所有外设,如存储器控制器、计时器和输入/输出设备,并安装硬件中断服务子程序,以便处理这些设备所产生的各种信号;然后安装软件中断(由软件所产生的中断),以便处理下面将介绍的系统调用(高级应用程序为请求操作系统服务所产生的调用)。 系统调用是应用程序请求操作系统服务的一种机制,很像高级程序语言中的程序或函数调用,当程序需要操作系统服务时,会产生一个预定义的软件中断,由操作系统提供服务。请求服务所需的参数一般由应用程序通过CPU的寄存器传递给操作系统。
操作系统的应用程序接口API API(Application Programming Interface,应用程序编程接口)是一系列复杂的函数、消息和结构的集合体。嵌入式操作系统下的API和一般操作系统下的API在功能、含义及知识体系上完全一致。可这样理解API:在计算机系统中有很多可通过硬件或外部设备去执行的功能,这些功能的执行可通过计算机操作系统或硬件预留的标准指令调用。
操作系统的应用程序接口API API的出现,使软件人员在编制应用程序时,就不需要为各种通过硬件或外设执行的功能而重新编制程序,只需按系统或某些硬件事先提供的API函数调用即可完成功能的执行。因此在操作系统中提供标准的API函数,可加快用户应用程序的开发,统一应用程序的开发标准,也为操作系统版本的升级带来了方便。在API函数中,提供了大量的常用模块,可大大简化用户应用程序的编写。
(3)中间层(驱动层软件) 使用任何外设都需要有驱动程序的支持,驱动程序不仅要实现设备的基本功能函数,如初始化、中断响应、发送、接收等,而且还要提供完备的错误处理函数。中间层为上层软件提供了设备的操作接口。上层程序只需调用驱动程序提供的接口,而不用理会设备具体的内部操作。 驱动层软件(中间层)将系统软件与底层硬件部分进行了隔离,使得系统的底层设备驱动程序与硬件无关。具体包括硬件抽象层HAL和板级支持包BSP。
(3)中间件层 • 目前在一些复杂的嵌入式系统中也开始采用中间件技术,主要包括嵌入式CORBA、嵌入式Java、嵌入式DCOM和面向应用领域的中间件软件。 • 如基于嵌入式CORBA的应用于软件无线电台的应用中间件SCA(Software Core Architecture)等。
(4)应用程序 • 应用层 • 应用层软件主要由多个相对独立的应用任务组成 • 每个应用任务完成特定的工作,如I/O任务、计算的任务、通信任务等,由操作系统调度各个任务的运行。 • 在一般简易的嵌入式系统中常采用汇编语言来编程。较复杂的系统中,汇编语言很难胜任。高级语言就有通用性强、编程方便、易于移植及可维护等优点,常用的高级语言有C/C++等。
应用程序 实际的嵌入式系统应用软件建立在系统的主任务(Main Task)基础之上。用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户应用功能开发。在用户的应用程序中,也可创建用户自己的任务。任务之间的协调主要依赖于系统的消息队列。 操作系统是为应用程序提供基础服务的软件。而应用程序是在CPU上执行的一个或多个程序,在执行过程中会使用输入数据并产生输出数据。应用程序的管理包括程序载入和执行,程序对系统资源的共享和分配,并避免分配到的资源被其他程序破坏。
应用程序 应用程序的设计流程是,先用编辑程序编写源代码,源代码可以由多个文件组成,以实现模块化;然后用编译程序或汇编个文件;接着使用链接程序将这些二进制文件组合为可执行文件。 这些工作归结起来,可看作是实现阶段。然后,通过调试程序提供的命令运行得到的可执行文件,以测试所设计的程序。有时可利用解析程序找出程序中存在的性能瓶颈。在此验证阶段,如果找到错误或性能瓶颈,可以返回到实现阶段进行改进,并重复次流程。
3、嵌入式软件运行流程 上电复位 板级初始化 远程升级 引导/升级系统 系统升级 本地升级 系统初始化 • 基于多任务操作系统的嵌入式软件的主要运行流程 • 该运行流程主要分为5个阶段 应用初始化 多任务应用
嵌入式软件运行流程 上电复位、板级初始化阶段 • 嵌入式系统上电复位后完成板级初始化工作。 • 板级初始化程序具有完全的硬件特性,一般采用汇编语言实现。不同的嵌入式系统,板级初始化时要完成的工作具有一定的特殊性,但以下工作一般是必须完成的: • CPU中堆栈指针寄存器的初始化。 • BSS段(Block Storage Space表示未被初始化的数据)的初始化。 • CPU芯片级的初始化:中断控制器、内存等。
嵌入式软件运行流程 • 系统引导/升级阶段 • 根据需要分别进入系统软件引导阶段或系统升级阶段。 • 软件可通过测试通信端口数据或判断特定开关的方式分别进入不同阶段。
嵌入式软件运行流程 • 系统引导阶段 系统引导有几种情况: • 将系统软件从NOR Flash中读取出来加载到RAM中运行:这种方式可以解决成本及Flash速度比RAM慢的问题。软件可压缩存储在Flash中。 • 不需将软件引导到RAM中而是让其直接在NorFlash上运行,进入系统初始化阶段。 • 将软件从外存(如NandFlash、CF卡、MMC等)中读取出来加载到RAM中运行:这种方式的成本更低。
嵌入式软件运行流程 系统升级阶段 • 进入系统升级阶段后系统可通过网络进行远程升级或通过串口进行本地升级。 • 远程升级一般支持TFTP、FTP、HTTP等方式。 • 本地升级可通过Console口使用超级终端或特定的升级软件进行。
嵌入式软件运行流程 • 系统初始化阶段 • 在该阶段进行操作系统等系统软件各功能部分必需的初始化工作,如根据系统配置初始化数据空间、初始化系统所需的接口和外设等。 • 系统初始化阶段需要按特定顺序进行,如首先完成内核的初始化,然后完成网络、文件系统等的初始化,最后完成中间件等的初始化工作。
嵌入式软件运行流程 • 应用初始化阶段 在该阶段进行应用任务的创建,信号量、消息队列的创建和与应用相关的其它初始化工作。 • 多任务应用运行阶段 各种初始化工作完成后,系统进入多任务状态,操作系统按照已确定的算法进行任务的调度,各应用任务分别完成特定的功能。
5、集成开发环境(IDE) 进行嵌入式系统开发时,选择合适的开发工具可以加快进度、降低开发成本。因此,含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理以及函数库的集成开发环境IDE是必不可少的。 嵌入式软件开发的实现是在台式计算机上使用的交叉编译程序(cross compiler)、交叉汇编程序(cross assembler)等可以完成这些工作。然后通过JTAG、串口或网络接口定位下载到目标机上进行交叉编译和交叉调试。真正的差异存在于嵌入式系统的验证阶段(即测试最后的可执行文件)。下面将介绍一下常用的几种开发工具。
(1)常用的几种开发工具。 • 汇编程序(assembler) 将汇编语言指令翻译成二进制机器指令,除了将操作码、操作数转换为相应的二进制编码外,汇编程序还将符号标签转换为实际地址。 • 编译程序(complier) 将结构化程序翻译成机器(或汇编)程序。 • 结构化程序语言具有可以大大简化编程工作的高级结构(如循环结构),因此每个高级结构都可以转变成几条或数十条机器语言指令。编译程序技术应用了许多程序最优化技术,可以生成很大且性能很高的代码。交叉编译程序可以在开发处理器上运行,进而生成在目标处理器上执行的代码。
ARM的C编译器的选择 常见的ARM的C编译器主要有, • SDT 2.5(ARM Software Development Toolkit) • ADS 1.1/1.2(ARM Developer Suite) • RealView Developer Suite • arm-elf-gcc、arm-linux-gcc
(2)链接程序(linker) 可以将分开汇编或编译的文件合并为一个程序。在此过程中,将所有机器指令组合成单个程序,并插入标准函数库中的指令。专为嵌入式处理器所设计的链接程序还可以删除未被调用程序和函数相关的二进制代码,删除分配给未使用变量的存储器,以降低整个程序存储空间的大小。
6、测试和调试阶段 测试和调试阶段是整体设计流程的主要部分,尤其是开发将在嵌入式系统执行的程序。编程很容易出错,在编写大型程序时存在错误和缺陷是难免的。验证程序正确性的最常用方法是运行程序,在运行过程中应使用大量输入数据,以检查系统的行为,尤其是检查边界情况。如果开发的是将在台式计算机上运行的程序,则程序的验证相对容易一些。对于嵌入式系统程序员而言,这项任务更具挑战性,因为在嵌入式系统上运行的程序大都是实时的。
(1)调试程序(debugger) 调试程序(debugger)帮助程序员评估并更正程序。调试程序在宿主机处理器上执行,并支持单步执行。另外还允许程序执行到使用者所定义的断点。程序执行停止后,使用者可检查各存储器地址和寄存器中的值。 由于当今很多程序都相当复杂而且很难一次编写正确,因此具有良好的调试能力是极为重要的。由于调试程序在宿主机处理器上执行,但所执行的代码确是为目标处理器而设计的,因此可以模仿或模拟目标处理器的功能。这些调试程序也称为指令集仿真程序或虚拟机(VM,Virtual Machine)。
(2)测试 • 测试将在嵌入式系统中执行的程序有3种方式:利用指令集仿真程序调试;利用硬件仿真器仿真;以及将程序直接下载到目标处理器做现场测试。 • 这些方法的差别如下:使用在开发计算机上执行的调试程序,其设计周期很快,但较不精确,因为它与系统中其他部分以及环境的交互有限; • 使用硬件仿真器时的调试时间要长一些,这是因为程序代码必须下载到仿真器的硬件中后才可以进行仿真调试。但硬件仿真器可以与系统的其他部分实时交互,其测试更精确;
利用JTAG下载器将程序下载到目标处理器的设计周期是三种方法中最长的。这是因为每次调试时必须将经编译和连接后的目标代码程序下载到应用系统中后,启动系统进行实际观察,如发现错误后,再返回到宿主机上重新编辑修改和编译下载后,再人工观察有无错误,这样需经多次反复后,直到无误后才可认为调试结束。但此种方式的优点是让系统和环境可以自由交互,能提供最高的执行精确度。一般具有一定调试经验的工程师常采用此方法。利用JTAG下载器将程序下载到目标处理器的设计周期是三种方法中最长的。这是因为每次调试时必须将经编译和连接后的目标代码程序下载到应用系统中后,启动系统进行实际观察,如发现错误后,再返回到宿主机上重新编辑修改和编译下载后,再人工观察有无错误,这样需经多次反复后,直到无误后才可认为调试结束。但此种方式的优点是让系统和环境可以自由交互,能提供最高的执行精确度。一般具有一定调试经验的工程师常采用此方法。
2.2.2 嵌入式实时操作系统简介 • 操作系统可以简单分为通用操作系统和实时操作系统两类。我们平时在PC机上使用的Windows、Dos、Linux等操作系统都属于通用操作系统。这类操作系统的任务类型多种多样,它们一般比较强调系统的运行效率。 • 实时操作系统就是“在给定的时间内提供某种程度的服务,如果在规定的时间内没有得到结果,那整个的系统就是失败”。对于实时操作系统其首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼提高计算机系统的使用效率。
RTOS是针对不同处理器优化设计的高效实时多任务内核,可以面对几十个系列的嵌入式处理器提供类似的API接口。基于RTOS的C语言工具具有极大的可移植性(只需修改10%左右的内容)。在RTOS基础上可以编写出各种硬件驱动程序、专家库函数、行业库函数、产品库函数,和通用性的应用程序一起可以作为可以作为产品销售。 • RTOS最关键的部分是实时多任务内核,它的基本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、旗语管理等,这些管理功能是通过内核服务函数形式交给用户调用的,也就是RTOS的API。
实时操作系统的特点 (1)多任务 一个任务也称作一个线程,是一个简单的运行程序。每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间 多任务运行的实现,实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。在实际应用中,多任务的最大特点是,开发人员可以将很复杂的应用程序层次化。
内部事件:运算结果、设备请求等 事件驱动 外部事件:开关量输入等 实时任务 绝对时间驱动 时间驱动 任务 相对时间驱动 非实时任务 (2)任务的事件驱动通用操作系统只注重平均性能,所有任务的平均响应时间是关键,并不关心单个任务的响应时间。而嵌入式实时系统是指在一个确定的时间内,实现系统功能并做出及时响应的系统。
CPU 中断控制器1 外部事件 中断控制器2 (3)中断与中断优先级系统实现中断可以带来CPU和外设间的同步工作、实现实时处理和故障处理。
①异常中断的优先级 在嵌入式微处理器中通过给各异常中断赋予一定的优先级来实现这种处理顺序。优先级如下: 复位(最高优先级); 数据异常中止; FIQ; IRQ ; 预取指令异常中止; SWI(软件中断)、 未定义指令(包括缺协处理器)。这两者是互斥的指令编码,因此不可能同时发生。 复位是优先级最高的异常中断,这是因为复位从确定的状态启动微处理器,使得所有其他未解决的异常都没有关系了。
②微处理器的异常中断响应过程 当发生异常时,除了复位异常立即中止当前指令外,处理器尽量完成当前指令,然后脱离当前的指令处理序列去处理异常。 ARM处理器对异常中断的响应过程如下: 首先,将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的备用程序状态寄存器SPSR中,以实现对处理器当前状态、中断屏蔽位及各条件标志位的保存。各异常中断模式都有自己相应的物理SPSR寄存器。
其次设置CPSR中的相应位 • 设置CPSR模式控制位CPSR[4:0],使处理器进入相应的执行模式;设置中断标志位(CPSR[7]=1),禁止IRQ中断; • 当进入Reset或FIQ模式时,还要设置中断标志位(CPSR[6]=1),禁止FIQ中断。 • 然后,将引起异常指令的下一条指令的地址保存到新的异常工作模式的R14即R14_mode中,使异常处理程序执行完后能正确返回原程序。 • 最后,给程序计数器强制赋值,使程序在对应的矢量地址开始执行中断处理程序。一般矢量地址处将包含一条指向相应程序的转移指令,从而可跳转到相应的异常中断处理程序处执行异常中断处理程序。
③从异常中断处理程序中返回 从异常中断处理程序中返回时,需要执行以下4个基本操作: • 被修改过的用户寄存器必须从处理程序的保护堆栈中恢复(即出栈,恢复现场)。 • 将SPSR_mode寄存器内容复制到CPSR中,使得CPSR从相应的SPSR中恢复,恢复被中断的程序工作状态。 • 根据异常类型将程序计数器PC变回到用户指令流中相应的指令处(恢复断点)。 • 最后清除CPSR(7或6位)中的中断禁止标志位I/F。