ARM_Cortex-M3内核结构
更新时间:2023-06-05 18:53:01 阅读量: 实用文档 文档下载
- armco公司推荐度:
- 相关推荐
2.1.1 概述
ARM Cortex-M3 内核结构
ARM Cortex-M3 处理器简介
ARM公司成立于上个世纪九十年代初,致力于处理器内核研究,ARM 即 Advanced RISC Machines
的缩写,ARM公司本身不生产芯片,只设计内核,靠转让设计许可,由合作伙伴公司来生产各具特色的 芯片。这种运行模式运营的成果受到全球半导公司以及用户的青睐。目前ARM体系结构的处理器内核有: ARM7TDMI、ARM9TDMI、ARM10TDMI、ARM11以及Cortex等。2005年ARM推出的ARM Cortex系列内核,分别
为:A系列、R系列和M系列,其中A系列是针对可以运行复杂操作系统(Linux、Windows CE、Symbian 等)的处理器;R系列是主要针对处理实时性要求较高的处理器(汽车电子、网络、影像系统);M系列 又叫微控制器,对开发费用敏感,对性能要求较高的场合。
Cortex-M系列目前的产品有M0、M1、M3,其中M1用在FPGA中。Cortex-M系列对微控制器和低成本应 用提供优化,具有低成本、低功耗和高性能的特点,能够满足微控制器设计师进行创新设计的需求。其 中,ARM Cortex-M3处理器的性能是ARM7的两倍,而功耗却只有ARM7的1/3,适用于众多高性能、极其低 成本需求的嵌入式应用,如微控制器、汽车系统、大型家用电器、网络装置等,ARM Cortex-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.1 Cortex-M3 内核方框图
1.处理器内核
Cortex-M3处理器内核采用ARMv7-M架构,其主要特性如下:
Thumb-2指令集架构(ISA)的子集,包含所有基本的16位和32位Thumb-2指令; 哈佛处理器架构,在加载/存储数据的同时能够执行指令取指; 带分支预测的三级流水线; 32位单周期乘法; 硬件除法;
Thumb状态和调试状态;
处理模式和线程模式; 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 总线(AMBA v2.0)上执行。跟踪端口接口单元(TPIU)和厂商特定的 外围器件都在这条总线上。 注:处理器包含一条内部专用外设总线,用来访问嵌套向量中断控制器(NVIC)、数据观察点和 触发(DWT)、Flash 修补和断点(FPB),以及存储器保护单元(MPU)。
4.FPB
FPB单元实现硬件断点以及从代码空间到系统空间的修补访问,FPB有8个比较器。
5.DWT
数据观察点和跟踪,调试功能部件。
6.ITM
ITM是一个应用导向(application driven)的跟踪源,支持对应用事件的跟踪和printf类型的调 试。
7.MPU
存储器保护单元(MPU)是用来保护存储器的一个元件。处理器支持标准的ARMv7“受保护的存储器 系统结构”(PMSA)模型。如果希望向处理器提供存储器保护,则可以使用可选的MPU;MPU对访问允许 和存储器属性进行检验。它包含8个区和一个可选的执行默认存储器映射访问属性的背景区。
8.ETM
ETM支持指令跟踪的低成本跟踪宏单元。
9.TPIU
TPIU用作来自ITM和ETM(如果存在)的Cortex-M3内核跟踪数据与片外跟踪端口分析仪之间的桥接。
10.SW/JTAG-DP
Cortex-M3处理器可配置为具有SW-DP或JTAG-DP调试端口的接口,或两者都有。这两个调试端口提 供对系统中包括处理器寄存器在内的所有寄存器和存储器的调试访问。
2.2 内核寄存器组织
如图 2.2 所示,Cortex_M3 内核寄存器分为 16 个通用寄存器 R0~R15 和 7 个特殊功能寄存器。
低 寄 存 器
MSP PSP
通 用 寄 存 器
高 寄 存 器
特 殊 功 能 寄 存 器
图 2.2 寄存器组织图
2.2.1 通用寄存器 R0-R15
R0~R12 寄存器:是真正意义上的通用。在处理器运行过程中,作数据的寄存。
R13 为堆栈指针寄存器:堆栈指针是用于访问堆栈,也即系统的 RAM 区。Cortex_M3 中采用了两个 堆栈指针:主堆栈指针(MSP)和进程堆栈指针(PSP),R13 在任何时刻只能是其中一个,默认情况为 MSP,可以通过控制寄存器(CONTORL)来改变。Cortex_M3 中堆栈方向是向低地址方向增长,为满堆栈 机制。堆栈操作是通过 PUSH 和 POP 来完成操作的。
例如 MSP 当前指针指向:0x2000_000C;R0=0x00000000。
执行:PUSH R0
此时 MSP 指向:0x2000_0008 执行示意如图 2.3 所示。
RAM
RAM 向 下 生 长
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.1 xPSR 寄存器
xPSR 寄存器的各位的功能如表 2.2:
表 2.2 xPSR 寄存器各位功能
中断屏蔽寄存器:分为三组,分别是 PRIMASK、FAULTMASK、BASEPRI。
PRIMASK 为片上外设总中断开关,该寄存器只有位 0 有效,当该位为 0 是响应所有外设中断;当该 位为 1 时屏蔽所有片上外设中断。
FAULTMASK 寄存器管理系统错误的总开关,该寄存器中有位 0 有效,当该位为 0 时,响应所有的异 常;为 1 屏蔽所有的异常。
BASEPRI 寄存器用来屏蔽优先级等于和小于某一个中断数值的寄存器。 控制寄存器:CONTROL 有两个作用,其一用于定义处理器特权级别,其二用于选择堆栈指针,如表 3.3 所示。
表 2.3 CONTROL 寄存器
CONTROL[0]:异常情况下,处理器总是处于特权模式,CONTROL[0]位总是为 0;在线程模式情况下 (非异常情况),处理器可以工作在特权级也可工作在用户级,该位可为 0 或 1。特权级下所有的资源 都可以访问,而用户级下被限制的资源不能访问,比如 MPU 被限制的资源。 CONTROL[1]:为 0 时,只使用 MSP,此时用户程序和异常共享同一个堆栈,处理器复位后默认的也 是该模式。为 1 时,用户应用程序使用进程堆栈 PSP,而中断任然得使用主堆栈 MSP。这种双堆栈机制, 特别适合在带有 OS(操作系统)的环境下使用,只要 OS 内核在特权级下执行,而用户应用程序在用户 模式下执行,就可很好的将代码隔离互不影响。
2.3 处理器操作模式
ARM Cortex-M3支持2个模式和两个特权等级。如图2.4所示,在嵌入式系统应用程序中,程序代
码 涉及异常服务程序代码和非异常服务程序代码,这些代码可以工作在处理器特权级也可以工作在用户级 级,但有区别。当处理器处在线程模式下时,既可以使用特权级,也可以使用用户级;另一方面,handler 模式总是特权级的。在复位后,处理器进入线程模式+特权级。
特权级
用户级 主应用程序的代码
异常 handler 的代码
图 2.4 操作模式和特权等级
在线程模式+用户级下,对系统控制空间(SCS,0xE000E000~0xE000EFFF,包括NVIC、SysTick、
MPU以及代码调试控制所用的寄存器)的访问将被禁止。除此之外,还禁止使用MRS/MSR访问,除了APSR 之外的特殊功能寄存器。如果操作,则对于访问特殊功能寄存器的,访问操作被忽略;而对于访问SCS 空间的,将产生错误。
在特权级下不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回 后,系统将回到产生异常时所处的级别,同时特权级也可通过置位CONTROL[0]来进入用户级。用户级下 的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,来修改CONTROL[0], 才能在返回到线程模式后进入特权级。如图2.5所示。
特权级 handler
图 2.5 处理器模式转换图
把代码按特权级和用户级分开处理,有利于使Cortex-M3的架构更加稳定可靠。例如,当某个用
户 程序代码出问题时,可防止处理器对系统造成更大的危害,因为用户级的代码是禁止写特殊功能寄存器 和NVIC中寄存器的。另外,如果还配有MPU,保护力度就更大,甚至可以阻止用户代码访问不属于它的 内存区域。
在引入了嵌入式实时操作系统中,为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给 应用程序专门配一个堆栈,不让它共享操作系统内核的堆栈。在这个管理制度下,运行在线程模式的用 户代码使用PSP,而异常服务例程则使用MSP。这两个堆栈指针的切换是智能全自动的,在异常服务的始 末由Cortex-M3硬件处理。
如前所述,特权等级和堆栈指针的选择均由CONTROL负责。 当CONTROL[0]=0,在异常处理的始末,只发生了处理器模式的转换,如图2.6所示。 若CONTROL[0]=1(线程模式+用户级),则在中断响应的始末,处理器模式和特权等级都要发生变
化,如图2.7所示。 CONTROL[0]只有在特权级下才能访问。用户级的程序如想进入特权级,通常都是
使用一条“系
统服务呼叫指令(SVC)”来触发“SVC异常”,该异常的服务例程可以视具体情况而修改CONTROL[0]。
图 2.6 中断前后的状态转换
图 2.7 中断前后的状态转换+特权等级切换
2.4 存储器系统
2.4.1 存储器映射
Cortex-M3 采用了固定的存储映射结构,如图 2.8 所示。
Cortex-M3 的地址空间是 4GB, 程序可以在代码区,内部 SRAM 区以及外部 RAM 区中执行。但是因为 指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用己的总 线。
内部 SRAM 区的大小是 512MB,用于让芯片制造商连接片上的 SRAM,这个区通过系统总线来访问。 在这个区的下部,有一个 1MB 的区间,被称为“位带区”。该位带区还有一个对应的 32MB 的 “位带别 名(alias)区”,容纳了 8M 个“位变量”(对比 8051 的只有 128 个位变量),位带区对应的是最低的 1MB 地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适 用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中, 像访问普通内存一样地使用它们。位带别名区中的访问操作是原子的,消灭了传统的“读-改-写”三 步。
0xFFFFFFFF
0xE0100000 0xE00FFFFF 0xE0040000
0xE003FFFF
0xE0000000 0xDFFFFFFF
0xA0000000 0x9FFFFFFF
0x43FFFFFF
0x42000000 0x41FFFFFF
0x40100000 0x40000000
0x60000000 0x5FFFFFFF
0x40000000 0x3FFFFFFF
0x20000000 0x1FFFFFFF
0x00000000
0x23FFFFFF
0x22000000
0x21FFFFFF
0x20100000 0x20000000
图 2.8 Cortex-M3 存储器映射图
片上外设对应 512MB 的空间,芯片上所有与外围设备相关的寄存器都位于该区域。这个区中也有一
条 32MB 的位带别名,以便于快捷地访问外设寄存器,用法与内部 SRAM 区中的位带相同。例如,可以方 便地访问各种控制位和状态位。要注意的是,外设区内不允许执行指令。通常半导体厂商就是修改此区 域的片上外设,来达到各具特色的、个性化的设备。
还有两个 1GB 的范围,分别用于连接外部 RAM 和外部设备,它们之中没有位带。两者的区别在于外 部 RAM 区允许执行指令,而外部设备区则不允许。 最后还剩下 0.5GB 的隐秘地带,包括了系统级组件,内部私有外设总线,外部私有外设总线,以及 由提供者定义的系统外设。
私有外设总线有两条: AHB 私有外设总线,只用于 CM3 内部的 AHB 外设,它们是:NVIC, FPB, DWT 和 ITM。 APB 私有外设总线,既用于 CM3 内部的 APB 设备,也用于外部设备(这里的“外部”是对内核而言)。 Cortex-M3 允许器件制造商再添加一些片上 APB 外设到 APB 私有总线上,它们通过 APB 接口来访问。
NVIC 所处的区域叫做“系统控制空间(SCS)”,在 SCS 里的除了 NVIC 外,还有 SysTick、MPU 以 及代码调试控制所用的寄存器。
最后,未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。
2.4.2 位带操作
在Cotex-M3存储器映射中包括两个位操作区。分别位于SRAM和片上外设存储区的最低1MB空间中。 这两个位带中的地址除了可以像普通的RAM一样使用外,它们还都有自己的“位带别名区”,位带别名 区把每个比特膨胀成一个32位的字形成位地址。当你通过位带别名区访问这些字时,就可以达到访问原 始比特的目的,其对应关系如图2.8所。
位地址与位别名对应关系统如下: 对于 SRAM 位带区的某个位:
Aliasaddr 0x22000000 ((A 0x20000000) 8 n) 4
0x22000000 ( A 0x20000000) 32 n 4
对于片上外设位带区的某个位:
Aliasaddr 0x42000000 ((A 0x40000000) 8 n) 4
0x42000000 ( A 0x40000000) 32 n 4
在上述表达式中,A 表示要操作的位所在的字节地址,n(0≤n≤7)表示位序号。
2.9 位操作对应关系图
举例:将地址 0x20000000 的第 2 位置 1。通过上述计算关系,可计算出位带别名为 0x22000008。 如程序清单 L2.1 所示。
程序清单 L2.1 SRAM 位操作实例
LDR R0,=0x22000008
LDR R1,=0x01 STR R1,[R0]
将片上外设 I/O 端口的 A 口的第 0 位(也即 PORTA0)为输出,其 A 口的方向寄存器地址为 0x40004400, 设置 1 作为输出,可根据上述关系计算出位带别名为 0x42088000。如程序清单 L2.2 所示。
程序清单 L2.2 片上外设位操作实例
LDR R0,=0x42088000 LDR R1,=0x01 STR R1,[R0]
注:采用大端格式时,对位邦定别名区的访问必须以字节方式,否则访问不可预知。
2.5 异常
ARM Cortex-M3 中异常涉及异常的类型、优先级、向量表等,本节并以 Luminary 系列微控制器为 例
说明异常的具体行为。
2.5.1 异常类型
在 Cortex-M3 中有 一个 与内 核紧 耦 合部 件叫 嵌套向 量 中断 控制 器( NVIC, Nested Vectored Interrupt Controller),定义了 16 种系统异常和 240 路外设中断。通常芯片设计者可自由设计片上外 设,因此具体的片上外设中断都不会用到多达 240 路。如表 2.4 所示系统异常类型,表 2.5 所示为外设 中断类型。
Cortex-M3 中目前只有 11 种系统异常可用分别是:系统复位、NMI(不可屏蔽中断)、硬件故障、 存储器管理、总线故障、用法故障、SVCall(软件中断)、调试监视器中断、PendSV(系统服务请求)、 SysTick(24 位定时器中断)。240 路外设中断,是指片上外设的各模块,比如 I/O 口、UART 通信接口、 SSI 总线接口等所需的中断。
表 2.4 异常类型
表 2.5 中断类型
2.5.2 优先级
Cortex-M3 的异常功能非常强大,机制非常灵活,异常可以通过占先、末尾连锁和迟来等处理来降 低中断的延迟。优先级决定了处理器何时以及怎样处理异常。
Cortex-M3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持 128 级抢占,绝大多 数芯片都会精简设计,实际中支持的优先级数会更少,如 8 级、16 级、32 级等,通常的做法是裁掉表 达优先级的几个低端有效位(防止优先级反转),以减少优先级的级数。比如 Luminary 的芯片采用 8 级优先级。
Cortex-M3 中 NVIC 支持由软件指定的可配置的优先级(称为软件优先级),其寄存器地址为: 0xE000_E400-0xE000_E4EF。通过对中断优先级寄存器的 8 位 PRI_N 区执行写操作,来将中断的优先级 指定为 0-255。硬件优级随着中断中的增加而降低。0 优先级最高,255 优先级最低。指定软件优先级 后,硬件优先级无效。例如:如果将 INTISR[0]指定为优先级 1,INTISR[31]指定为优先级 0,则 INTISR[0] 的优先级比 INTISR[31]低。 为了对具有大量中断的系统加强优先级控制,Cortex-M3 支持优先级分组,通过 NVIC 控制,设置 为占先优先级和次优先级。可通过对应用程序中断及复位控制寄存器(AIRCR,地址为:0xE000_ED00) 的[10:8]位进行设置。如果有多个激活异常共用相同的组优先级,则使用次优先级区来决定同组中的异 常优先级,这就是同组内的次优先级。如表 2.6 应用程序中断及复位控制寄存器,表 2.7 为占先优先级
和次优级的关系。
表 2.6 应用程序中断及复位控制寄存器(AIRCR,地址:0xE000ED00)
表 2.7 抢占优先级和次优先级分组位置的关系
器的优先级,则寄存器的低位始终为 0,例如,如果使用 3 个位来配置优先级,则 PRI_N[7:5]用来配置 优先级,而 PRI_N[4:0]为 4‵b0000。
2.5.3 中断向量表
当发生了异常并且要响应它时,Cortex-M3 需要定位其服务例程的入口地址。这此入口地址存储在 所谓“异常向量表”中。缺省情况下,
Cortex-M3 认为该表位于零地址处,且各向量占用 4 字节。因此 每个表项占用 4 字节,复位后的向量表如表 2.8 所列。
表 2.8 复位后向量表
向量表
的基地址可以通过 NVIC 中的向量偏移寄存器(0xE000ED08)来设置,如表 2.9 所示。从表 中可以看出,可以将异常向量表放在 Code 区也可以将其放在 RAM 区,起始地址也可改变,起始地址是 有要求的:必须先求出系统中共有多少个向量,再把这个数字向上记到 2 的整次幂,而起始地址必须对 齐到后者的边界上。例如,如果一共有 32 个中断,则共有 32+16(系统异常)=48 个向量,向上记到 2 的整数次幂后值为 64,因此向量表重定位的地址必须能被 64 X 4=256 整除。
表 2.9 向量偏移量寄存器(0xE000ED08)
向量表中至少需要有 4 个值:栈顶地址;复位程序的位置;NMI 异常的位置;硬故障的异常的位置。
当中断使能时,不管向量表的位置在哪,它指向所有使能屏蔽的异常。并且如果使用 SVC 指令,还 需要指定 SVCCall ISR 的位置。
2.5.4 异常的进入与退出
1.异常进入
入栈:当处理器发生异常时,首先自动把 8 个寄存器(xPSR、PC、LR、R12、R3、R2、R1、R0)压 入栈,处理器自动完成,在自动入栈的过程中,把寄存器写入栈的时间顺序,并不是写入空间相对应的, 但机器会保证正确的寄存器被保存到正确的位置,如图 2.10 所示,假设入栈,栈地址为 N。
地址
数据
时间
2.10 内部入栈示意图
取向量:发生异常,紧接着内核将根据向量表找出正确的异常向量,然后在服务程序的入口处预取 指,处理器将取指与取数据分别能过总线控制,使入栈与取指这两项工作能同时进行,以便快速进入中 断。
更新寄存器:入栈和取向量操作完成之后,在执行服务程序之前,还必须更新一系列寄存器。 SP:在入栈后会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程时,将由MSP负责对堆 栈的访问。
PSR:更新IPSR位段(地处PSR的最低部分)的值为新响应的异常编号。 PC:在取向量完成后,PC将指向服务例程的入口地址, LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”,在异常进 入时由系统计算并赋给LR,并在异常返回时使用它。 以上是在响应异常时通用寄存器及特殊功能寄
存器的变化。另外在NVIC中,也会更新若干个相关寄 存器。
2.异常退出
当异常服务程序最后一条指令将进入异常时的 LR 的值加载到 PC 中。该操作指示中断服务结束,在 从异常返回时处理器将执行下列操作之一:
如果激活异常的优先级比所有被压栈(等待处理)的异常的优先级都高,则处理器会末尾连锁到一 个激活异常。
如果没有激活异常,或者如果被压栈的异常的最高优先级比激活异常的最高优先级要高,则处理器 返回到上一个被压栈的中断服务程序。
如果没有激活的中断或被压栈的异常,则处理器返回线程模式。 在启动了中断返回序列后,下述的处理就将进行: 出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改
回先前的值。
更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再 次被置为有效,悬起位也将再次置位,新一次的中断响应序列也可随之再次开始。
异常返回值:异常返回值存放在LR中。这是一个高28位全为1的值,只有[3:0]的值有特殊含义,如 表2.10所示。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由 Cortex-M3自动设置的,所以只要没有特殊需求,就不要改动它。
表 2.10 EXC_RETURN 各位含义
因此,上述表格中EXC_RETURN的值有三种情况: 0xFFFF_FFF1:返回处理器模式;
0xFFFF_FFF9:返回线程模式,并使用主堆栈;
0xFFFF_FFFD:返回线程模式,并使用线程堆栈。 例如系统中使用了PendSV异常,服务程序结束时由处理模式返回到线程模式前使用进程堆栈,如 程序清单L2.3所示。
程序清单 L2.3 异常返回类型实例
OSPendSV
LDR LR,=0Xfffffffd BX LR
;异常服务程序
;返回到线程模式进程堆栈
2.5.5 Cortex-M3 异常处理机制
1.末尾连锁
末尾连锁能够在两个中断之间没有多余的状态保存和恢复指令的情况下实现异常背对背处理。如图 2.11 所示。在退出 ISR 并进入另一个中断时,处理器省略了 8 个寄存器的出栈和入栈操作。如果当前 挂起中断的优先级比所有被压栈的异常的优先级都高。则处理器执行末尾连锁机制。如果挂起中断的优 先级比被压栈的异常的最高优先级都高,则省略压栈和出栈操作,处理器立即取出挂起的中断向量。在 退出前一个 ISR 之后,开始执行被末尾连锁的 ISR。
图 2.11 末尾连锁示意图
2.异常迟来
在 Cortex-M3 中迟来中断的意思是如果前一个 ISR 还没有进入执行阶段,并且迟来中断的优先级比 前一个中断的优先级要高,则迟来中断能够抢占前一个中断。如图 2.12 所示。
图 2.12 迟来异常示意图
响应迟来中断时需执行新的取向量地址和 ISR 预取操作。迟来中断不保存状,因为状态保存已经被
最初的中断执行过了,因此不需要重复执行。
2.5.6 嵌套向量中断控制器
嵌套向量中断控制器,简称NVIC,完成对中断的响应。NVIC共支持1至240个外部中断输入(通常外 部中断写作IRQs)。具体的数值由芯片厂商在设计芯片时决定。
NVIC的访问地址是0xE000_E000。所有NVIC的中断控制/状态寄存器都只能在特权级下访问。不过有 一个例外软件触发中断寄存器可以在用户级下访问以产生软件中断。所有的中断控制、状态寄存器均可 按字、半字、字节的方式访问。
中断配置内容:
使能与禁止寄存器 挂起与解挂寄存器 优先级寄存器
活动状态寄存器 另外,下列寄存器也对中断
处理有重大影响: 异常掩蔽寄存器 向量表偏移寄存器 软件触发中断寄存器 优先级分组寄存器 Cortex-M3 中异常及中断的行为如图 2.13 所示。分成三级,由 NVIC 负责管理。
图 2.13 异常和中断控制示意图
1.中断的使能与禁止
此处的中断使能与禁止,主要是针对片上外设 240 路中断的控制,使能是向 SETENA 寄存器对应位 写“1”,禁止是向 CLRENA 寄存器对应位写“1”。如表 2.11 所示。
表 2.11 SETENA/CLRENA 寄存器族
在 Luminary 系列的单片机中,片上外设中断对应编号如 2.12 表所示:
表 2.12 Luminary 单片机外设中断源
中断使能设置寄存器 0 的位 0 对应外部中断 0 号(GPIOA 中断),位 1 对应外部中断 1 号(GPIOB 中断), 依此类推,如表 3.2 所示。
例如使能外部中断 2 的操作,如程序清单 L2.3 所示。
程序清单 L2.3 使能外部中断
#define HWREG(x) #define NVIC_EN0
(*((volatile unsigned char *)(x))) 0xE000 E100
// IRQ0~IRQ31 中断使能设置寄存器
HWREG(NVIC_EN0)=1<<2; // 使能外部 2 号中断,即 GPIOC 中断
2.中断的挂起与解挂
当中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断
被挂起。中断的挂起状态可以通过“中断设置挂起寄存器(SETPEND)”和“中断解挂寄存器(CLRPEND)” 来读取,还可以写它们来手工挂起中断。 挂起寄存器和解挂寄存器也可以有8对,其用法与前面介绍的
使能、禁止能寄存器完全相同,见表2.13。
表 2.13 挂起与解挂寄存器
3.活动状态
每个外部中断都有一个活动状态位。在处理器执行了其ISR的第一条指令后,它的活动位就被置1,
并且直到ISR返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个ISR。然而,哪怕中断被抢 占,其活动状态也依然为1(请仔细琢磨前文讲到的“直到ISR返回时才清零)。活动状态寄存器的定义, 与前面讲的使能、禁止和挂起、解挂寄存器相同,只是不再成对出现。它们也能按字、半字、字节访问, 但他们是只读的,如表2.14所示。
表 2.14 活动状态
4.优先级
使用优先级寄存器将 0 到 255 个优先级分别分配给各个中断。0 代表最高优先级,255 则代表最代
优先级。
优先级寄存器首先存放最高位。当优先级值为 3 位时,存放在字节的位[7:5]中。这也意味着某个 应用即使不知道可能含有多少个优先级也可以正常工作。
从 0xE000_E400 开始的地址里,每一个字节对应一个外部中断,例如:0xE000_E400 对应外部中断 GPIOA、这个字节可以设置 GPIOA 的中断优先级、0xE000_E401 对应外部中断 GPIOB、这个字节可以设置 GPIOB 的中断优先级,依次类推。如表 2.15 所示。
正在阅读:
ARM_Cortex-M3内核结构06-05
131I-MIBG治疗神经母细胞瘤的机制、原理和现状10-26
受法规约束的GMP和GDP环境下数据管理和完整性优良规范(中英文)03-08
西南林业大学关于硕士专业学位研究生学位论文格式的统一要求02-02
案例分享:0glass的物联网机遇,掌握物联网成功的六个级别12-29
早会励志小故事五篇04-07
北师大版小学五年级数学上册教学计划08-01
苏教版一年级语文上册第四单元测试题05-07
描写家乡的作文300字(精选8篇)02-05
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 内核
- 结构
- Cortex
- ARM
- 数电电子拔河游戏机设计
- (简版)2010武汉市基准地价结果
- 浅析内部审计成果运用存在的问题及对策1
- 从青少年亚文化看当代中国青少年社会适应问题
- 肺腺鳞癌的临床分析
- 连铸坯低倍缺陷的产生原因及控制
- 2012学年度第二学期新政中心小学四年级2班班主任工作计划
- 大学英语四级听力重点场景词汇短语集合
- 2012年12月7日最新珠海北广州南轻轨时刻表
- 刑事诉讼法简答题(汇总)
- 小学生班级文明公约
- 第9讲 现代大学制度
- TL9000 Measurement Handbook.
- 中国现代文学名词解释
- 【优化指导】2015届高三人教版语文总复习 第3部分 第1章 第2节Word版含答案
- 23省份2011年平均工资排行
- 全套工程监理竣工预验收报告2
- 高一地理自然环境对人类活动的影响单元测试题
- 中国古代史的一般规律
- 宝洁公司财务分析