ARMCortex-M3内核结构2.1ARMCortex-M3处理器简介2.1.1概述ARM公司成立于上个世纪九十年代初,致力于处理器内核研究,ARM即AdvancedRISCMachines的缩写,ARM公司本身不生产芯片,只设计内核,靠转让设计许可,由合作伙伴公司来生产各具特色的芯片。这种运行模式运营的成果受到全球半导公司以及用户的青睐。目前ARM体系结构的处理器内核有:ARM7TDMI、ARM9TDMI、ARM10TDMI、ARM11以及Cortex等。2005年ARM推出的ARMCortex系列内核,分别为:A系列、R系列和M系列,其中A系列是针对可以运行复杂操作系统(Linux、WindowsCE、Symbian等)的处理器;R系列是主要针对处理实时性要求较高的处理器(汽车电子、网络、影像系统);M系列又叫微控制器,对开发费用敏感,对性能要求较高的场合。Cortex-M系列目前的产品有M0、M1、M3,其中M1用在FPGA中。Cortex-M系列对微控制器和低成本应用提供优化,具有低成本、低功耗和高性能的特点,能够满足微控制器设计师进行创新设计的需求。其中,ARMCortex-M3处理器的性能是ARM7的两倍,而功耗却只有ARM7的1/3,适用于众多高性能、极其低成本需求的嵌入式应用,如微控制器、汽车系统、大型家用电器、网络装置等,ARMCortex-M3提供了32位微控制器市场前所未有的优势。Cortex-M3内核,内部的数据路径为32位,寄存器为32位,存储器接口也是32位。Cortex-M3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问分开进行。Cortex-M3还提供一个可选的MPU,对存储器进行保护,而且在需要的情况下也可以使用外部的cache。另外在Cortex-M3中,存储器支持小端模式和大端存储格式。Cortex-M3内部还附赠了很多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。2.1.2内核结构组成及功能描述Cortex-M3微控制器内核包括处理核心和许多的组件,目的是用于系统管理和调试支持。如图2.1为Cortex-M3内核方框图。图2.1Cortex-M3内核方框图1.处理器内核Cortex-M3处理器内核采用ARMv7-M架构,其主要特性如下:Thumb-2指令集架构(ISA)的子集,包含所有基本的16位和32位Thumb-2指令;哈佛处理器架构,在加载/存储数据的同时能够执行指令取指;带分支预测的三级流水线;32位单周期乘法;硬件除法;Thumb状态和调试状态;NVICCM3核MPUFPBAHB-APDWTITMAPBETMTPIUROM表SW-DPJTAG-DP专用外设总线(外部)I-code总线D-code总线系统总线中断睡眠调试NMISLEEPINGSLEEPDEEP指令数据触发专用外设总线(内部)Cortex-M3中断号[239:0]总线矩阵总线矩阵Flash存储器SRAM可选配系统总线(AHB)静态RAM外部RAM控制器外部RAM外部设备AHBtoAPB总线外设总线UARTPWMTimerSysTickI/O处理模式和线程模式;ISR的低延迟进入和退出;可中断-可继续(interruptible-continued)的LDM/STM、PUSH/POP;支持ARMv6类型BE8/LE;支持ARMv6非对齐访问。2.NVIC(嵌套向量中断控制器)NVIC与处理器内核是紧密耦合的,这样可实现快速、低延迟的异常处理。在Cortex-M微控制器此功能非常强大。3.总线矩阵总线矩阵用来将处理器和调试接口与外部总线相连。处理器包含4个总线接口:ICode存储器接口:从Code存储器空间(0x0000000–0x1FFFFFFF)的取指都在这条32位AHBLite总线上执行。DCode存储器接口:对Code存储器空间(0x0000000–0x1FFFFFFF)进行数据和调试访问都在这条32位AHBLite总线上执行。系统接口:对系统空间(0x20000000–0xDFFFFFFF)进行取指、数据和调试访问都在这条32位AHBLite总线上执行。外部专用外设总线(PPB):对外部PPB空间(0xE0040000–0xE00FFFFF)进行数据和调试访问都在这条32位APB总线(AMBAv2.0)上执行。跟踪端口接口单元(TPIU)和厂商特定的外围器件都在这条总线上。注:处理器包含一条内部专用外设总线,用来访问嵌套向量中断控制器(NVIC)、数据观察点和触发(DWT)、Flash修补和断点(FPB),以及存储器保护单元(MPU)。4.FPBFPB单元实现硬件断点以及从代码空间到系统空间的修补访问,FPB有8个比较器。5.DWT数据观察点和跟踪,调试功能部件。6.ITMITM是一个应用导向(applicationdriven)的跟踪源,支持对应用事件的跟踪和printf类型的调试。7.MPU存储器保护单元(MPU)是用来保护存储器的一个元件。处理器支持标准的ARMv7“受保护的存储器系统结构”(PMSA)模型。如果希望向处理器提供存储器保护,则可以使用可选的MPU;MPU对访问允许和存储器属性进行检验。它包含8个区和一个可选的执行默认存储器映射访问属性的背景区。8.ETMETM支持指令跟踪的低成本跟踪宏单元。9.TPIUTPIU用作来自ITM和ETM(如果存在)的Cortex-M3内核跟踪数据与片外跟踪端口分析仪之间的桥接。10.SW/JTAG-DPCortex-M3处理器可配置为具有SW-DP或JTAG-DP调试端口的接口,或两者都有。这两个调试端口提供对系统中包括处理器寄存器在内的所有寄存器和存储器的调试访问。2.2内核寄存器组织如图2.2所示,Cortex_M3内核寄存器分为16个通用寄存器R0~R15和7个特殊功能寄存器。图2.2寄存器组织图2.2.1通用寄存器R0-R15R0~R12寄存器:是真正意义上的通用。在处理器运行过程中,作数据的寄存。R13为堆栈指针寄存器:堆栈指针是用于访问堆栈,也即系统的RAM区。Cortex_M3中采用了两个堆栈指针:主堆栈指针(MSP)和进程堆栈指针(PSP),R13在任何时刻只能是其中一个,默认情况为MSP,可以通过控制寄存器(CONTORL)来改变。Cortex_M3中堆栈方向是向低地址方向增长,为满堆栈机制。堆栈操作是通过PUSH和POP来完成操作的。例如MSP当前指针指向:0x2000_000C;R0=0x00000000。执行:PUSHR0此时MSP指向:0x2000_0008执行示意如图2.3所示。R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)MSPPSP低寄存器高寄存器xPSRPRIMASKFAULTMASKBASEPRICONTROL通用寄存器特殊功能寄存器状态寄存器中断屏蔽寄存器控制寄存器2.3堆栈操作示意图R14程序连接寄存器(LR):在执行分支(B)和链接(BL)指令或带有交换分支(BX)和链接指令(BLX)时,PC的返回地址自动保存进LR。比如在子程序调用时用保存子程序的返回地址。LR也用于异常返回,但是在这里保存的是返回后的状态,不是返回的地址,异常返回是通过硬件自动出栈弹出之前压入的PC完成的。R15程序计数器(PC):是程序运行的基础,具有自加的功能。该寄存器的位0始终为0,因此,指令始终与字或半字边界对齐。2.2.2特殊功能寄存器特殊功能寄存器分为程序状态寄存器、中断屏蔽寄存器和控制寄存器三类。xPSR程序状态寄存器:系统级的处理器状态可分为3类,应用状态寄存器(APSR)、中断状态寄存器(IPSR)、执行状态寄存器(EPSR),可组合起来构成一个32位的寄存器,统称xPSR。表2.1xPSR寄存器寄存器名位313029282726:252423:2019:1615:10987654:0APSRNZCVQIPSR中断编号EPSRICI/ITTICI/ITxPSR寄存器的各位的功能如表2.2:表2.2xPSR寄存器各位功能位名称定义31N负数或小于标志:1:结果为负数或小于;0结果为正数或大于30Z零标志:1:结果为0;0:结果为非029C进位/借位标志:1:进位或借位;0没有进位或借位28V溢出标志:1:溢出;0:没有溢出0x2000_000C已使用已使用上次压入的数据未用未用已使用已使用已使用0x00000000未用MSPRAMRAM0x2000_0008MSP向下生长27Q粘着饱和标志:1:已饱和;0:没有饱和26:2515:10ITIF-Then位。它们是if-Then指令的执行状态位。包含if-Then模块的指令数目和它们的执行条件24T用于指示处理器当前是ARM状态还是Thumb状态15:12ICI可中断-可继续的指令位:如果在执行LDM或STM操作时产生一次中断,则LDM或STM操作暂停,该位来保存该操作中下一个寄存器操作数的编号,在中断响应之后,处理器返回由该位指向的寄存器并恢复操作。8:0ISR占先异常的编号中断屏蔽寄存器:分为三组,分别是PRIMASK、FAULTMASK、BASEPRI。PRIMASK为片上外设总中断开关,该寄存器只有位0有效,当该位为0是响应所有外设中断;当该位为1时屏蔽所有片上外设中断。FAULTMASK寄存器管理系统错误的总开关,该寄存器中有位0有效,当该位为0时,响应所有的异常;为1屏蔽所有的异常。BASEPRI寄存器用来屏蔽优先级等于和小于某一个中断数值的寄存器。控制寄存器:CONTROL有两个作用,其一用于定义处理器特权级别,其二用于选择堆栈指针,如表3.3所示。表2.3CONTROL寄存器位功能CONTROL[1]堆栈指针选择0:选择主堆栈指针MSP1:选择进程堆栈指针PSPCONTROL[0]0:特权级1:用户级CONTROL[0]:异常情况下,处理器总是处于特权模式,CONTROL[0]位总是为0;在线程模式情况下(非异常情况),处理器可以工作在特权级也可工作在用户级,该位可为0或1。特权级下所有的资源都可以访问,而用户级下被限制的资源不能访问,比如MPU被限制的资源。CONTROL[1]:为0时,只使用MSP,此时用户程序和异常共享同一个堆栈,处理器复位后默认的也是该模式。为1时,用户应用程序使用进程堆栈PSP,而中断任然得使用主堆栈MSP。这种双堆栈机制,特别适合在带有OS(操作系统)的环境下使用,只要OS内核在特权级下执行,而用户应用程序在用户模式下执行,就可很好的将代码隔离互不影响。2.3处理器操作模式ARMCortex-M3支持2个模式和两个特权等级。如图2.4所示,在嵌入式系统应用程序中,程序代码涉及异常服务程序代码和非异常服务程序代码,这些代码可以工作在处理器特权级也可以工作在用户级级,但有区别。当处理器处在线程模式下时,既可以使用特权级,也可以使用用户级;另一方面,handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。图2.4操作模式和特权等级在线程模式+用户级下,对系统控制空间(SCS,0xE000E000~0xE000EFFF,包括NVIC、SysTick、MPU以及代码调试控制所用的寄存器)的访问将被禁止。除此之外,还禁止使用MRS/MSR访问,除了APSR之外的特殊功能寄存器。如果操作,则对于访问特殊功能寄存器的,访问操作被忽略;而对于访问SCS空间的,将产生错误。在特权级下不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别,同时特权级也可通过置位CONTROL[0]来进入用户级。用户级下的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,来修改CONTROL[0],才能在返回到线程模式后进入特权级。如图2.5所示。图2.5处理