Cortex-M3概述
作者:互联网
0. 简介
Cortex‐M3 是一个32 位处理器内核。内部的数据路径是32 位的,寄存器是32 位的,存储器接口也是32 位的。CM3 采用了哈佛结构,拥有独立的指令总线和数据总线。指令总线和数据总线共享一个4GB的存储系统。
对于那些需要更多存储系统功能的复杂应用,Cortex‐M3处理器有一个可选配的MPU,如果需要还可以使用外部缓存cache。Cortex‐M3对于小端和大端存储系统都是支持的。
1. 寄存器组
Cortex‐M3 处理器拥有R0‐R15 的寄存器组。其中R13 作为堆栈指针SP。SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。
1.1. R0-R12:通用寄存器
R0‐R12 都是32 位通用寄存器,用于数据操作。但是注意:绝大多数16 位Thumb 指令只能访问R0‐R7,而32 位Thumb‐2 指令可以访问所有寄存器。
1.2. R13:MSP/PSP堆栈指针
Cortex‐M3 拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
- 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
- 进程堆栈指针(PSP):由用户的应用程序代码使用。
堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节对齐的。
在ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。
1.3. R14:连接寄存器LR
当呼叫一个子程序时,由R14 存储返回地址。
1.4. R15:程序计数器PC
指向当前的程序地址。如果修改它的值,就能改变程序的执行流。
1.5. 特殊功能寄存器
Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括:
- 程序状态字寄存器组(PSRs)
- 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)
- 控制寄存器(CONTROL)
寄存器及其功能:
寄存器 | 功能 |
---|---|
xPSR | 记录ALU 标志(0 标志,进位标志,负数标志,溢出标志),执行状态,以及当前正服务的中断号。 |
PRIMASK | 除能所有的中断,除了不可屏蔽中断(NMI)和 硬件故障(HardFault)。 |
FAULTMASK | 除能所有的中断,除了不可屏蔽中断(NMI)。而且被除能的faults会“上访”。 |
BASEPRI | 除能所有优先级不高于某个具体数值的中断。 |
CONTROL | 定义特权状态和堆栈指针选择(MSP、PSP)。 |
2. 操作模式和特权极别
Cortex‐M3 处理器支持两种处理器的操作模式,还支持两级特权级别。
引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码(包括中断服务例程的代码和系统异常服务例程)。
- 处理者模式(handler mode)
- 线程模式(thread mode)
Cortex‐M3 的另一个侧面则是特权的分级——特权级和用户级。
- 特权级(privilege level)
- 用户级(user level)
这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。
在CM3 运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器(如果有MPU,还要在MPU规定的禁地之外),并且可以执行所有指令。
在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写CONTROL 寄存器就回到特权级,它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发SVC 异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改CONTROL 寄存器,才能在用户级的线程模式下重新进入特权级。
事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态。
通过引入特权级和用户级,就能够在硬件水平上限制某些不受信任的或者还没有调试好的程序,不让它们随便地配置涉及要害的寄存器,因而系统的可靠性得到了提高。进一步地,如果配了MPU,它还可以作为特权机制的补充——保护关键的存储区域不被破坏,这些区域通常是操作系统的区域。
举例来说,操作系统的内核通常都在特权级下执行,所有没有被MPU 禁掉的存储器都可以访问。在操作系统开启了一个用户程序后,通常都会让它在用户级下执行,从而使系统不会因某个程序的崩溃或恶意破坏而受损。
3. 内建的嵌套向量中断控制器
Cortex‐M3内建的嵌套向量中断控制器NVIC(Nested Vectored Interrupt Controller),包含如下功能:
- 可嵌套中断支持
- 向量中断支持
- 动态优先级调整支持
- 中断延迟大大缩短
- 中断可屏蔽
3.1. 可嵌套中断支持
可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在xPSR 的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常——即立即抢占。
3.2. 向量中断支持
当开始响应一个中断后,CM3 会自动定位一张向量表,并且根据中断号从表中找出ISR 的入口地址,然后跳转过去执行。不需要像以前的ARM 那样,由软件来分辨到底是哪个中断发生了,也无需半导体厂商提供私有的中断控制器来完成这种工作。这么一来,中断延迟时间大为缩短。
3.3. 动态优先级调整支持
软件可以在运行时期更改中断的优先级。如果在某ISR 中修改了自己所对应中断的优先级,而且这个中断又有新的实例处于悬起中(pending),也不会自己打断自己,从而没有重入(reentry)风险。
所谓的重入,就是指某段子程序还没有执行完,就因为中断或者是多任务操作系统的调度原因,导致该子程序在一个新的寄存器上下文中被执行(请不要把重入与递归混淆,它们有本质的区别)。这种情况常常会闹出乱子,因此有“可重入性”的研究。
3.4. 中断延迟大大缩短
Cortex‐M3 为了缩短中断延迟,引入了好几个新特性。包括自动的现场保护和恢复,以及其它的措施,用于缩短中断嵌套时的ISR 间延迟。
3.5. 中断可屏蔽
既可以屏蔽优先级低于某个阈值的中断/异常(设置BASEPRI 寄存器),也可以全体封杀(设置PRIMASK 和FAULTMASK 寄存器)。这是为了让时间关键(time‐critical)的任务能在死线(deadline)到来前完成,而不被干扰。
4. 存储器映射
Cortex‐M3有一个预定义的存储器映射。4GB的存储器空间被划分成若干区域。
Cortex-M3将片上外设的寄存器映射到外设区,以简单地访问内存的方式来访问这些外设的寄存器,从而控制外设的工作。这种预定义的映射关系,可高度地优化访问速度。
5. 总线接口
Cortex‐M3内部有若干个总线接口,以使CM3 能同时取址和访内(访问内存),它们是:
- 代码存储区总线
- 系统总线
- 私有外设总线
两条代码存储区总线:I‐Code总线、D‐Code总线。前者用于取指,后者用于查表等操作。
系统总线用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。
私有外设总线提供部分系统级存储区的访问,主要是私有外设例如调试组件。
6. 存储器保护单元(MPU)
Cortex‐M3有一个可选的存储器保护单元。配上它之后,就可以对特权级访问和用户级访问分别施加不同的访问限制。当检测到violated时,MPU 就会产生一个fault异常,可以由fault异常的服务例程来分析该错误,并且在可能时改正它。
MPU在保护内存时是按区region管理的。它可以把某些内存region设置成只读,从而避免了那里的内容意外被更改。还可以在多任务系统中把不同任务之间的数据区隔离。
7. 指令集
Cortex-M3支持Thumb-2指令集。这是Cortex-M3处理器最主要的功能之一。它允许32位指令和16位指令被混合使用,以实现高代码密度和高性能,但仍然使用起来很灵活且强大。以前的ARM处理器,CPU支持2种运行状态:32位的ARM状态、16位的Thumb状态。在ARM状态下,所有的指令都是32位的且以高性能执行;在Thumb状态下,所有的指令都是16位的,因此有更高代码密度。但是Thumb状态下并不具备所有ARM指令的功能,需要更多的指令以完成同样的操作。
为在两者间取长补短,许多应用程序混合使用ARM和Thumb代码。然而,这种混合使用会在2种状态间切换时产生额外开销(overhead),执行时间和指令空间上都有。另外,ARM和Thumb代码可能需要在不同的文件中单独编译。这也增加了软件开发的复杂性,减少了CPU core的最大效能。
伴随着Thumb-2指令集的引入,现在可以在单一的操作模式下处理所有processing requirements。无须在2种运行状态间来回切换。事实上,Cortex-M3不支持ARM指令,甚至中断也在Thumb状态下处理。这使得Cortex-M3处理器相对于传统的ARM处理器有更多优势:
- 消除了状态切换的开销,节省了执行时间和指令空间。
- 无需将ARM指令和Thumb指令源代码文件分开,使得软件开发和维护更容易。
- 更易获得最佳效能和性能,使得写软件变得更容易。因为无需担心ARM指令和Thumb指令间的切换来获得最佳代码密度和性能。
Cortex-M3处理器有很多有趣而强大的指令,这里给出几个例子:
- UFBX, BFI, BFC:位域提取、插入、清零指令。
- UDIV, SDIV:无符号和有符号除指令。
- SEV, WFE, WFI:发送事件、等待事件、等待中断指令。这些指令允许处理器处理多处理器间任务同步,和进入休眠模式。
- MSR, MRS:访问特殊功能寄存器。
8. 中断和异常
Cortex-M3处理器实现了一个新的exception异常模型:由系统异常(system exceptions)和外部IRQs(external interrupt inputs)构成。没有了传统ARM处理器的FIQ快中断,取而代之以中断优先级处理和嵌套中断支持。
Cortex-M3的中断机制都在NVIC中实现。除了支持240 个外部中断之外,还支持16-4-1=11个内部异常源。Cortex-M3预定义异常类型如下:
9. 调试支持
Cortex-M3处理器内构了很多调试特性:例如程序执行控制,停机和单步执行(halting and stepping),指令断点,数据观察点,寄存器和内存访问,性能速写(profiling),和各种追踪机制。
Cortex-M3处理器的调试系统基于CoreSight架构。不同于传统的ARM处理器,它的CPU内核本身没有JTAG接口。取而代之的是从内核分离出去的调试接口模块,由内核水平提供的总线接口Debug Access Port(DAP)。通过这个总线接口,外部调试器可以访问控制寄存器和系统内存来调试硬件,甚至处理器正在运行时。总线接口的控制由Debug Port(DP)设备实现。目前可使用的DPs有SWJ-DP(支持传统的JTAG协议和串行线协议),SW-DP(仅支持串行线协议)。ARM CoreSight产品家族的JTAG-DP模块也是可以使用的。芯片制造商可以从这三者间选一DP模块来提供调试接口。
芯片制造商也可以集成嵌入式追踪宏单元(Embedded Trace Macrocell, ETM)来实现指令追踪。追踪信息通过追踪端口接口单元(Trace Port Interface Unit, TPIU)输出,然后调试主机(通常为PC)可以通过外部追踪-捕获硬件收集已执行的指令信息。
在Cortex-M3处理器内,很多事件可以被用来触发调试动作。这些事件是断点、数据观察点、fault条件,或外部调试请求输入信号。当一个调试事件发生,Cortex-M3可以进入halt停机模式或者执行调试监视器异常handler。
数据观察点功能由Cortex-M3处理器的数据观察点和追踪单元(Data Watchpoint and Trace, DWT)提供。这可以被用来停止处理器(或触发调试监控异常例程 the debug monitor
exception routine)或者生成数据追踪信息。当使用数据追踪时,被追踪的数据可以通过TPIU输出(在CoreSight架构中,多个追踪设备可以共享同一追踪端口)。
除了这些基本调试特性之外,Cortex-M3处理器也提供一个Flash Patch and Breakpoint (FPB) 单元。它可以提供一个简单的断点功能或者将指令访问从Flash重映射到SRAM的不同位置。
指令追踪宏单元Instrumentation Trace Macrocell (ITM)为开发者提供了一种输出数据到调试器的新方法。通过写入数据到ITM内的寄存器内存,调试器可以通过一个追踪接口收集、显示或处理数据。这种方式更易用且比JTAG输出更快。
所有这些调试组件由Cortex-M3内的DAP接口总线或者运行在处理器内核的程序来控制。所有的追踪信息可从TPIU处被访问到。
10. 特性简述
为什么Cortex-M3处理器是一款如此有突破性的产品呢?使用Cortex-M3的优势是什么?
高性能
- 很多指令包括乘法都是单周期的。而且,Cortex-M3处理器胜过绝大多数微控制器。
- 独立的数据总线和指令总线,使得数据访问和指令访问并行不悖。
- Thumb-2指令集使状态切换开销成为历史。无需花费时间在ARM状态和Thumb状态间切换,因此指令周期和程序大小都减小了。这也简化了软件开发,使得产品更快面市,代码更易维护。
- Thumb‐2指令集为编程带来了更多的灵活性。很多数据操作现在可以使用更短的代码来简化,这也意味着Cortex-M3有更高代码密度并减少内存需求。
- 32位取指。同一周期可以取指两条指令,如此有更多可用带宽给数据传输。
- Cortex-M3的设计允许微控制器产品运行在很高的时钟频率(超过100MHz,在现代半导体制造工艺中)。即使与多数其他微控制器产品运行在同样的频率,Cortex-M3也有更好的时钟/指令比(clock per instruction (CPI) ratio)。这使得处理器在1MHz内执行更多工作,应用可以为实现更低功耗运行在更低时钟频率。
先进的中断处理功能
- 内建的嵌套向量中断控制器(NVIC)支持高达240个外部中断输入。向量化的中断功能极大地减少了中断延迟,因为无需软件来决定哪个IRQ handler来服务。除此之外,也无需软件代码来建立嵌套的中断支持。
- Cortex-M3处理器自动地在中断开始时将寄存器R0-R3、R12、LR、PSR和PC压入栈,并在中断结束时将其弹出栈。这减少了IRQ处理的延迟,同时使得中断处理程序可以是标准的C语言函数(不需要额外的汇编语言代码了)。
- 中断管理极其灵活,因为NVIC可为每一中断提供可编程的中断优先级控制。可支持至少8级中断优先级,且中断优先级可动态地被修改。
- 中断延迟可通过特殊的优化来减小,包括“晚到中断机制”和“咬尾中断机制”。
- 有些多指令周期的操作现在是可以被中断的,这包括:批量加载LDM(Load-Multiple)、批量存储STM(Store-Multiple)、入栈PUSH、出栈POP。
- 一收到不可屏蔽中断NMI请求,将确保NMI处理立即被执行除非系统被彻底地锁定。NMI对于许多安全关键型应用是非常重要的。
低功耗
- Cortex-M3处理器适合于低功耗的设计,这取决于很低的逻辑门数。
- 支持节能模式(SLEEPING和SLEEPDEEP)。处理器可通过指令Wait for Interrupt (WFI) 或 Wait for Event (WFE)进入休眠模式。基本模块有独立的时钟设计,因此处理器大部分部件的时钟电路在休眠期间可以被停掉。
- 全静态的、同步的、可综合的设计,使得处理器易于使用任何低功耗或标准的半导体工艺技术来制造。
系统特性
- 系统提供位带操作,字节不变的大端模式,非对齐数据访问支持。
- 先进的fault处理机制,包括多种异常类型和fault状态寄存器,使定位问题更容易。
- 通过引入banked堆栈指针机制,内核和用户进程的堆栈内存可以被隔离。如果再配上可选的MPU,处理器将足以开发健壮的软件和可靠的产品。
调试支持
- 支持JTAG或串行线SW调试接口。
- 基于CoreSight调试解决方案:即使内核在运行时,处理器状态和存储器内容也能被访问得到。
- 内建了对6个断点和4个观察点的支持。
- 选配的ETM可用于指令追踪,DWT可用于数据追踪。
- 新的调试功能,包括fault状态寄存器、新的fault异常、Flash补丁操作,使得调试更加容易。
- ITM提供了一种易于使用的方法来将测试代码中的调试信息输出。
- DWT内部的PC采样器和计数器可以提供代码分析信息。
参考:
[ 1 ] Joseph Yiu. The Definitive Guide to the ARM Cortex-M3. 2007
[ 2 ] 宋岩. Cortex-M3 权威指南. 2008
标签:中断,指令,概述,Cortex,M3,寄存器,处理器 来源: https://blog.csdn.net/sparkjl/article/details/122354374