ARM Cortex-M处理器家族如今有8款处理器成员。在本文中,咱们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照Cortex-M 系列处理器的指令集和高级中断处理能力,以及 SoC系统级特性,调试和追踪功能和性能的比较。
一、简介
今天, ARM Cortex-M 处理器家族有8款处理器成员。除此以外,ARM的产品系列还有不少其余的处理器成员。对不少初学者,甚至某些芯片设计经验丰富可是不熟悉ARM系列处理器的设计者来讲,也是很容易混淆这些产品的。不一样的ARM 处理器有不一样的指令集,系统功能和性能。本文会深刻展示Cortex-M系列处理器之间的关键区别,以及它们和ARM其余系列处理器的不一样。
1.1ARM处理器家族
多年来, ARM已经研发了至关多的不一样的处理器产品。 以下图中(图1): ARM 处理器产品分为经典ARM处理器系列和最新的Cortex处理器系列。而且根据应用范围的不一样,ARM处理器能够分类成3个系列。
Application Processors(应用处理器)–面向移动计算,智能手机,服务器等市场的的高端处理器。这类处理器运行在很高的时钟频率(超过1GHz),支持像Linux,Android,MS Windows和移动操做系统等完整操做系统须要的内存管理单元(MMU)。 若是规划开发的产品须要运行上述其中的一个操做系统,你须要选择ARM 应用处理器.
Real-time Processors (实时处理器)–面向实时应用的高性能处理器系列,例如硬盘控制器,汽车传动系统和无线通信的基带控制。多数实时处理器不支持MMU,不过一般具备MPU、Cache和其余针对工业应用设计的存储器功能。实时处理器运行在比较高的时钟频率(例如200MHz 到 >1GHz ),响应延迟很是低。虽然实时处理器不能运行完整版本的Linux和Windows操做系统, 可是支持大量的实时操做系统(RTOS)。
Microcontroller Processors(微控制器处理器)–微控制器处理器一般设计成面积很小和能效比很高。一般这些处理器的流水线很短,最高时钟频率很低(虽然市场上有此类的处理器能够运行在200Mhz之上)。 而且,新的Cortex-M处理器家族设计的很是容易使用。所以,ARM 微控制器处理器在单片机和深度嵌入式系统市场很是成功和受欢迎。html
图 1: 处理器家族编程
表1总结了三个处理器系列的主要特征。缓存
表 1: 处理器特性总结安全
1.2Cortex-M 处理器家族
Cortex-M处理器家族更多的集中在低性能端,可是这些处理器相比于许多微控制器使用的传统处理器性能仍然很强大。例如,Cortex-M4和Cortex-M7处理器应用在许多高性能的微控制器产品中,最大的时钟频率能够达到400Mhz。
固然,性能不是选择处理器的惟一指标。在许多应用中,低功耗和成本是关键的选择指标。所以,Cortex-M处理器家族包含各类产品来知足不一样的需求:服务器
表 2: Cortex-M 处理器家族架构
不一样于老的经典ARM处理器(例如,ARM7TDMI, ARM9), Cortex-M处理器有一个很是不一样的架构。例如:
-仅支持ARM Thumb?指令,已扩展到同时支持16位和32位指令Thumb-2版本
-内置的嵌套向量中断控制负责中断处理,自动处理中断优先级,中断屏蔽,中断嵌套和系统异常处理。
-中断处理函数可使用标准的C语言编程,嵌套中断处理机制避免了使用软件判断哪个中断须要响应处理。同时,中断响应速度是肯定性的,低延迟的
-向量表从跳转指令变为中断和系统异常处理函数的起始地址。
-寄存器组和某些编程模式也作了改变。
这些变化意味着许多为经典ARM处理器编写的汇编代码须要修改,老的项目须要修改和从新编译才能迁移到Cortex-M的产品上。软件移植具体的细节记录在ARM文档:
ARM Cortex-M3 Processor Software Development for ARM7TDMI Processor Programmers
http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf
1.3Cortex-M系列处理器的共同特性
Cortex-M0, M0+, M3, M4 and M7之间有不少的类似之处,例如:
-基本编程模型 (章节 3.1)
-嵌套向量中断控制器(NVIC)的中断响应管理
-架构设计的休眠模式:睡眠模式和深度睡眠模式 (章节 4.1)
-操做系统支持特性 (章节 3.3)
-调试功能 (章节 6)
-易用性
例如,嵌套向量中断控制器是内置的中断控制器编程语言
图 2: Cortex-M处理器的嵌套向量中断控制器函数
支持许多外围设备的中断输入,一个不可屏蔽的中断请求,一个来自内置时钟(SysTick)的中断请求(见章节 3.3)和必定数量的系统异常请求。NVIC处理这些中断和异常的优先级和屏蔽管理。
NVIC以及异常处理模型的更多的内容在章节3.2描述。其余Cortex-M处理器间的异同点会在本文的其他部分讲解。
二、Cortex-M处理器指令集
2.1指令集简介
大多数状况下,应用程序代码能够用C或其余高级语言编写。可是,对Cortex-M 处理器支持指令集的基本了解有助于开发者针对具体应用选择合适的Cortex-M处理器。指令集(ISA)是处理器架构的一部分,Cortex-M处理器能够分为几个架构规范。工具
表 3: Cortex-M 处理器ARM架构规范的规范post
全部的Cortex-M 处理器都支持Thumb指令集。整套Thumb指令集扩展到Thumb-2版本时变得至关大。可是,不一样的Cortex-M处理器支持不一样的Thumb 指令集的子集,如图3所示
图 3: Cortex-M 处理器的指令集
2.2Cortex-M0/M0+/M1指令集
Cortex-M0/M0+/M1处理器基于ARMv6-M架构。这是一个只支持56条指令的小指令集,大部分指令是16位指令,如图3所示只占很小的一部分。可是,此类处理器中的寄存器和处理的数据长度是32位的。对于大多数简单的I/O控制任务和普通的数据处理,这些指令已经足够了。这么小的指令集能够用不多的电路门数来实现处理器设计,Cortex-M0 和 Cortex-M0+最小配置仅仅12K门。
然而,其中的不少指令没法使用高位寄存器(R8 到R12), 而且生成当即数的能力有限。这是平衡了超低功耗和性能需求的结果。
2.3Cortex-M3指令集
Cortex-M3处理器是基于ARMv7-M架构的处理器,支持更丰富的指令集,包括许多32位指令,这些指令能够高效的使用高位寄存器。另外,M3还支持:
查表跳转指令和条件执行(使用IT指令)
硬件除法指令
乘加指令(MAC)
各类位操做指令
更丰富的指令集经过几种途径来加强性能;例如,32位Thumb指令支持了更大范围的当即数,跳转偏移和内存数据范围的地址偏移。支持基本的DSP操做(例如,支持若干条须要多个时钟周期执行的MAC指令,还有饱和运算指令)。最后,这些32位指令容许用单个指令对多个数据一块儿作桶型移位操做。
支持更丰富的指令致使了更大的面积成本和更高的功耗。典型的微控制器,Cortex-M3的电路门数是Cortex-M0 和 Cortex-M0+两倍还多。可是,处理器的面积只是大多数现代微控制器的很小的一部分,多出来的面积和功耗常常不那么重要。
2.4Cortex-M4指令集
Cortex-M4在不少地方和Cortex-M3相同:流水线,编程模型。Cortex-M4支持Cortex-M3的全部功能,并额外支持各类面向DSP应用的指令,像SIMD, 饱和运算指令,一系列单周期MAC指令(Cortex-M3只支持有限条MAC指令,而且是多周期执行的),和可选的单精度浮点运算指令。
Cortex-M4的SIMD操做能够并行处理两个16位数据和4个8位数据。例如,图4展现的QADD8 和 QADD16 操做:
图 4: SIMD指令例子: QADD8 and QADD16
在某些DSP运算中,使用SIMD能够加速更快计算16位和8位数据,由于这些运算能够并行处理。可是,通常的编程中,C编译器并不能充分利用SIMD运算能力。这是为何Cortex-M3 和 Cortex-M4典型benchmark的分数差很少。然而,Cortex-M4的内部数据通路和Cortex-M3的不一样,某些状况下Cortex-M4能够处理的更快(例如,单周期MAC,能够在一个周期中写回到两个寄存器)。
2.5Cortex-M7指令集
Cortex-M7支持的指令集和Cortex-M4类似,添加了:
浮点数据架构是基于FPv5的,而不是Cortex-M4的FPv4,因此Cortex-M7支持额外浮点指令
可选的双精度浮点数据处理指令
支持缓存数据预取指令(PLD)
Cortex-M7的流水线和Cortex-M4的很是不一样。Cortex-M7是6级双发射流水线,能够得到更高的性能。多数为Cortex-M4设计的软件能够直接运行在Cortex-M7上。可是,为了充分利用流水线差别来达到最好的优化,软件须要从新编译,而且在许多状况下,软件须要一些小的升级,以充分利用像Cache这样的新功能。
2.6Cortex-M23指令集
Cortex-M23的指令集是基于ARMv8-M的Baseline子规范,它是ARMv6-M的超集。扩展的指令包括:
硬件除法指令
比较和跳转指令,32位跳转指令
支持TrustZone安全扩展的指令
互斥数据访问指令(一般用于信号量操做)
16位当即数生成指令
载入获取及存储释放指令(支持C11)
在某些状况下,这些加强的指令集能够提升处理器性能,而且对包含多个处理器的SoC设计有用(例如,互斥访问对多处理器的信号量处理有帮助)
2.7I Cortex-M33指令集
由于Cortex-M33设计是很是可配置的,某些指令也是可选的。例如:
DSP指令(Cortex-M4 和Cortex-M7支持的)是可选的
单精度浮点运算指令是可选的,这些指令是基于FPv5的,而且比Cortex-M4多几条。
: Cortex-M33也支持那些ARMv8-M Mainline引入的新指令:
支持TrustZone安全扩展的指令
载入获取及存储释放指令(支持C11)
2.8指令集特性比较总结
ARMv6-M, ARMv7-M 和 ARMv8-M架构有许多指令集功能特色, 很难介绍到全部的细节。可是,下面的表格(表4)总结了那些关键的差别。
表 4: 指令集特性总结
Cortex-M处理器指令集的最重要的特色是向上兼容。Cortex-M3的指令是Cortex-M0/M0+/M1的超集。因此,理论上讲,若是存储空间分配是一致的,运行在Cortex-M0/M0+/M1上的二进制文件能够直接运行在Cortex-M3上。一样的原理也适用于Cortex-M4/M7和其余的Cortex-M处理器;Cortex-M0/M0+/M1/M3支持的指令也能够运行在Cortex-M4/M7上。
虽然Cortex-M0/M0+/M1/M3/M23处理器没有浮点运算单元配置选项,可是处理器仍然能够利用软件来作浮点数据运算。这也适用于基于Cortex-M4/M7/M33可是没有配置浮点运算单元的产品。在这种状况下,当程序中使用了浮点数,编译工具包会在连接阶段插入须要的运行软件库。软件模式的浮点运算须要更长的运行时间,而且会略微的增长代码大小。可是,若是浮点运算不是频繁使用的,这种方案是适合这种应用的。
三、架构特性
3.1编程模型
Cortex-M处理器家族的编程模型是高度一致的。例如全部的Crotex-M处理器都支持R0到R15,PSR, CONTROL 和 PRIMASK。两个特殊的寄存器— FAULTMASK 和 BASEPRI—只有Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33支持;浮点寄存器组和FPSCR(浮点状态和控制寄存器)寄存器,是Cortex-M4/M7/M33可选的浮点运算单元使用的。
图 5: 编程模型
BASEPRI寄存器容许程序阻止指定优先级或者低的优先级中断和异常。对ARMv7-M来讲这是很重要的,由于Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33有大量的优先级等级,而ARMv6-M 和 ARMv8-M Baseline只有有限的4个优先等级。FAULTMASK一般用在复杂的错误处理上(查看章节3.4)
非特权级别的实现对ARMv6-M处理器是可选的,对ARMv7-M 和ARMv8-M处理器一直支持的。对Cortex-M0+处理器,它是可选的, Cortex-M0 and Cortex-M1不支持这个功能。这意味着在各类Cortex-M处理器的CONTROL 寄存器是稍微不一样的。FPU的配置也会影响到CONTROL寄存器,如图6所示。
图 6: CONTROL 寄存器
另一个编程模型之间的不一样是PSR寄存器(程序状态寄存器)的细节。全部的Cortex-M处理器,PSR寄存器都被再分红应用程序状态寄存器(APSR),执行程序状态寄存器(EPSR)和中断程序状态寄存器(IPSR)。 ARMv6-M 和 ARMv8-M Baseline系列的处理器不支持APSR的Q位和EPSR的ICI/IT位。ARMv7E-M系列 ( Cortex-M4, Cortex-M7) 和ARMv8-M Mainline (配置了DSP扩展的Cortex-M33 )支持GE位。另外,ARMv6-M系列处理器IPSR的中断号数字范围很小,如图7所示。
图 7: PSR 差别
请注意Cortex-M的编程模型和ARM7TDMI等这些经典的ARM处理器是不同的。除了寄存器组不一样外,经典ARM处理器中“模式”和“状态”的定义与Cortex-M中的也是不一样的。Cortex-M只有两个模式:线程模式(Thread)和管理者模式(Handler),而且Cortex-M处理器一直运行在Thumb状态(不支持ARM指令)
3.2异常处理模型和嵌套向量中断控制器NVIC
全部的Cortex-M处理器都包含了NVIC模块,采用一样的异常处理模型。若是一个异常中断发生,它的优先等级高于当前运行等级,而且没有被任何的中断屏蔽寄存器屏蔽,处理器会响应这个中断/异常,把某些寄存器入栈到当前的堆栈上。这种堆栈机制下,中断处理程序能够编写为一个普通的C函数,许多小的中断处理函数能够当即直接响应工做而不须要额外的堆栈处理花销。
一些ARMv7-M/ARMv8-M Mainline系列的处理器使用的中断和系统异常并不被ARMv6-M/ARMv8-M Baseline的产品支持,如图8. 例如,Cortex-M0, M0+ 和M1的中断数被限制在32个如下,没有调试监测异常,错误异常也只限于HardFault(错误处理细节请参看章节3.4)。相比之下,Cortex-M23, Cortex-M3, Cortex-M4 和Cortex-M7处理器能够支持到多达240个外围设备中断。Cortex-M33支持最多480个中断。
另一个区别是可使用的优先等级数量:
ARMv6-M 架构 - ARMv6-M支持2级固定的(NMI 和 HardFault)和4级可编程的(由每一个优先等级寄存器的两个位表示)中断/异常优先级。这对大多数的微控制器应用来讲足够了。
ARMv7-M 架构 - ARMv7-M系列处理器的可编程优先级等级数范围,根据面积的限制,能够配置成8级(3位)到256级(8位)。ARMv7-M处理器还有一个叫作中断优先级分组的功能,能够把中断优先级寄存器再进一步分为组优先级和子优先级,这样能够详细地制定抢占式优先级的行为。
ARMv8-M Baseline – 相似 ARMv6-M,M23也有2位的优先级等级寄存器。借助可选的TrustZone安全扩展组件,安全软件能够把非安全环境中的中断的优先等级转换到优先等级区间的下半区,这就保证了安全环境中的某些中断/异常老是比非安全环境中的优先级要高。
ARMv8-M Mainline – 相似于 ARMv7-M。 能够支持8到256个中断优先等级和中断优先级分组。还支持ARMv8-M Baseline具备的优先等级调整功能。
图 8: Cortex-M 处理器异常中断类型
全部的Cortex-M处理器在异常处理是都要依靠向量表。向量表保存着异常处理函数的起始地址(如图8所示)。向量表的起始地址由名为向量表偏移寄存器(VTOR)决定。
Cortex-M0+, Cortex-M3 and Cortex-M4 processors: by default the vector table is located in the starting of the memory map (address 0x0). Cortex-M0+, Cortex-M3 and Cortex-M4: 向量表默认放在存储空间的起始地址(地址 0x0)。
In Cortex-M7, Cortex-M23 and Cortex-M33 processors: the default value for VTOR is defined by chip designers. Cortex-M23 and Cortex-M33 processors can have two separated vector tables for Secure and Non-secure exceptions/interrupts. Cortex-M7, Cortex-M23 and Cortex-M33:VTOR的初始值由芯片设计者定义。Cortex-M23 and Cortex-M33处理器面向安全和非安全的异常/中断有两个独立的向量表。
Cortex-M0 and Cortex-M1 does not implement programmable VTOR and vector table starting address is always 0x00000000. Cortex-M0 and Cortex-M1没有实现可编程的VTOR,向量表起始地址一直为0x00000000。
Cortex-M0+ 和 Cortex-M23处理器的VTOR是可选项。若是VTOR被实现了,向量表的起始地址能够经过设置VTOR来改变,这个功能对下列状况有用:
重定位向量表到SRAM来实现动态改变异常处理函数入口点
重定位向量表到SRAM来实现更快的向量读取(若是flash存储器很慢)
重定位向量表到ROM不一样位置(或者Flash),不一样的程序运行阶段能够有不一样的异常处理程序
不一样的Cortex-M处理器之间的NVIC编程模型也有额外的不一样。差别点总结在表 5中:
表 5: NVIC 编程模型和特性差别
大部分状况下,对NVIC的中断控制特性的操做都是经过CMSIS-CORE提供的APIs处理的,他们在微控制器厂商提供的设备驱动程序库里。对Cortex-M3/M4/M7/M23/M33处理器,即便中断被使能了,它的优先级也能够被改变。ARMv6-M处理器不支持动态优先等级调整,当你须要改变中断优先等级是,须要暂时的关掉这个中断。
3.3操做系统支持特性
Cortex-M处理器架构在设计时就考虑到了操做系统的支持。针对操做系统的特性有:
影子堆栈指针
系统服务调用(SVC)和可挂起系统调用(PenSV)异常
SysTick – 24位递减计时器,为操做系统的计时和任务管理产生周期性的异常中断
Cortex-M0+/M3/M4/M7/M23/M33支持的非特权执行和存储保护单元(MPU)
系统服务调用(SVC)异常由SVC指令触发,他可让运行在非特权状态的应用任务启动特权级的操做系统服务。可挂起系统调用异常在操做系统中像上下文切换这样的非关键操做的调度很是有帮助。
为了能把Cortex-M1放到很小的FPGA器件中,全部用来支持操做系统的特性对Cortex-M1都是可选的。对Cortex-M0, Cortex-M0+ 和Cortex-M23处理器,系统时钟SysTick是可选的。
一般,全部的Cortex-M处理器都支持操做系统。执行在Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23 和 Cortex-M33的应用能够运行在非特权运行状态,而且能够同时利用可选的存储器管理单元(MPU)以免内存非法访问。这能够加强系统的鲁棒性。
3.4TrustZone安全扩展
近几年来, 物联网(IoT)成为了嵌入式系统开发者们的热门话题。IoT系统产品变得更加复杂,上市时间的压力也与日俱增。嵌入式系统产品须要更好的方案来保证系统的安全,可是同时又要方便软件开发者开发。传统的方案是经过把软件分红特权和非特权两部分解决的,特权级软件利用MPU防止非特权的应用访问包含安全敏感信息在内的的关键的系统资源。这种方案对一些IoT系统很是适合,可是在一些状况下,只有两层划分是不够的。特别是那些包含不少复杂特权级别的软件组件的系统,特权级的代码的一个缺陷就能够致使黑客完全的控制这个系统
ARMv8-M架构包含了一个叫作TrustZone的安全扩展,TrustZone导入了安全和非安全状态的正交划分。
普通应用是非安全态
软件组件和安全相关的资源(例如,安全存储,加密加速器,正随机数发生器(TRNG))处在安全状态。
图 9: 安全状态和非安全状态的隔离
非安全状态的软件只能访问非安全状态的存储空间和外围设备,安全软件能够访问两种状态下的全部资源。
用这种方案,软件开发者能够用以往的方式开发非安全环境下的应用程序。同时,他们能够借助芯片厂商提供的安全通信软件库执行安全物联网链接。而且即便运行在非安全环境的特权级的程序有漏洞,TrustZone安全机制能够阻止黑客控制整个设备,限制了攻击的影响,还能够实现系统远程恢复。此外,ARMv8-M架构也引入了堆栈边界检查和加强的MPU设计,促使额外安全措施的采用。
安全架构定义也扩展到了系统级别,每一个中断均可以被设置为安全或者非安全属性。中断异常处理程序也会自动保存和恢复安全环境中的寄存器数据以防止安全信息泄露。因此,TrustZone安全扩展让系统可以支持实时系统的需求,为IoT应用提供了坚实的安全基础,而且容易让软件开发在此技术上开发应用程序。
TrustZone模块对Cortex-M23 and Cortex-M33处理器是可选的。关于ARMv8-M TrustZone更多的信息请查找The Next Steps in the Evolution of Embedded Processors for the Smart Connected Era。更多的TrustZone的资源请查看community.arm.com网站上的“TrustZone for ARMv8-M Community”,
3.5错误处理
ARM处理器和其余架构的微控制器的一个区别是错误处理能力。当错误被检测到时,一个错误异常处理程序被触发去执行恰当的处理。触发错误的状况多是:
未定义的指令(例如,Flash存储器损坏)
访问非法地址空间(例如,堆栈指针崩溃)或者MPU非法访问
非法操做(例如,当处理器已经在优先级高于SVC的中断中试图触发SVC异常)
错误处理机制使嵌入式系统可以更快的响应各类问题。不然,若是系统死机了,看门狗定时须要很是长的时间重启系统。
ARMv6-M架构中,全部的错误事件都会触发HardFault处理程序,它的优先级是-1(优先级比全部的可编程异常都高,可是仅低于非屏蔽中断NMI)。 全部的错误事件都被认为是不可恢复的,一般咱们在HardFault处理程序中仅运行错误报告而后进一步触发自动复位。
ARMv8-M Baseline架构和ARMv6-M相似,只有一个错误异常(HardFault)。可是ARMv8-M Baseline的HardFault优先级能够是-1或者当实现了TrustZone安全扩展时优先级是-3.
ARMv7-M 和 ARMv8-M Mainline产品除了HardFault还有几个可配置的错误异常:
Memmanage(内存管理错误)
总线错误(总线返回错误的响应)
用法错误(未定义指令或者其余的非法操做)
SecureFault(只用ARMv8-M Mainline产品支持,处理TrustZone安全扩展中的安全非法操做)
这些异常的优先级能够编程改变,能够单独的打开和关掉。若是须要,它们也能够利用FAULTMASK寄存器把它们的优先级提升到和HardFault相同的级别。ARMv7-M 和 ARMv8-M Mainline产品还有几个错误状态寄存器能够提供关于触发错误异常事件的线索和错误地址的寄存器,用来肯定触发这个错误异常的访问地址,使调试更加容易。
ARMv7-M 和 ARMv8-M Mainline产品子规范中额外的错误处理程序提供了灵活的错误处理能力,错误状态寄存器让错误事件的定位和调试更加容易。不少商业开发套件中的调试器已经内嵌了使用错误状态寄存器来诊断错误事件的功能。此外,错误处理程序能够在运行时作一些修复工做。
表 6: 错误处理特性比较总结
四、系统特性
4.1低功耗
低功耗是Cortex-M处理器的一个关键优势。低功耗是其架构的组成部分:
WFI和WFE指令
架构级的休眠模式定义
此外,Cortex-M支持许多其余的低功耗特性:
休眠和深度休眠模式:架构级支持的特性,经过设备特定的功耗管理寄存器能够进一步扩展。
Sleep-on-exit模式:中断驱动的应用的低功耗技术。开启设置后,当异常处理程序结束而且没有其余等待处理的异常中断时,处理器自动进入到休眠模式。这样避免了额外的线程模式中指令的执行从而省电,而且减小了没必要要的堆栈读写操做。
唤醒中断控制器(WIC):一个可选的特性,在特定的低功耗状态,由一个独立于处理器的小模块侦测中断状况。例如,在状态保留功耗管理(SRPG)设计中,当处理器被关电的设计。
时钟关闭和架构级时钟关闭:经过关闭处理器的寄存器或者子模块的时钟输入来省电
全部这些特性都被Cortex-M0, Cortex-M0+, Cortex-M3, Cortex-M4, Cortex-M7, Cortex-M23 和 Cortex-M33支持。此外,各类低功耗设计技术被用来下降处理器功耗。
由于更少的电路,Cortex-M0 and Cortex-M0+处理器比Cortex-M3, Cortex-M4 和 Cortex-M7功耗低。此外,Cortex-M0+额外优化减小了程序存取(例如跳转备份)来保持系统层级的低功耗。
Cortex-M23没有Cortex-M0 和 Cortex-M0+那么小,可是在相同的配置下,仍然和Cortex-M0+能效同样。
因为更好性能和低功耗优化,在相同配置下,Cortex-M33比Cortex-M4能效比更好。
4.2Bit-band feature位段
Cortex-M3 和Cortex-M4处理器支持一个叫作位段的可选功能,容许有两段经过位段别名地址实现能够位寻址的1MB的地址空间(一段在从地址0x20000000起始的SRAM空间。另外一段是从地址0x40000000起始的外围设备空间)。Cortex-M0, M0+ 和 Cortex-M1不支持位段(bit-band)功能,可是能够利用ARM Cortex-M系统设计套件(CMSDK)中的总线级组件在系统层面实现位段(bit-band)功能。Cortex-M7不支持位段(bit-band),由于M7的Cache功能不能与位段一块使用(Cache控制器不知道内存空间的别名地址)。
ARMv8-M的TrustZone 不支持位段, 这是因为位段别名须要的两个不一样的地址可能会在不一样的安全域中。对于这些系统,外围设备数据的位操做反而能够在外围设备层面处理(例如,经过添加位设置和清除寄存器)。
4.3存储器保护单元(MPU)
除了Cortex-M0, 其余的Cortex-M处理器都有可选的MPU来实现存储空间访问权限和存储空间属性或者存储区间的定义。运行实时操做系统的嵌入式系统, 操做系统会每一个任务定义存储空间访问权限和内存空间配置来保证每一个任务都不会破坏其余的任务或者操做系统内核的地址空间。Cortex-M0+, Cortex-M3 和 Cortex-M4都有8个可编程区域空间和很是类似的编程模型。主要的区别是Cortex-M3/M4的MPU容许两级的存储空间属性(例如,系统级cache类型),Cortex-M0+仅支持一级。Cortex-M7的MPU能够配置成支持8个或者16个区域,两级的存储空间属性。Cortex-M0 和 Cortex-M1不支持MPU.
Cortex-M23 和 Cortex-M33也支持MPU选项,若是实现了TrustZone安全扩展(一个用于安全软件程序,另外一个用于非安全软件程序)能够有最多两个MPU。
4.4单周期I/O接口
单周期I/O接口是Cortex-M0+处理器独特的功能,这使Cortex-M0+能够很快的运行I/O控制任务。Cortex-M大多数的处理器的总线接口是基于AHB Lite或者AHB 5协议的,这些接口都是流水实现总线协议,运行在高时钟频率。可是,这意味着每一个传输须要两个时钟周期。单时钟周期I/O接口添加了额外的简单的非流水线总线接口,链接到像GPIO(通用输入输出)这样的一部分设备特定的外设上。结合单周期I/O和Cortex-M0+自然比较低的跳转代价(只有两级流水线),许多I/O控制操做都会比大多数其余微控制器架构的产品运行的更快。
五、性能考虑
5.1通用数据处理能力
在通用微控制器市场,benchmark数据常常用来衡量微控制器的性能,表7是Cortex-M处理器经常使用benchmark测试的性能数据:
表 7: Cortex-M处理器经常使用benchmakr的性能分数(:CoreMark.org 网站 and ARM 网站)
关于Dhrystone须要注意的是用来测试的Dhrystone是由官方源程序在没有启用inline and 和multi-file compilation编译选项的状况编译出来的(官方分数)。可是,不少微控制器厂商引用的是彻底优化编译的Dhrystone测试出来的数据。
可是,benchmark工具的性能测试数据可能没法准确反应你的应用能达到的性能。例如,单周期I/O接口和DSP应用中使用SIMD,或者Cortex-M4/M7中使用FPU的加速效果并无在这些测试数据中体现出来。
一般,Cortex-M3 和 Cortex-M4因为如下缘由提供了更高的数据处理性能:
更丰富的指令集
哈佛总线架构
写缓存(单周期写操做)
跳转目标的预测取指
Cortex-M33也是基于哈佛总线的架构,有丰富的指令集。可是不像Cortex-M3 和 Cortex-M4,Cortex-M33处理器流水线是从新设计的高效流水线,支持有限的指令双发射(能够在一个时钟周期中执行最多两条指令)。
Cortex-M7支持更高的性能,这是由于M7拥有双发射六级流水线并支持分支预测。并且,经过支持指令和数据Cache,和即使使用慢速内存(例如,嵌入式Flash)也能避免性能损失的紧耦合内存,来实现更高的系统级性能。
可是,某些I/O操做密集的任务在Cortex-M0+上运行更快,这是由于:
更短的流水线(跳转只须要两个周期)
单周期I/O端口
固然也有设备相关的因素。例如,系统级设计,内存的速度也会影响到系统的性能。
你本身的应用程序常常是你须要的最好的benchmark。CoreMark分数是另一个处理器两倍的处理器并不意味着执行你的应用也快一倍。对I/O密集操做的应用来讲,设备相关的系统级架构对性能有巨大的影响。
5.2中断延迟
性能相关的另一个指标是中断延迟。这一般用从中断请求到中断服务程序第一条指令执行的时钟周期数来衡量。表8列出了Cortex-M处理器在零等待内存系统条件下的中断延迟比较。
表 8: 零等待内存系统条件下的中断延迟比较
事实上,真正的中断延迟受到内存系统等待状态的影响。例如,许多运行频率超过100Mhz的微控制器搭配的是很是慢的Flash存储器(例如30到50MHz)。虽然使用了Flash访问加速硬件来提升性能,中断延迟仍然受到Flash存储系统等待状态的影响。因此彻底有可能运行在零等待内存系统Cortex-M0/M0+系统比Cortex-M3/M4/M7有更短的中断延迟。
当评估性能的时候,不要忘记把中断处理程序的执行时间考虑在内。某些8位或者16位处理器架构可能中断延迟很短,可是会花费数倍的时钟周期完成中断处理。很是短的中断响应时间和很短的中断处理时间才是实际有效的。
六、调试和跟踪特性
6.1调试和跟踪特性简介
不一样Cortex-M处理器之间有若干区别。总结在表9中。
表9: 调试和跟踪特性比较
Cortex-M处理器的调试架构是基于ARM CoreSight调试架构设计的,它是个很是容易扩展的架构,支持多处理器系统。
表9列出的是典型设计须要考虑的。在CoreSight架构下,调试接口和跟踪接口模块是和处理器分离的。所以你采用的设备的调试和跟踪链接和表9的可能不同。也可能经过添加一些额外的CoreSight调试组件来增长一些调试特性。
6.2Debug connections调试接口
调试接口可让调试者实现
-访问控制调试和跟踪特性的寄存器。
-访问内存空间。对Cortex-M系列处理器,及时当处理器运行时也能够执行内存空间访问。这被称做实时内存访问。
-访问处理器核心寄存器。这只能当处理器中止的时候才能够操做。
-访问Cortex-M0处理器中微跟踪缓存(MTB)生成的跟踪历史记录。
另外,调试接口也会用做:
-Flash 编程
Cortex-M系列处理器能够选择传统的4到5个引脚(TDI, TDO, TCK, TMS 和可选的 nTRST)的JTAG接口,或者选择新的只须要两个引脚的串行调试协议接口,串行调试接口对有限数目引脚的设备是很是适合的。
图 10: 串口线或者JTAG调试接口allows access to processor’s debug features and memory space including peripherals
串行线调试协议接口能够处理JTAG支持的全部特性,支持奇偶校验。串行调试协议被ARM工具厂商普遍的采用,许多调试适配器两种协议都支持,串行线型号共享调试接口上TCK和TMS针脚。
6.3跟踪接口
跟踪接口让调试者能够在程序执行时实时的(很小的延时)收集程序运行的信息。收集的信息能够是Cortex-M3/M4/M7/M33支持的嵌入式跟踪单元(ETM)生成的程序指令流信息(指令跟踪),能够是数据跟踪单元(DWT)生成的数据/事件/性能分析信息,或者是软件控制数据跟踪单元(ITM)生成的信息。
有两种类型的跟踪接口可用:
-跟踪端口(Trace port)– 多个数据线加上时钟信号线。比SWV有更高的跟踪带宽,能够支持SWV的全部跟踪类型加上指令跟踪。Cortex-M3/M4/M7或者 Cortex-M33的设备上,跟踪端口一般有4个数据线和一个时钟线。(图11)
-串行监视器(SWV)– 单引脚线跟踪接口,能够选择性的支持数据跟踪,事件跟踪,性能分析和测量跟踪。(图 12)
图 11: Trace port 支持指令跟踪和其余跟踪功能必要的带宽
跟踪接口提供了在处理器运行的时候获取大量有用信息的能力。例如嵌入式跟踪单元(ETM)能够获取指令运行历史记录,数据跟踪单元(ITM)让软件产生消息(例如,经过printf)并利用Trace接口获取。另外,Cortex-M3/M4/M7/M33支持数据跟踪单元(DWT)模块。
-可选的数据跟踪:内存地址的信息(例如,地址,数据和时间戳的组合)能够在处理器访问这个地址的时候采集
-性能分析跟踪:CPU在不一样操做任务使用的时钟周期数(例如,内存访问,休眠)
-事件跟踪:提供服务器响应的中断/异常的运行时间和历史
图 12: Serial wire viewer 提供了低成本,少引脚的跟踪方案
这些跟踪特性被各类工具厂商普遍采用,采集的信息也被以各类方式直观的展示出来。例如DWT获取的数据能够在Keil ?Vision调试器中以波形的方式展示出来(Keil微控制器开发工具的一部分)如图 13所示。
Figure 13: Keil µVision 调试器的逻辑分析器
虽然Cortex-M0 和 Cortex-M0+不支持跟踪接口,Cortex-M0+支持叫作微跟踪缓存的特性(MTB,图14)。MTB让用户分配一小块系统SRAM做为存储指令的缓存,一般设置为循环缓存,这样能够抓取最新的指令执行历史并在调试器上显示出来。
这个MTB跟踪特性也被Cortex-M23 and Cortex-M33支持。
图 14: Cortex-M0+/M23/M33 的MTB提供了低成本指令跟踪方案
七、基于Cortex-M处理器的产品开发
7.1为何Cortex-M系列处理器容易使用
虽然Cortex-M系列处理器有很是多的特性,可是很容易使用的。例如,差很少全部的开发均可以用像C语言这样的高级编程语言。虽然,基于Cortex-M系列处理器产品都大不相同(例如,有不一样大小的内存,不一样的外设,性能和封装等等),架构的一致性让开发者一旦对他们其中的一块有开发经验,就很容易开始使用新的Cortex-M处理器。
为了实现更容易的软件开发,更好的软件重用性和可移植性,ARM开发了CMSIS-CORE,这儿CMSIS表示Cortex-Microcontroller Software Interface Standard,CMSIS-CORE经过一组APIs为处理器的各类特性像终端管理控制提供了一个标准的硬件抽象层(HAL), CMSIS-CORE集成在各类微处理器厂商提供的设备驱动程序库里,被各类开发工具套件支持。
除了CMSIS-CORE, CMSIS还包含一个DSP软件库(CMSIS-DSP)。这个库提供了为Cortex-M4 和 Cortex-M7优化过的各类DSP函数,固然也支持其余的Cortex-M系列处理器。CMSIS-CORE 和 CMSIS-DSP库都是免费的,能够从GitHub (CMSIS 4, CMSIS 5)下载到,并被许多工具厂商支持。
7.2处理器选择
对大多数微控制器用户来讲,微控制器设备的选择标准主要取决于成本和外设的支持状况。可是,大家中间的不少人多是为下个芯片产品选择处理器核心芯片设计者,这种状况下,处理器 自己会是考虑的焦点。
明显的,在这样的状况下,性能,芯片面积,功耗和成本会是相当重要的因素。同时,还有各类其余的因素须要考虑。例如,若是你在开发一款互联网链接产品,你也许须要选择有TrustZone安全扩展和MPU的处理器,这样你能够用TrustZone保护关键的安全特性数据,运行某些任务在非特权级别并用MPU来保护内存空间。另外一方面,若是你须要在某些方面认证你的产品,Cortex-M23, Cortex-M33, Cortex-M3, Cortex-M4 和 Cortex-M7支持的ETM生成的指令跟踪会对代码覆盖率认证很是有帮助。
在其余的芯片设计领域,若是你正在设计能够运行在能量采集设备供电的小传感器,那么Cortex-M23 和 Cortex-M0+会是最好的选择,由于他们很是小而且作了最早进的功耗优化。
7.3生态系统
使用ARM Cortex-M系列处理器的关键优点之一是普遍的成熟设备,开发工具链和软件库的支持。目前有
-超过15家微控制器厂商正在销售基于ARM Cortex-M系列内核的微控制器产品
-超过10种开发套件支持ARM Cortex-M系列处理器
-40多家操做系统厂商的操做系统支持Cortex-M系列处理器
这给了你大量选择,让你能够得到适合目标应用的最好的设备,开发工具和中间件组合。
八、总结 性能,特性和芯片面积,功耗之间老是须要平衡。为此,ARM开发了各类Cortex-M处理器,拥有不一样级别的指令集特性,性能,系统和调试特性。本文介绍了Cortex-M处理器家族各类异同。 虽然存在这差异,但架构的一致性和CMSIS-CORE标准化的APIs都让Cortex-M系列处理器软件有更好的移植性和可重用性。同时,Cortex-M系列处理器很是方便使用。所以,Cortex-M系列处理器很快成为微控制器市场的最受欢迎的32位处理器架构。 额外的资源 Cortex-M系列处理器产品信息能够查找https://developer.arm.com/products/processors/cortex-m 一系列有用的Cortex-M资源存在下面的网址https://community.arm.com/processors/b/blog/posts/cortex-m-resources 关于ARMv8-M TrustZone的其余的有用的资源能够查找ARM社区(community.arm.com)的“TrustZone for ARMv8-M Community”。ARM社区是为开发者和开发工具厂商,产品方案商之间提供的一个免费的,开放的,非正式的交流区 本文中出现的商标是ARM有限公司(或其子公司)在欧盟和/或其余地方注册的/或未注册的商标。保留全部权利。文中全部其余标志多是其余全部人的商标。欲了解更多信息,请访问arm.com/about/trademarks。