一文解析Cortex-M处理器架构特性

处理器/DSP

868人已加入

描述

  Cortex-M是爱特梅尔公司发布的全新Atmel® SAM D20微控制器,采用的是是全球微控制器标准。微控制器处理器通常设计成面积很小和能效比很高。通常这些处理器的流水线很短,最高时钟频率很低(虽然市场上有此类的处理器可以运行在200Mhz之上)。 并且,新的Cortex-M处理器家族设计的非常容易使用。因此,ARM 微控制器处理器在单片机和深度嵌入式系统市场非常成功和受欢迎。

  本文主要介绍的是Cortex-M处理器架构特性,分别从编程模型、异常处理模型和嵌套向量中断控制器NVIC、操作系统支持特性、TrustZone安全扩展及错误处理等几个方面来详细解析,具体的跟随小编一起来了解一下。

  一、编程模型

  Cortex-M处理器家族的编程模型是高度一致的。例如所有的Crotex-M处理器都支持R0到R15,PSR, CONTROL 和 PRIMASK。两个特殊的寄存器— FAULTMASK 和 BASEPRI—只有Cortex-M3, Cortex-M4, Cortex-M7 和 Cortex-M33支持;浮点寄存器组和FPSCR(浮点状态和控制寄存器)寄存器,是Cortex-M4/M7/M33可选的浮点运算单元使用的。

  Cortex-M

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

  Cortex-M

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

  请注意Cortex-M的编程模型和ARM7TDMI等这些经典的ARM处理器是不一样的。除了寄存器组不同外,经典ARM处理器中“模式”和“状态”的定义与Cortex-M中的也是不同的。Cortex-M只有两个模式:线程模式(Thread)和管理者模式(Handler),并且Cortex-M处理器一直运行在Thumb状态(不支持ARM指令)

  二、异常处理模型和嵌套向量中断控制器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

  所有的Cortex-M处理器在异常处理是都要依靠向量表。向量表保存着异常处理函数的起始地址(如图8所示)。向量表的起始地址由名为向量表偏移寄存器(VTOR)决定。

  1、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)。

  2、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处理器面向安全和非安全的异常/中断有两个独立的向量表。

  3、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来改变,这个功能对下列情况有用:

  1、重定位向量表到SRAM来实现动态改变异常处理函数入口点

  2、重定位向量表到SRAM来实现更快的向量读取(如果flash存储器很慢)

  3、重定位向量表到ROM不同位置(或者Flash),不同的程序运行阶段可以有不同的异常处理程序

  不同的Cortex-M处理器之间的NVIC编程模型也有额外的不同。差异点总结在表 5中:

  Cortex-M

  大部分情况下,对NVIC的中断控制特性的操作都是通过CMSIS-CORE提供的APIs处理的,他们在微控制器厂商提供的设备驱动程序库里。对Cortex-M3/M4/M7/M23/M33处理器,即使中断被使能了,它的优先级也可以被改变。ARMv6-M处理器不支持动态优先等级调整,当你需要改变中断优先等级是,需要暂时的关掉这个中断。

  三、操作系统支持特性

  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)以避免内存非法访问。这可以增强系统的鲁棒性。

  四、TrustZone安全扩展

  近几年来, 物联网(IoT)成为了嵌入式系统开发者们的热门话题。IoT系统产品变得更加复杂,上市时间的压力也与日俱增。嵌入式系统产品需要更好的方案来保证系统的安全,但是同时又要方便软件开发者开发。传统的方案是通过把软件分成特权和非特权两部分解决的,特权级软件利用MPU防止非特权的应用访问包含安全敏感信息在内的的关键的系统资源。这种方案对一些IoT系统非常适合,但是在一些情况下,只有两层划分是不够的。特别是那些包含很多复杂特权级别的软件组件的系统,特权级的代码的一个缺陷就可以导致黑客彻底的控制这个系统

  ARMv8-M架构包含了一个叫做TrustZone的安全扩展,TrustZone导入了安全和非安全状态的正交划分。

  普通应用是非安全态

  软件组件和安全相关的资源(例如,安全存储,加密加速器,正随机数发生器(TRNG))处在安全状态。

  Cortex-M

  非安全状态的软件只能访问非安全状态的存储空间和外围设备,安全软件可以访问两种状态下的所有资源。

  用这种方案,软件开发者可以用以往的方式开发非安全环境下的应用程序。同时,他们可以借助芯片厂商提供的安全通讯软件库执行安全物联网连接。并且即使运行在非安全环境的特权级的程序有漏洞,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”,

  五、错误处理

  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还有几个可配置的错误异常:

  1、Memmanage(内存管理错误)

  2、总线错误(总线返回错误的响应)

  3、用法错误(未定义指令或者其他的非法操作)

  4、SecureFault(只用ARMv8-M Mainline产品支持,处理TrustZone安全扩展中的安全非法操作)

  这些异常的优先级可以编程改变,可以单独的打开和关掉。如果需要,它们也可以利用FAULTMASK寄存器把它们的优先级提高到和HardFault相同的级别。ARMv7-M 和 ARMv8-M Mainline产品还有几个错误状态寄存器可以提供关于触发错误异常事件的线索和错误地址的寄存器,用来确定触发这个错误异常的访问地址,使调试更加容易。

  ARMv7-M 和 ARMv8-M Mainline产品子规范中额外的错误处理程序提供了灵活的错误处理能力,错误状态寄存器让错误事件的定位和调试更加容易。很多商业开发套件中的调试器已经内嵌了使用错误状态寄存器来诊断错误事件的功能。此外,错误处理程序可以在运行时做一些修复工作。

  Cortex-M

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分