精华内容
下载资源
问答
  • alloc-cortex-m用于Cortex-M处理器的堆分配器该项目由Cortex-M团队开发和维护。 文档更改日志许可alloc-cortex-m用于Cortex-M处理器的堆分配器该项目由Cortex-M团队开发和维护。 文档更改日志许可证根据Apache许可证...
  • Cortex-M是爱特梅尔公司发布的全新Atmel? SAM D20微控制器,采用的是是微控制器标准。微控制器处理器通常设计成面积很小和能效比很高。通常这些处理器的流水线很短,时钟频率很低(虽然市场上有此类的处理器可以运行...
  • The Designer’s Guide to the Cortex-M Microcontrollers gives you an easy-to-understand introduction to the concepts required to develop programs in C with a Cortex-M based microcontroller....
  • Cortex-M开发入门白皮书,ARM公司专家Joseph Yiu(没错就是写Cortex-M权威指南那本书的作者)写得,白皮书中简要对比了M0/M0+/M1/M3/M4/M7/M23/M33的差异,使人一目了然
  • 在本文中,我们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照Cortex-M 系列处理器的指令集和高级中断处理能力,以及 SoC系统级特性,调试和追踪...

    原文作者:Joseph Yiu, 高级嵌入式技术经理, ARM
     

    概要

    ARM Cortex-M处理器家族现在有8款处理器成员。在本文中,我们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照Cortex-M 系列处理器的指令集和高级中断处理能力,以及 SoC系统级特性,调试和追踪功能和性能的比较

    1 简介

    今天, ARM Cortex-M 处理器家族有8款处理器成员。除此之外,ARM的产品系列还有很多其他的处理器成员。对很多初学者,甚至某些芯片设计经验丰富但是不熟悉ARM系列处理器的设计者来说,也是很容易混淆这些产品的。不同的ARM 处理器有不同的指令集,系统功能和性能。本文会深入展现Cortex-M系列处理器之间的关键区别,以及它们和ARM其他系列处理器的不同。

    1.1 ARM处理器家族

    多年来, 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 微控制器处理器在单片机和深度嵌入式系统市场非常成功和受欢迎。

     

    图1: 处理器家族

     

    表 1 总结了三个处理器系列的主要特征。

    表1: 处理器特性总结

    1.2 Cortex-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.3 Cortex-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处理器间的异同点会在本文的其余部分讲解。

    2 Cortex-M处理器指令集

    2.1 指令集简介

    大多数情况下,应用程序代码可以用C或其他高级语言编写。但是,对Cortex-M 处理器支持指令集的基本了解有助于开发者针对具体应用选择合适的Cortex-M处理器。指令集(ISA)是处理器架构的一部分,Cortex-M处理器可以分为几个架构规范

     

    表3: Cortex-M 处理器ARM架构规范的规范

    所有的Cortex-M 处理器都支持Thumb指令集。整套Thumb指令集扩展到Thumb-2版本时变得相当大。但是,不同的Cortex-M处理器支持不同的Thumb 指令集的子集,如图3所示

     

     

    图3: Cortex-M 处理器的指令集

    2.2 Cortex-M0/M0+/M1指令集

    Cortex-M0/M0+/M1处理器基于ARMv6-M架构。这是一个只支持56条指令的小指令集,大部分指令是16位指令,如图3所示只占很小的一部分。但是,此类处理器中的寄存器和处理的数据长度是32位的。对于大多数简单的I/O控制任务和普通的数据处理,这些指令已经足够了。这么小的指令集可以用很少的电路门数来实现处理器设计,Cortex-M0 和 Cortex-M0+最小配置仅仅12K门。然而,其中的很多指令无法使用高位寄存器(R8 到R12), 并且生成立即数的能力有限。这是平衡了超低功耗和性能需求的结果。

    2.3 Cortex-M3指令集

    Cortex-M3处理器是基于ARMv7-M架构的处理器,支持更丰富的指令集,包括许多32位指令,这些指令可以高效的使用高位寄存器。另外,M3还支持:

    • 查表跳转指令和条件执行(使用IT指令)
    • 硬件除法指令
    • 乘加指令(MAC)
    • 各种位操作指令

    更丰富的指令集通过几种途径来增强性能;例如,32位Thumb指令支持了更大范围的立即数,跳转偏移和内存数据范围的地址偏移。支持基本的DSP操作(例如,支持若干条需要多个时钟周期执行的MAC指令,还有饱和运算指令)。最后,这些32位指令允许用单个指令对多个数据一起做桶型移位操作。

    支持更丰富的指令导致了更大的面积成本和更高的功耗。典型的微控制器,Cortex-M3的电路门数是Cortex-M0 和 Cortex-M0+两倍还多。但是,处理器的面积只是大多数现代微控制器的很小的一部分,多出来的面积和功耗经常不那么重要。

    2.4 Cortex-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

    The uses of SIMD enable much faster computation of 16-bit and 8-bit data in certain DSP operations as the calculation can be parallelized. However, in general programming, C compilers are unlikely to utilize the SIMD capability. That is why the typical benchmark results of the Cortex-M3 and Cortex-M4. However, the internal data path of the Cortex-M4 is different from Cortex-M3, which enable faster operations in a few cases (e.g. single cycle MAC, and allow write back of two registers in a single cycle).在某些DSP运算中,使用SIMD可以加速更快计算16位和8位数据,因为这些运算可以并行处理。但是,一般的编程中,C编译器并不能充分利用SIMD运算能力。这是为什么Cortex-M3 和 Cortex-M4典型benchmark的分数差不多。然而,Cortex-M4的内部数据通路和Cortex-M3的不同,某些情况下Cortex-M4可以处理的更快(例如,单周期MAC,可以在一个周期中写回到两个寄存器)。

    2.5 Cortex-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.6 Cortex-M23指令集

    Cortex-M23的指令集是基于ARMv8-M的Baseline子规范,它是ARMv6-M的超集。扩展的指令包括:

    • 硬件除法指令
    • 比较和跳转指令,32位跳转指令
    • 支持TrustZone安全扩展的指令
    • 互斥数据访问指令(通常用于信号量操作)
    • 16位立即数生成指令
    • 载入获取及存储释放指令(支持C11)

    在某些情况下,这些增强的指令集可以提高处理器性能,并且对包含多个处理器的SoC设计有用(例如,互斥访问对多处理器的信号量处理有帮助)

    2.7 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 架构特性

    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.4 TrustZone安全扩展

    近几年来, 物联网(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 系统特性

    4.1 低功耗

    低功耗是Cortex-M处理器的一个关键优点。低功耗是其架构的组成部分:

    1. WFI和WFE指令

    2. 架构级的休眠模式定义

    此外,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.2 Bit-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来实现存储空间访问权限和存储空间属性或者存储区间的定义。运行实时操作系统的嵌入式系统,3操作系统会每个任务定义存储空间访问权限和内存空间配置来保证每个任务都不会破坏其他的任务或者操作系统内核的地址空间。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 性能考虑

    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 调试和跟踪特性

    6.1 调试和跟踪特性简介

    不同Cortex-M处理器之间有若干区别。总结在表9中。

    表9: 调试和跟踪特性比较

    Cortex-M处理器的调试架构是基于ARM CoreSight调试架构设计的,它是个非常容易扩展的架构,支持多处理器系统。

    表9列出的是典型设计需要考虑的。在CoreSight架构下,调试接口和跟踪接口模块是和处理器分离的。因此你采用的设备的调试和跟踪连接和表9的可能不一样。也可能通过添加一些额外的CoreSight调试组件来增加一些调试特性。

    6.2 Debug 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)生成的信息。

    有两种类型的跟踪接口可用:

    1. 跟踪端口(Trace port)– 多个数据线加上时钟信号线。比SWV有更高的跟踪带宽,可以支持SWV的所有跟踪类型加上指令跟踪。Cortex-M3/M4/M7或者 Cortex-M33的设备上,跟踪端口通常有4个数据线和一个时钟线。(图11)
    2. 串行监视器(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提供了低成本指令跟踪方案

    7 基于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系列处理器的关键优势之一是广泛的成熟设备,开发工具链和软件库的支持。目前有

    1. 超过15家微控制器厂商正在销售基于ARM Cortex-M系列内核的微控制器产品

    2. 超过10种开发套件支持ARM Cortex-M系列处理器
    3. 40多家操作系统厂商的操作系统支持Cortex-M系列处理器

    这给了你大量选择,让你可以获得适合目标应用的最好的设备,开发工具和中间件组合。

    8 总结

    性能,特性和芯片面积,功耗之间总是需要平衡。为此,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-mresources

    关于 ARMv8-M TrustZone 的其他的有用的资源可以查找 ARM 社区(community.arm.com)的“TrustZone for ARMv8-M Community”。 ARM 社区是为开发者和开发工具厂商,产品方案商之间提供的一个免费的, 开放的,非正式的交流区

    本文中出现的商标是 ARM 有限公司(或其子公司)在欧盟和/或其他地方注册的/或未注册的商标。保留所有权利。文中所有其他标志可能是其他所有人的商标。欲了解更多信息,请访问 arm.com/about/trademarks。

    展开全文
  • Cortex-M内核系列和STM32-讲座2
  • 集微网消息,ARM处理器在嵌入式设备领域的应用非常广泛。基于ARM Cortex处理器的片上系统(SoC)解决方案适用于多种嵌入式设计...M系列:低功耗、确定性、成本敏感的微控制器,专门优化以满足其需求。 其中,Cort.

    http://news.eeworld.com.cn/xfdz/article_2017011259937.html
     

    集微网消息,ARM处理器在嵌入式设备领域的应用非常广泛。基于ARM Cortex处理器的片上系统(SoC)解决方案适用于多种嵌入式设计细分市场,如物联网、电机控制、医疗、汽车、家电自动化等。Cortex系列处理器主要基于3大产品类型量身开发,A系列:运行复杂系统的精细高端应用;R系列:高性能硬实时系统;M系列:低功耗、确定性、成本敏感的微控制器,专门优化以满足其需求。

    其中,Cortex-M家族32位微控制器(MCU)在业内最广为人知。该家族包括超低功耗的Cortex-M0/0+、主流的Cortex-M3、带DSP浮点运算的Cortex-M4和最高性能的Cortex-M7系列。

    去年11月,ARM公司又推出了Cortex-M家族的继承者,分别是Cortex-M23和Cortex-M33 MCU。其中,Cortex-M23是Cortex-M0+的继任者,主打超低功耗,而Cortex-M33是Cortex-M3和Cortex-M4的继任者,性能更强,具有DSP浮点运算功能。

    据悉,ARM Cortex-M23与Cortex-M33是首款基于ARM公司最新的ARMv8-M架构的嵌入式处理器,而Cortex-M0/0+、Cortex-M3、Cortex-M4和Cortex-M7则是基于上一代的ARMv7-M架构。

    那么,Cortex-M23与Cortex-M33到底拥有着怎样的特色呢?

    Cortex-M33是一款能在性能、功耗和安全之间实现最佳平衡的处理器

     

    Cortex-M33是首款采用TrustZone安全技术和数字信号处理技术的ARMv8-M全功能实现处理器。该处理器可以支持大量灵活的配置选项,并在广泛应用中进行部署,此外还提供专用的协同处理器界面以支持经常需要加速和大量运算的运作。Cortex-M33是一款在性能、功耗、安全与生产力之间达到最佳平衡的处理器。

     

    为了显著降低系统功耗,Cortex-M33处理器采用有序三阶管线技术。大部分指令在头两个阶段就能完成,而复杂的指令则需要3个阶段。此外,某些16位指令将采用双发射机制,以增强性能。处理器内核有两个AMBA 5 AHB5界面:C-AHB和S-AHB,完全对称,指令和数据提取性能不分伯仲。

     

    接下来,让我们了解一下Cortex-M33的五大特色:

     

    1 、为ARMv8-M 量身优化的TrustZone技术为整个系统的安全保驾护航

        

    采用TrustZone技术的Cortex-M33处理器拥有两个安全状态及多种相关特色:

     

     

    安全状态和非安全状态的全面利用,必将开启众多新机遇和新应用的大门。该系统使用的高价值专利固件可以在安全状态下运行。在安全状态下设置的监管员代码则可以在系统受到攻击或不可靠运行后将其恢复初始;而非安全侧则像以前一样向正在用Cortex-M开发软件的数百万开发者开放。

    2 、协同处理器界面,实现高扩展性

    对某些应用而言,专用运算起到的作用可谓非同小可;但为了实现专用运算,这个全球最强大设计生态系统的所有优点必须完美保留,即允许设计师在开发工具、编译器、调试器、操作系统和中间件之间最大限度的进行选择。ARM生态系统可以帮助开发商节约时间和成本,进一步提高生产力。

    Cortex-M33处理器包含一个可以选配、类似总线的专用界面,主要用于集成紧耦合加速器硬件。对需要频繁运算的操作而言,该界面可以帮助设计师用自定义的处理硬件提升通用运算能力。须着重指出的是,这样做并不会使整个生态系统分裂。该界面包含最多可用于8个协同处理器的控制和数据通路,发出的信号可显示处理器的特权状态和安全状态、指令类型、相关寄存器和操作字段。协同处理器通常会合理的在几个少数循环内完成,或在后台运行并在完成时自动停止。操作的细节和数据可以通过该界面与单指令同时传输,如有需要,还可插入等待状态。

    3 、用于任务隔离的存储保护单元(MPU)

    设计师可以自行对选配的MPU编程,为每个安全状态和非安全状态提供多达16个区域。在多任务环境中,操作系统可以在任务情境切换时重新编程MPU,为每个任务定义存储访问许可。比如说,某个应用的某个任务只被允许访问某些应用数据和特定的周边设备,这种情况下,MPU将保护所有其他的存储和周边设备,将讹误或未授权访问阻挡在外,有效提升系统可靠性。

     

    Cortex-M33存储保护架构的开发基于受保护的存储系统架构PMSAv8。最新版本搭载了针对各区域的基线与限值比较器,而非此前的二次方尺寸对齐模型。每个区域都有一个基线的初始地址、终止地址,以及访问许可和存储性质的设定值,因此在这一架构中,设计师设计MPU区域时再也无需顾虑将多个区域整合在一起的麻烦了。功能强化后,软件开发变得更加简单,客户的使用意愿提升,编程步骤也得以减少,并将进而降低情境转换次数。

    4 、DSP拓展

    选配的整数DSP拓展可以为系统增加85个新指令。大多数情况下,DSP指令可将性能平均提升3倍,让所有以数字信号控制为中心的应用性能突飞猛进。

    为帮助设计师加速软件开发,ARM将在CMSIS项目中提供免费的DSP库,包含整套过滤、转换和数学功能(如矩阵),并支持多种数据类型。CMSIS项目是开源的,其开发详情发布在github上。

    5 、单精度浮点单元

    基于FPv5的选配单精度浮点拓展单元包括一份额外的16-入口 64位寄存器文件。该拓展新增45个与IEEE754-2008兼容的单精度浮点指令。使用浮点指令通常可将软件库平均性能提升10倍。FPU位于单独的电源域,负责在整个单元不使用的时候切断电源。

        

    Cortex-M23是一款尺寸最小、能效最高的处理器

     

    ARM Cortex-M23采用TrustZone技术,是尺寸最小、能效最高的处理器。小型嵌入式应用对芯片的安全性能有严格要求,基于ARMv8-M基线架构的Cortex-M23处理器则是最佳解决方案。

    同样地,让我们也来了解一下Cortex-M23的五大特色:

    1、为ARMv8-M量身打造的TrustZone技术:安全实现的基础

    TrustZone技术为ARMv8-M度身优化,可以在每一台搭载Cortex-M23处理器的设备上以硬件形式实现可信软件和非可信软件强制隔离。因此,采用TrustZone,设计师只需一个处理器就可以设计嵌入式应用,此前则必须使用多个处理器才能在可信区域和非可信区域之间实现物理隔离。仅需Cortex-M23处理器,既可出色实现多项安全需求,如设备识别管理、高价值固件保护、软件认证、安全根等等。

    采用TrustZone技术的Cortex-M23处理器具备以下两种安全状态:

    • 安全状态 – 可以访问安全和非安全资源(存储、周边设备等)

    • 非安全状态 – 只可访问非安全资源

    两种安全状态下的代码执行转换和代码访问均由硬件监管,最大限度地降低转换管理成本并保证确定性——这也是所有Cortex-M处理器的标志性功能。

     

    2、紧凑二阶布线处理器

    Cortex-M23是一款简单的二阶布线冯诺依曼处理器(Von Neumann processor),但却足以支持全套ARMv8-M基线指令集。熟悉Cortex-M0+的用户一定可以迅速指出Cortex-M23使能效最大化的众多相似特色:WFI(等待中断)/WFE(等待事件)和睡眠/深度睡眠模式、退出时睡眠、SysTick定时器和选配的单循环IO等。

    指令集共包含80条左右的拇指指令,其中大多数都是16位指令(为了尽可能提高代码的紧凑度),但仍有一些为了提升效率而设置的32位指令。Cortex-M23支持所有的ARMv6-M指令,以帮助设计师轻而易举地将代码从Cortex-M0和Cortex-M0+处理器转移至Cortex-M23。此外ARMv8-M基线指令集中还加入了多条新指令以提升条件运算、互斥访问、硬件划分运算和即时移动的效率。

    3、强化的调试纠错与追溯能力

    仅凭一台高效安全的32位处理器,尚无法成功实现字段部署,软件开发的成本通常超过生产和硬件IP的总和。Cortex-M23引入更多可配置的硬件断点和数据观测点,对比其他ARMv6-M处理器,可以助设计师更轻松地实现软件开发与调试。除了Cortex-M0+ 处理器中也配置的微型跟踪缓冲器(MTB),Cortex-M23还包括选配的嵌入式跟踪宏单元(ETM)。有了这些选配功能,设计师可以自行判断,究竟选择更加丰富全面的指令追溯能力;还是性价比更高、更加精简的指令追溯能力。

    4、 用于任务隔离的存储保护单元

        

    Cortex-M23还包括选配存储保护单元(MPU),基于全新PMSAv8架构打造,设计师使用起来非常方便。它可以在安全和非安全状态的任何一个状态下最多“保护”16个区域。每个区域都有一个基础地址、结束地址、访问许可和存储属性设置。在多任务环境下,操作系统可以在任务情境切换的过程中重新编程MPU,定义每个任务的存储许可,比如允许应用任务访问全部或部分应用数据和特定的周边设备。通过保护许可之外的数据免遭污染,并阻止未授权来源访问许可之外的周边设备,该MPU可以显著提升系统可靠性。

     

    更易设置的存储区域

    Cortex-M23的存储保护架构采用基线和限值比较器,用以定义存储区域,而此前使用的是二次方尺寸对齐比较器。这项改进简化了软件研发的复杂程度,而且在某些情况下,当区域尺寸不是完美的二次方尺寸时,还能减少存储浪费。

    5、 全新ARMv8-M基线指令

    对比ARMv6-M,Cortex-M23加入了许多全新指令,但丝毫没有折损Cortex-M系列处理器的超高能效。大多数新指令(除用于安全拓展外)都继承自ARMv7-M的架构指令集,进一步拓展Cortex-M23的功能,并与Cortex-M0+ 处理器形成鲜明区分。

    5.1安全拓展

    ARMv8-M采用的TrustZone安全技术为基线指令集补充了全新指令,包括安全网关(SG)、非安全支路(BXNS、BLXNS)以及测试目标(TT)指令。欲知详情,请参阅Yiu撰写的《ARMv8-M 架构介绍》。

    5.2 仅执行代码生成

    对仅执行(Execute-Only)代码存储区的支持也获得改善,新增加的即时移动指令(从ARMv7-M继承的MOV/MOVT)可以在仅执行代码中生成即时数据,让设计师仅凭2条指令便能生成32位值,且无需运行实际负载。

    5.3代码优化

    条件比较和支路指令(从ARMv7-M继承的CBNZ/CBZ)可以提高多项条件控制代码序列的性能。长偏移即时支路(从ARMv7-M继承的)可以将支路指向遥远的目标地址;硬件整数划分指令(从ARMv7-M继承的SDIV/UDIV)则可以减少除法运算的处理循环。

    5.4排斥存取

        

    Cortex-M23还从ARMv7-M继承了负载和储存的专用指令,提升Cortex-M23在多核系统中的一贯性,确保多个处理器以同样的机制处理信号。此外,为了对C11/C++11提供稳定支持,Cortex-M23还新增ARMv8-A(Thumb 32版本)的负载获取与储存释放指令,并包括这些指令的排斥存取变种。

     

    展开全文
  • 这是Homebrew二进制存储库,用于ARM Cortex-MCortex-R处理器(Cortex-M0 / M0 + / M3 / M4 / M7 / M23 / M33,Cortex-R4 / R5 / R7 / R8和更多的)。 安装公式 首先brew tap osx-cross/arm ,然后brew install ...
  • ARM Cortex-M处理器详解

    千次阅读 2020-05-09 14:29:57
    ARM Cortex-M处理器家族现在有8款处理器成员。在本文中,我们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照Cortex-M 系列处理器的指令集和高级...

    ARM Cortex-M处理器家族现在有8款处理器成员。在本文中,我们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照Cortex-M 系列处理器的指令集和高级中断处理能力,以及 SoC系统级特性,调试和追踪功能和性能的比较。
      1、简介
      今天, 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 微控制器处理器在单片机和深度嵌入式系统市场非常成功和受欢迎。

    表1总结了三个处理器系列的主要特征。

    1.2Cortex-M 处理器家族
      Cortex-M处理器家族更多的集中在低性能端,但是这些处理器相比于许多微控制器使用的传统处理器性能仍然很强大。例如,Cortex-M4和Cortex-M7处理器应用在许多高性能的微控制器产品中,最大的时钟频率可以达到400Mhz。
      当然,性能不是选择处理器的唯一指标。在许多应用中,低功耗和成本是关键的选择指标。因此,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)
      -易用性
      例如,嵌套向量中断控制器是内置的中断控制器

    支持许多外围设备的中断输入,一个不可屏蔽的中断请求,一个来自内置时钟(SysTick)的中断请求(见章节 3.3)和一定数量的系统异常请求。NVIC处理这些中断和异常的优先级和屏蔽管理。
      NVIC以及异常处理模型的更多的内容在章节3.2描述。其他Cortex-M处理器间的异同点会在本文的其余部分讲解。
      2、Cortex-M处理器指令集
      2.1指令集简介
      大多数情况下,应用程序代码可以用C或其他高级语言编写。但是,对Cortex-M 处理器支持指令集的基本了解有助于开发者针对具体应用选择合适的Cortex-M处理器。指令集(ISA)是处理器架构的一部分,Cortex-M处理器可以分为几个架构规范。

    所有的Cortex-M 处理器都支持Thumb指令集。整套Thumb指令集扩展到Thumb-2版本时变得相当大。但是,不同的Cortex-M处理器支持不同的Thumb 指令集的子集,如图3所示

    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 操作:

     在某些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)总结了那些关键的差异。

    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、架构特性
      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可选的浮点运算单元使用的。

    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所示。

    另外一个编程模型之间的不同是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所示。

     请注意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具有的优先等级调整功能。

    所有的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中:

     大部分情况下,对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))处在安全状态。

    非安全状态的软件只能访问非安全状态的存储空间和外围设备,安全软件可以访问两种状态下的所有资源。
      用这种方案,软件开发者可以用以往的方式开发非安全环境下的应用程序。同时,他们可以借助芯片厂商提供的安全通讯软件库执行安全物联网连接。并且即使运行在非安全环境的特权级的程序有漏洞,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产品子规范中额外的错误处理程序提供了灵活的错误处理能力,错误状态寄存器让错误事件的定位和调试更加容易。很多商业开发套件中的调试器已经内嵌了使用错误状态寄存器来诊断错误事件的功能。此外,错误处理程序可以在运行时做一些修复工作。

    4、系统特性
      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、性能考虑
      5.1通用数据处理能力
      在通用微控制器市场,benchmark数据经常用来衡量微控制器的性能,表7是Cortex-M处理器常用benchmark测试的性能数据:

    关于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处理器在零等待内存系统条件下的中断延迟比较。

     事实上,真正的中断延迟受到内存系统等待状态的影响。例如,许多运行频率超过100Mhz的微控制器搭配的是非常慢的Flash存储器(例如30到50MHz)。虽然使用了Flash访问加速硬件来提高性能,中断延迟仍然受到Flash存储系统等待状态的影响。所以完全有可能运行在零等待内存系统Cortex-M0/M0+系统比Cortex-M3/M4/M7有更短的中断延迟。
      当评估性能的时候,不要忘记把中断处理程序的执行时间考虑在内。某些8位或者16位处理器架构可能中断延迟很短,但是会花费数倍的时钟周期完成中断处理。非常短的中断响应时间和很短的中断处理时间才是实际有效的。
      6、调试和跟踪特性
      6.1调试和跟踪特性简介
      不同Cortex-M处理器之间有若干区别。总结在表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接口,或者选择新的只需要两个引脚的串行调试协议接口,串行调试接口对有限数目引脚的设备是非常适合的。

    串行线调试协议接口可以处理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)

    跟踪接口提供了在处理器运行的时候获取大量有用信息的能力。例如嵌入式跟踪单元(ETM)可以获取指令运行历史记录,数据跟踪单元(ITM)让软件产生消息(例如,通过printf)并利用Trace接口获取。另外,Cortex-M3/M4/M7/M33支持数据跟踪单元(DWT)模块。
      -可选的数据跟踪:内存地址的信息(例如,地址,数据和时间戳的组合)可以在处理器访问这个地址的时候采集
      -性能分析跟踪:CPU在不同操作任务使用的时钟周期数(例如,内存访问,休眠)
      -事件跟踪:提供服务器响应的中断/异常的运行时间和历史

    这些跟踪特性被各种工具厂商广泛采用,采集的信息也被以各种方式直观的展现出来。例如DWT获取的数据可以在Keil ?Vision调试器中以波形的方式展现出来(Keil微控制器开发工具的一部分)如图 13所示。

    虽然Cortex-M0 和 Cortex-M0+不支持跟踪接口,Cortex-M0+支持叫做微跟踪缓存的特性(MTB,图14)。MTB让用户分配一小块系统SRAM作为存储指令的缓存,通常设置为循环缓存,这样可以抓取最新的指令执行历史并在调试器上显示出来。
      这个MTB跟踪特性也被Cortex-M23 and Cortex-M33支持。

    7、基于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系列处理器
      这给了你大量选择,让你可以获得适合目标应用的最好的设备,开发工具和中间件组合。
      8、总结
      性能,特性和芯片面积,功耗之间总是需要平衡。为此,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。

    展开全文
  • 基于ARM Cortex处理器的片上系统(SoC)解决方案适用于多种嵌入式设计细分... 最先采用ARMv8-M架构的2款处理器为Cortex-M23和Cortex-M33。本文主要介绍Cortex-M33, Cortex-M33是首款采用TrustZone安全技术和数字信号
  • Joseph Yiu, 高级嵌入式技术经理, ARMWilliam Gao, ARM 中国应用工程师与 Gabriel Wang,ARM 中国嵌入式应用工程师对于本文中文版亦有帮助概要ARMCortex-M 处理器家族现在有 8 款处理器成员。在本文中,我们会比较 ...

    Joseph Yiu, 高级嵌入式技术经理, ARM

    William Gao, ARM 中国应用工程师与 Gabriel Wang,ARM 中国嵌入式应用工程师对于本文中文版亦有帮助

    概要

    ARMCortex-M 处理器家族现在有 8 款处理器成员。在本文中,我们会比较 Cortex-M 系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的 Cortex-M 处理器。本文中会详细的对照 Cortex-M 系列处理器的指令集和高级中断处理能力,以及 SoC 系统级特性,调试和追踪功能和性能的比较。

    1 简介

    今天,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 微控制器处理器在单片机和深度嵌入式系统市场非常成功和受欢迎。

    图 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

    https://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 处理器间的异同点会在本文的其余部分讲解。

    2Cortex-M 处理器指令集

    2.1 指令集简介

    大多数情况下,应用程序代码可以用 C 或其他高级语言编写。但是,对 Cortex-M 处理器支持指令集的基本了解有助于开发者针对具体应用选择合适的 Cortex-M 处理器。指令集(ISA)是处理器架构的一部分,Cortex-M 处理器可以分为几个架构规范

    表 3: Cortex-M 处理器 ARM 架构规范的规范

    所有的 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

    The uses of SIMD enable much faster computation of 16-bit and 8-bit data in certain DSP operations as the calculation can be parallelized. However, in general programming, C compilers are unlikely to utilize the SIMD capability. That is why the typical benchmark results of the Cortex-M3 and Cortex-M4. However, the internal data path of the Cortex-M4 is different from Cortex-M3, which enable faster operations in a few cases (e.g. single cycle MAC, and allow write back of two registers in a single cycle). 在某些 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 架构特性

    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 系统特性

    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 性能考虑

    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 调试和跟踪特性

    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 提供了低成本指令跟踪方案

    7 基于 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 系列处理器

    这给了你大量选择,让你可以获得适合目标应用的最好的设备,开发工具和中间件组合。

    8 总结

    性能,特性和芯片面积,功耗之间总是需要平衡。为此,ARM 开发了各种 Cortex-M 处理器,拥有不同级别的指令集特性,性能,系统和调试特性。本文介绍了 Cortex-M 处理器家族各种异同。

    虽然存在这差别,但架构的一致性和 CMSIS-CORE 标准化的 APIs 都让 Cortex-M 系列处理器软件有更好的移植性和可重用性。同时,Cortex-M 系列处理器非常方便使用。因此,Cortex-M 系列处理器很快成为微控制器市场的最受欢迎的 32 位处理器架构。

    展开全文
  • Cortex三种系列----A系列、R系列、M系列组合在一起就是ARM,也就是设计这些芯片架构的公司名称。 Cortex就是大脑皮层的意思 一、Cortex-A先进的处理器 1.Cortex-A5 可定制的处理器,可在低功耗配置中实现高性能 ...
  • 一文看懂ARM Cortex-M处理器

    千次阅读 2019-12-03 19:31:40
    ARM Cortex-M处理器家族现在有8款处理器成员。在本文中,我们会比较Cortex-M系列处理器之间的产品特性,重点讲述如何根据产品应用选择正确的Cortex-M处理器。本文中会详细的对照Cortex-M 系列处理器的指令集和高级...
  • Cortex-MCortex-A认识ARM处理器

    千次阅读 多人点赞 2018-08-17 17:00:00
    Cortex-A、Cortex-R、Cortex-M、Machine Learning、SecurCore 。前3种我们大部分人都听说过,见下图: 2 Cortex-A先进的处理器 1.Cortex-A5 可定制的处理器,可在低功耗配置中实现高性能 可扩展的多功能性,适用于对...
  • 这个速率调节到10MHz试试
  • 文章目录ARM Cortex-M处理器简介什么是Cortex-M处理器Cortex-M3和M4处理器Cortex-M处理器家族处理器和微控制器区别Cortex-M处理器的优势低功耗性能能耗效率代码密度中断易于使用可扩展性调试特性OS支持多种系统特性...
  • 关注+星标公众号,不错过精彩内容转自 | 痞子衡嵌入式今天给大家分享的是Cortex-M系统中断延迟及其测量方法。在嵌入式领域里,实时性是个经常被我们挂在嘴边的概念,这里的实时性主要强调得...
  • 1、Cortex-M运行模式 2、Cortex-A运行模式 二、寄存器组 1、Cortex-M寄存器组 2、Cortex-A寄存器组 一、运行模式对比 1、Cortex-M运行模式 STM32只有两种运行模式,hander模式和线程模式。根据操作权限的不同...
  • 【说在前面的话】自从Arm在2016年的十月发布两款Armv8-M架构的新处理器Cortex-M23和Cortex-M33以来,已经过去了3年多,而市面上基于这两款处理器的微控制器产品也...
  • 2- ARM Cortex-M体系结构

    2021-05-25 22:55:29
    ARM公司在经典处理器ARM11以后的产品都改用Cortex命名,主要分成A、R和M三类,旨在为各种不同的市场提供服务,A 系列处理器面向尖端的基于虚拟内存的操作系统和用户应用;R系列处理器针对实时系统;M系列处理器针对...
  • 使用Matlab+Simulink开发Cortex-M系列嵌入式处理器应用程序文档编号TN_AAAA_A0关键字Matlab, Simulink, Cortex-M, 基于模型设计, Model-Based-Design摘要本技术笔记对使用Matlab+Simulink开发Cortex-M系列嵌入式...
  • Cortex-M系列:ARM架构与汇编指令集

    千次阅读 2020-02-05 00:29:35
    文中比的比较仅到Armv8-M架构的Cortex-M33,没涉及后续新版本(也没法预计到)。 目录 1 ARM处理器分类 2 基于Thumb-2技术的Thumb®指令集 3 参考资料 1 ARM处理器分类 ARM的老产品树: 1、第一级——架构:...
  • 文章目录 Cortex-M单片机 Cortex-M 软件接口标准 CMSIS 杂 ARM单片机工程的编译链 单片机makefile工程 单片机的boot 单片机的内存 cortex-M 单片机 的调试接口 调试下载框架及工具总览 为ARM芯片调试引出的管脚 JTAG...
  • ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构。 ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统,因为运行...
  • Cortex-M处理器指令集详解

    千次阅读 2019-08-18 18:55:21
    Cortex-M3处理器是基于ARMv7-M架构的处理器,支持更丰富的指令集,包括许多32位指令,这些指令可以高效的使用高位寄存器。 Cortex-M4在很多地方和Cortex-M3相同:流水线,编程模型。Cortex-M4支持Cortex-M3的所有...
  •   Cortex-M 内核本身提供了非常强大的异常处理机制。它可以非常有效的捕捉非法的内存访问以及其他一些异常。而我们常用的开发工具的异常处理就是使用了 Cortex-M 核的异常处理机制。   在 ARM 平台上开发,开发...
  • cortex-m 单片机在arm产品中的位置 https://developer.arm.com/ip-products/processors 下面有1类 processor ,是 cortex-m The Arm Cortex-M series contains the smallest/lowest power processors build by Arm,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,177
精华内容 8,870
关键字:

cortex-m