其他分享
首页 > 其他分享> > Cortex-M3概述

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,因此任一时刻只能使用其中的一个。

堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节对齐的。

在ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。

1.3. R14:连接寄存器LR

当呼叫一个子程序时,由R14 存储返回地址。

1.4. R15:程序计数器PC

指向当前的程序地址。如果修改它的值,就能改变程序的执行流。

1.5. 特殊功能寄存器

Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括:

在这里插入图片描述

寄存器及其功能:

寄存器功能
xPSR记录ALU 标志(0 标志,进位标志,负数标志,溢出标志),执行状态,以及当前正服务的中断号。
PRIMASK除能所有的中断,除了不可屏蔽中断(NMI)和 硬件故障(HardFault)。
FAULTMASK除能所有的中断,除了不可屏蔽中断(NMI)。而且被除能的faults会“上访”。
BASEPRI除能所有优先级不高于某个具体数值的中断。
CONTROL定义特权状态和堆栈指针选择(MSP、PSP)。

2. 操作模式和特权极别

Cortex‐M3 处理器支持两种处理器的操作模式,还支持两级特权级别。
引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码(包括中断服务例程的代码和系统异常服务例程)。

Cortex‐M3 的另一个侧面则是特权的分级——特权级和用户级。

这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。

在这里插入图片描述

在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处理器有更多优势:

Cortex-M3处理器有很多有趣而强大的指令,这里给出几个例子:

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的优势是什么?

高性能

先进的中断处理功能

低功耗

系统特性

调试支持

参考:
[ 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