文章目录
- 二、Cortex-M3综述
- 2.1 基础
- 2.2 寄存器
- 2.2.1 R0~R12:通用目的寄存器
- 2.2.2 R13:栈指针
- 2.2.3 R14:链接寄存器
- 2.2.4 R15:程序计数器
- 2.2.5 特殊寄存器
- 2.3 操作模式
- 2.4 内置的嵌套向量中断控制器
- 2.4.1 关于嵌套
- 2.4.2 关于向量
- 2.4.3 关于中断
- 2.4.4 支持动态修改优先级 *
- 2.5 存储器映射
- 2.6 总线接口
- 2.7 MPU
- 2.8 指令集
- 2.9 中断和异常
- 2.10 调试支持
- 2.11 特点概括
- 2.11.1 高性能
- 2.11.2 中断处理的高级特性
- 2.11.3 低功耗
- 2.11.4 系统特性
- 2.11.5 调试支持
二、Cortex-M3综述
2.1 基础
- Cortex-M3是32位的微处理器,具有32位数据通路,一个32位的寄存器组,以及32位的存储器接口。
- 处理器具有哈佛架构,拥有独立的指令总线和数据总线,提升了处理器的性能,但是它们共用相同的存储器空间(同一的存储器系统)。
- Cortex-M3处理器拥有一个可选的存储器保护单元(MPU),还可以使用外部缓存,处理器支持大端和小端两种存储器系统。
- Cortex-M3处理器包含多个固定的内部调试部件(断点和监视点等)。
- 可选部件提供了其他调试特性,如指令跟踪以及多种调试接口。
2.2 寄存器
Cortex-M3处理器的寄存器从R0到R15。
2.2.1 R0~R12:通用目的寄存器
- 类型:32位通用目的寄存器。
- 作用:用于数据操作,有些16位Thumb指令只能访问这些寄存器的子集(低寄存器,R0~R7)。
2.2.2 R13:栈指针
- 类型:Cortex-M3包含两个栈指针(R13),它们分组存放,且同时只有一个可见。
- 主栈指针(MSP):默认栈指针,被操作系统内核以及异常处理使用。
- 进程栈指针(PSP):被用户应用程序代码使用。
- 注意:栈指针的最低两位永远为0,意味着它们永远是字对齐。
2.2.3 R14:链接寄存器
- 作用:当调用一个子例程时,返回地址存储在链接寄存器中。
2.2.4 R15:程序计数器
程序计数器为当前的程序地址,也可以写这个寄存器来控制程序流。
2.2.5 特殊寄存器
Cortex-M3处理器具有多个特殊寄存器:
- 程序状态寄存器(PSR);
- 中断屏蔽寄存器(PRIMASK、FAULTMASK、BASEPRI);
- 控制寄存器(CONTROL)。
这些寄存器具有特殊的功能,并且只能通过特殊指令访问,不能用于普通的数据处理。
2.3 操作模式
流程概述:
- 当启动或者复位的时候,处理器处于特权线程;
- 当处理器处于特权等级时,可以通过访问特殊寄存器中的控制寄存器CONTROL切换成用户线程;
- 处理器在用户线程时,需要通过进入异常特权处理模式,访问CONTROL特殊寄存器,才可以在异常退出时切换为特权线程;
- 无论是特权线程还是用户线程,当发生异常时都会进入特权处理。
2.4 内置的嵌套向量中断控制器
Cortex-M3包括一个特殊的中断控制器,也就是嵌套向量中断控制器NVIC,它与处理器内核紧密相连。
2.4.1 关于嵌套
所有的外部中断和系统异常都可以被编程为不同的优先级,当一个中断发生时,NVIC会将该中断与当前运行优先级比较,如果新中断的优先级大于当前等级,新的中断处理就会覆盖正在运行的任务。
2.4.2 关于向量
当中断被接受后,中断服务程序ISR的起始地址从存储器的向量表中被提取出来,而且无需使用软件确定ISR的起始地址并跳转,这样也就减少了中断请求的处理时间。
2.4.3 关于中断
Cortex-M3处理器还具有可以降低中断等待时间的多个高级特性,它们包括一些寄存器内容的自动保存和恢复、减小从一个ISR到另一个切换的等待时间以及对迟到中断的处理。
中断和系统异常可以由它们的优先级屏蔽,或者由中断屏蔽寄存器BASEPRI、 PRIMASK以及FAULTMASK完全屏版,它们可以确保时间敏感的任务不被打断,从而按时完成。
2.4.4 支持动态修改优先级 *
中断的优先等级可以在运行期间由软件修改,正在执行的中断暂停执行,并且在ISR结束前不会被再次激活,因此,在修改优先级时无须担心中断的意外重入。
2.5 存储器映射
Cortex-M3具有预定义的存储器映射,这样一些内置外设,如中断控制器和调试单元等,可以通过简单的存储器访问指令操作。因此,大多数的系统可以使用C程序代码访问。该预定义的存储器映射也使得Cortex-M3具有速度上的高度优化,并且可以很容易地被集成到片上系统(SoC)设计中。
Cortex-M3的设计具有进行了存储器使用优化的内部总线,另外,它也允许这些区域的用法不同。例如,数据存储器可以位于CODE区域,而程序代码也可以在外部随机访问存储器(RAM)区域中执行。
系统级的存储器区域包括中断控制器和调试部件,这些设备具有固定地址,详细信息可以参考第5章。由于这些外设具有固定地址,在Cortex-M3产品间移植应用程序也就更加容易了。
2.6 总线接口
Cortex-M3处理器具有多个总线接口,利用这些接口,Cortex-M3可以同时执行取指和数据访问。主要的总线接口包括:
- 代码存储器总线;
- 系统总线;
- 私有外设总线。
代码存储器区域访问在代码存储器总线上执行,它在物理上分为两个总线,即I-Code和D-Code。它们已经为取指做了优化,以获得最佳的指令执行速度。
系统总线用于访问存储器和外设,它提供了访问多种外设的入口,如静态随机访问存储器(SRAM)、外设、外部RAM、外部设备以及部分系统级存储器区域。
有些系统级的存储器面向私有外设,如调试部件等,而私有外设总线则提供了访问这种存储器的途径。
2.7 MPU
Cortex-M3具有可选的MPU单元,其为特权访问和用户程序访问设定了访问规则。当违反访问规则时,错误异常就会产生,如果可能的话,该错误异常处理应该能分析问题并作出修正。
MPU具有多种用法,在通常情况下,OS可以设置MPU来对OS和其他特权进程使用的数据进行保护,以免它们被其他恶意用户程序访问。MPU还可以用于将存储器区域设置为只读,防止数据被意外擦除或者在多任务系统中隔离不同任务间的存储器区域。总体来说,MPU可以使嵌入式系统更加健壮可靠。
MPU特性为可选的,其使用情况由微控制器和SoC的设计决定。要了解MPU的更多信息,可以参考第13章的内容。
2.8 指令集
Cortex-M3支持Thumb-2指令集,这是Cortex-M3处理器最重要的特性之一,因为其允许同时使用32位指令和16位指令,以提高代码密度和效率。该指令集非常灵活、强大,且易于使用。
对于之前的ARM处理器,中央处理单元(CPU)具有两种操作状态:32位的ARM状态和16位的Thumb状态。在ARM状态中,指令为32位的,处理器可以执行所有支持的指令,且具有很高的性能;在Tumb状态中,指令为16位的,因此指令代码密度也就更高,不过Thumb状态不具有ARM指令的所有功能,要完成特定操作,它可能需要更多的指令。
要使两者达到最佳的效果,许多应用程序混合使用ARM和Thumb代码。不过,混合代码处理并不总是最优的,状态间切换会带来额外开销(根据执行时间和指令空间,见图2.7), ARM和Thub代码可能还需要位于不同文件中分开编译。这样就增加了软件开发的复杂度,无法发挥CPU内核的最佳效率。
随着Thumb-2指令集的引入,在一种操作模式下完成所有操作已经成为了可能,而无须在两种状态间切换。事实上,Cortex-M3不支持ARM代码,中断也要在Thumb状态中处理(之前ARM内核在ARM状态中进入中断处理)。由于没有必要进行状态间切换, Cortex-M3处理器同传统的ARM处理器相比具有诸多优势,例如:
- 无状态切换开销,节省执行时间和指令空间:
- 无须将ARM代码和Thumb代码分开,软件开发和维护更加容易;
- 可以更容易地获得最佳效率和性能,由于无须为了获得最佳的密度和性能而在 ARM和Thumb间切换代码,编写软件也更加容易了。
2.9 中断和异常
Cortex-M3实现了一个新的异常模型,它是在ARMv7-M架构上引入的。该异常模型同传统的ARM处理器不同,其中断处理极具效率。它具有几个系统异常和一些外部中断请求(IRQ)(外部中断输入)。Cortex-M3上不存在快速中断(FIQ)(ARM7/ARM9 ARM10/ARM11中有快速中断),不过,目前的中断架构包括中断优先级处理和嵌套中断支持。因此,设置支持嵌套中断的系统非常简单(高优先级的中断可以覆盖或抢占低优先级的中断处理),而且它的效果同传统ARM处理器上的FIQ类似。
Cortex-M3的中断特性在NVIC里实现,除了支持外部中断外,Cortex-M3还支持多个内部异常源,如系统错误处理等。如表2.2所示,Cortex3具有多个预先定义的异常类型。
低功耗和高能耗效率
Cortex-M3处理器具有多种特性,这有助于设计者开发低功耗和高能效的产品。
首先,其具有休眠模式以及深度休眠模式,它们同多种系统设计策略一道,可以降低空闲时间的功耗。
其次,Cortex-M3的低门数量和设计技术降低了处理器中的电流,这样动态功耗也就降低了。另外,由于Cortex-M3具有高代码密度,它可以降低对程序大小的要求。同时, Cortex-M3能在较短时间内完成处理任务,所以处理器可以尽快返回休眠模式,这样也可以降低能耗。因此,Cortex-M3的能耗效率比许多8位或16位的微控制器还要好。
从Cortex-M3版本2开始,唤醒中断控制器(WIC)作为一种新的特性出现。该特性允许整个处理器内核的电源都被关闭,同时处理器的状态可以保持,并且当中断发生时处理器儿乎可以立即返回到活动状态。因此,之前许多使用8位和16位微控制器实现的超低功耗应用,也可以用Cortex-M3实现。
2.10 调试支持
Cortex-M3处理器具有多种调试特性,如包括暂停和单步的程序执行控制、指令断点、数据监视点、寄存器和存储器访问、概况和跟踪等。
Cortex-M3上的调试硬件基于CoreSight架构,和传统的ARM处理器不同,CPU内核自身不具备联合测试行动小组(JTAG)接口,取而代之的是,一个调试接口模块从内核中脱离出来,处理器在内核层级提供了名为调试访问端口(DAP)的总线接口。通过这个总线接口,外部调试器可以访问控制寄存器以调试硬件和系统存储器,而不管处理器是否正在运行。该总线接口的控制由调试端口(DP)设备执行,当前可用的DP为串行线JTAG调试端口(SWJ-DP)(支持传统的JTAG协议以及串行线协议)或SWDP(只支持串行线协议),也可以使用ARM CoreSight产品系列中的JTAG-DP模块,芯片生产商可以选择其中的一个 DP模块,以提供调试接口。
芯片生产商还可以使用嵌入式跟踪宏单元(ETM),实现指令跟踪。跟踪信息通过跟踪端口接口单元(TPU)输出,然后调试主机(通常是个人电脑)可以通过外部跟踪捕获硬件采集已执行的指令信息。
在Cortex-M3处理器中,多个事件都可以触发调试动作,调试事件可以是断点、监视点、错误条件或者外部调试请求输入信号。当调试事件发生时,Cortex-M3处理器可以进入暂停模式或执行调试监控异常处理。
对于Cortex-M3处理器,数据监视点功能由数据监视点和跟踪(DWT)单元提供,它可用于停止处理器(或者触发调试监控异常程序)或者产生数据跟踪信息。在使用数据跟踪时,跟踪到的数据可以通过TPIU输出(在CoreSight架构中,多个跟踪设备可以共用一个跟踪端口)。
除了这些基本的调试特性,Cortex-M3处理器还提供了Flash补丁与断点(FPB)单元,该单元可以提供简单的断点功能或将指令访问从Flsh重映射到SRAM的不同位置。
指令跟踪宏单元(ITM)为开发者提供了一种输出调试数据的新方法,通过写人ITM中的寄存器,调试器可以利用跟踪接口采集数据并且对它们加以显示或处理。这种方法易于使用,并且比JTAG输出的速度要快。
所有的这些部件都可以由Cortex-M3中的DAP接口总线控制,也可由处理器内核中运行的程序控制,并且所有的跟踪信息都可以通过TPU访问。
2.11 特点概括
Cortex-M3处理器为什么是一种革命性的产品?使用Cortex-M3的优势在哪?本节概括了Cortex-M3的特点和优势。