⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm应用系统开发详解全集.txt

📁 作为一种16/32 位的高性能、低成本、低功耗的嵌入式RISC 微处理器
💻 TXT
📖 第 1 页 / 共 5 页
字号:

                    ARM 应用系统开发详解──基于S3C4510B 的系统设计                          9 



    CPSR[5] = 0              ;当运行于ARM工作状态时 



    If <Exception_Mode> == Reset or FIQ then 



                             ;当响应FIQ异常时,禁止新的FIQ异常 



       CPSR[6] = 1 



       CPSR[7] = 1 



     PC = Exception Vector Address 



2.6.3  从异常返回 



    异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 

    1、将连接寄存器LR的值减去相应的偏移量后送到PC中。 

    2、将SPSR复制回CPSR中。 

    3、若在进入异常处理时设置了中断禁止位,要在此清除。 

    可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 



2.6.4  各类异常的具体描述 



FIQ (Fast Interrupt Request) 

    FIQ异常是为了支持数据传输或者通道处理而设计的。在ARM状态下,系统有足够的私有寄存器, 

从而可以避免对寄存器保存的需求,并减小了系统上下文切换的开销。 

    若将CPSR的F位置为1,则会禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ 

的输入。注意只有在特权模式下才能改变F位的状态。 

    可由外部通过对处理器上的nFIQ引脚输入低电平产生FIQ。不管是在ARM状态还是在Thumb状态 

下进入FIQ模式,FIQ处理程序均会执行以下指令从FIQ模式返回: 



      SUBS  PC,R14_fiq ,#4 



    该指令将寄存器R14_fiq  的值减去4 后,复制到程序计数器PC  中,从而实现从异常处理程序 

中的返回,同时将SPSR_mode 寄存器的内容复制到当前程序状态寄存器CPSR 中。 

IRQ (Interrupt Request) 

    IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚输入低电平产生,IRQ的优先级低于 

FIQ,当程序执行进入FIQ异常时,IRQ可能被屏蔽。 

    若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位清零,处理器会在指令执行完之前检 

查IRQ的输入。注意只有在特权模式下才能改变I位的状态。 

    不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ处理程序均会执行以下指令从IRQ模式 

返回: 



      SUBS  PC , R14_irq , #4 



    该指令将寄存器R14_irq  的值减去4 后,复制到程序计数器PC  中,从而实现从异常处理程序 

中的返回,同时将SPSR_mode 寄存器的内容复制到当前程序状态寄存器CPSR 中。 

ABORT (中止) 

    产生中止异常意味着对存储器的访问失败。ARM微处理器在存储器访问周期内检查是否发生中 

止异常。 

    中止异常包括两种类型: 

    ─ 指令预取中止:发生在指令预取时。 

    ─ 数据中止:发生在数据访问时。 

    当指令预取访问存储器失败时,存储器系统向ARM处理器发出存储器中止(Abort)信号,预取 

的指令被记为无效,但只有当处理器试图执行无效指令时,指令预取中止异常才会发生,如果指令 

未被执行,例如在指令流水线中发生了跳转,则预取指令中止不会发生。 

    若数据中止发生,系统的响应与指令的类型有关。 


----------------------- 页面 23-----------------------

                    ARM 应用系统开发详解──基于S3C4510B 的系统设计                          10 



    当确定了中止的原因后,Abort处理程序均会执行以下指令从中止模式返回,无论是在ARM 

状态还是Thumb状态: 



      SUBS PC, R14_abt, #4   ;指令预取中止 



      SUBS PC, R14_abt, #8   ;数据中止 



    以上指令恢复PC (从R14_abt)和CPSR (从SPSR_abt)的值,并重新执行中止的指令。 

Software Interruupt(软件中断) 

    软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能。软件中断处理程 

序执行以下指令从SWI模式返回,无论是在ARM状态还是Thumb状态: 



      MOV  PC , R14_svc 



    以上指令恢复PC (从R14_svc)和CPSR (从SPSR_svc)的值,并返回到SWI的下一条指令。 

Undefined Instruction(未定义指令) 

    当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以通过软件 

仿真扩展ARM或Thumb指令集。 

    在仿真未定义指令后,处理器执行以下程序返回,无论是在ARM状态还是Thumb状态: 



      MOVS PC, R14_und 



    以上指令恢复PC (从R14_und)和CPSR (从SPSR_und)的值,并返回到未定义指令后的下一条 

指令。 



2.6.5  异常进入/退出小节 



    表2-4 总结了进入异常处理时保存在相应R14  中的PC 值,及在退出异常处理时推荐使用的指 

令。 



                               表2-4  异常进入/退出 



                      返回指令                     以前的状态                注意 



                                        ARM  R14_x   Thumb R14_x 



    BL       MOV PC,R14               PC+4          PC+2         1 



    SWI      MOVS PC,R14_svc          PC+4          PC+2         1 



    UDEF     MOVS PC,R14_und          PC+4          PC+2         1 



    FIQ      SUBS PC,R14_fiq,#4       PC+4          PC+4         2 



    IRQ      SUBS PC,R14_irq,#4       PC+4          PC+4         2 



    PABT     SUBS PC,R14_abt,#4       PC+4          PC+4         1 



    DABT     SUBS PC,R14_abt,#8       PC+8          PC+8         3 



    RESET    NA                       -             -            4 



   注意: 



    1、在此PC 应是具有预取中止的BL/SWI/未定义指令所取的地址。 



   2、在此PC 是从FIQ 或IRQ 取得不能执行的指令的地址。 



   3、在此PC 是产生数据中止的加载或存储指令的地址。 



   4、系统复位时,保存在R14_svc 中的值是不可预知的。 



2.6.6  异常向量(Exception Vectors) 



    表2-5显示异常向量地址。 



                                 表2-5 异常向量表 



          地 址                    异 常                       进入模式 



    0x0000,0000        复位                        管理模式 



    0x0000,0004        未定义指令                     未定义模式 



    0x0000,0008        软件中断                      管理模式 


----------------------- 页面 24-----------------------

                    ARM 应用系统开发详解──基于S3C4510B 的系统设计                          11 



    0x0000,000C        中止(预取指令)                  中止模式 



    0x0000,0010        中止(数据)                    中止模式 



    0x0000,0014       保留                         保留 



    0x0000,0018       IRQ                        IRQ 



    0x0000,001C       FIQ                        FIQ 



2.6.7  异常优先级(Exception Priorities) 



    当多个异常同时发生时,系统根据固定的优先级决定异常的处理次序。异常优先级由高到低的 

排列次序如表2-6所示。 



                               表2-6   异常优先级 



               优先级                                  异 常 



    1  (最高)                      复位 



    2                            数据中止 



    3                            FIQ 



    4                            IRQ 



    5                            预取指令中止 



    6 (最低)                       未定义指令、SWI 



2.6.8  应用程序中的异常处理 



    当系统运行时,异常可能会随时发生,为保证在ARM 处理器发生异常时不至于处于未知状态, 

在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳 

转指令,跳转到异常处理程序,当ARM  处理器发生异常时,程序计数器PC  会被强制设置为对应 

的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。 



2.7   本章小节 



    本章对ARM  微处理器的体系结构、寄存器的组织、处理器的工作状态、运行模式以及处理器 

异常等内容进行了描述,这些内容也是ARM 体系结构的基本内容,是系统软、硬件设计的基础。 


----------------------- 页面 25-----------------------

                    ARM 应用系统开发详解──基于S3C4510B 的系统设计                           1 



             第3 章  ARM 微处理器的指令系统 



    本章介绍ARM 指令集、Thumb 指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希 

望读者能了解ARM 微处理器所支持的指令集及具体的使用方法。 

    本章的主要内容有: 

    -  ARM 指令集、Thumb 指令集概述。 

    -  ARM 指令集的分类与具体应用。 

    -  Thumb 指令集简介及应用场合。 



3.1   ARM 微处理器的指令集概述 



3.1.1  ARM 微处理器的指令的分类与格式 



    ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果 

都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 

    ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、 

加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表3-1所示(表中指令 

为基本ARM指令,不包括派生的ARM指令)。 



                            表3-1   ARM 指令及功能描述 



         助记符                                指令功能描述 



  ADC                  带进位加法指令 



  ADD                  加法指令 



  AND                  逻辑与指令 



  B                    跳转指令 



  BIC                  位清零指令 



  BL  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -