(编者按:本文最初发表于2015年2月的RTC Magazine,现按照最新产品信息进行了更新)
Cortex-M 处理器家族是一系列具有扩展性,兼容性,节能和易于使用的处理器,旨在帮助开发人员满足未来智能互联嵌入式应用的需要。2010年推出的 Cortex-M4是建立在Cortex-M3的基础上并加入了一系列专门为数字信号处理定制的指令集扩展,并搭配可选的性能可达1.25 DMIPS/ MHz的单精度浮点单元。自推出以来,有10家以上的半导体厂商推出了基于Cortex-M4的通用MCU产品,以及非常广泛的基于Cortex-M4的sensor hub产品。
在过去的几年里,对支持互联的嵌入式系统的功能特性和处理能力的需求变得更加苛刻。即使是最简单的系统,也预期支持多种连接方式,图形用户界面,人机界面,语音识别或其他自然的交互方式。处理器需要变得更加强大,并能提供更多的本地处理能力。在汽车行业和工业自动化中应用的微控制器需要支持更高的处理能力和CPU性能提升,对计算精度和短时间内处理大量数据的要求在迅速提高。这些未来系统的要求包括:以较低的成本提供更多的功能,增加连接性,更好的代码重复利用,以及提高能效。正是着眼于这样的未来需求,ARM和合作伙伴一起设计了当前Cortex-M家族中性能最强的ARM Cortex-M7处理器,
近观Cortex-M7
Cortex-M7能够应对最严格的应用环境,并克服了以前基于Cortex-M处理器的解决方案所面临的问题,性能达到了上一代Cortex-M4的两倍,大约为5 CoreMark/ MHz。Cortex-M7是专为各种嵌入式应用,包括微控制器,汽车控制器,工业控制系统和无线通信控制器(例如无线网络)设计的。对于那些熟悉Cortex-M系列CPU的嵌入式应用开发者来说,Cortex-M7基于Cortex-M架构,从架构上兼容从Cortex-M0以来的所有产品(图1)。
图1
ARM Cortex-M7处理器特性
Cortex-M7包含六阶段的超标量流水线,并和紧耦合内存、高速缓存和大内存支持选项集成在一起以提供整数、浮点和DSP处理能力并保证确定性的行为。Cortex-M7先进的流水线能提供相对于Cortex-M4更高的性能,允许在每个时钟周期执行两条指令。
Cortex-M7 开发的一大重点是相对于之前的Cortex-M系列处理器提高IPC(instructions-per-clock)效率。Cortex -M7是Cortex-M 家族中第一个提高最高64KB指令和数据缓存选项的处理器,高速缓存能提供对更大的存储器系统的有效操作(外存通常比处理器慢很多)。此外还添加了紧耦合内存接口,集成ECC支持。对内存的快速访问使得高速中断处理和实时应用处理成为可能。这样的集成使得工程师们可以在内部缓存中执行大部分代码,以减少对外部存储器读写访问,从而降低功耗。
Cortex-M7 也提供了对每个内部缓存单元增加ECC支持的选项,以提高系统的可靠性。对于给定解决方案,如果某个内存位置的单个比特值被破坏,该数据可被校正和恢复。除了ECC,存储器系统也可以通过可选的存储器保护单元(MPU)设定8或16个区域为受保护区域以增强系统可靠性。
为了支持提高了的CPU处理能力,内存系统也从32位AXI总线改进为64位AXI总线,64位AXI比32位AXI提供了更大的带宽,并支持多个outstanding transfer以最大化系统性能。为了易于集成在先前的Cortex-M设计中使用的传统外围设备,还有一个可选的低延迟AHB外设总线接口。为了允许灵活的中断管理和低中断延迟,集成嵌套矢量中断控制器(NVIC)用1到240个中断,以及3至8位可编程优先级寄存器实现与处理器的紧密集成。此外,还有ETM支持,专为CoreSight(ARM支持全系统调试和跟踪的架构)设计。
Cortex-M7包含的双精度支持可选项,进一步扩大了Cortex-M家族的浮点能力。如果FPU存在时,还支持整数和浮点指令的并发。鉴于存在大量基于Cortex-M7的MCU应用,它还具有完全的强大的调试功能,以及可选的全指令和数据跟踪支持。对已经使用了Cortex-M4处理器的设备,在应用对性能的要求提高时,前述特性使得Cortex-M7成为一种极具吸引力的解决方案。
迁移设计到Cortex-M7
鉴于大多数嵌入式工程师和开发人员都熟悉Cortex-M4,让我们来看看Cortex-M7带来的一些软件开发的优点。从开发者的角度来看,在Cortex-M7支持所有的Cortex-M4处理器指令,并使用相同的中断模型来处理异常。在大多数情况下,针对Cortex-M4处理器编写的程序代码应该可以在Cortex-M7处理器上没有任何问题地运行。但是,在有些情况下可能需要做一些改动,软件开发人员必须了解这些改动以减少把应用程序从Cortex-M4迁移到Cortex-M7所需的时间。
为了获得Cortex-M7处理器的最佳性能,一些C编译器和运行时库已经进行了优化和更新(图2)。此外,由于相当多的Cortex-M7相对于Cortex-M4在调试系统上的变化,软件开发者必须更新他们的工具链,以在基于Cortex-M7的微控制器产品上调试应用程序。在某些情况下,调试适配器上的固件可能还需要更新。因此,强烈建议更新到最新的开发工具链。
图 2
相对于Cortex-M4的2倍性能改进
通常情况下,把软件从Cortex-M4迁移到Cortex-M7处理器时,需要完成以下改动:
此外,所有的代码应该被重编译以允许编译器针对Cortex-M7处理器流水线更好地优化指令序列。在某些情况下,可能在运行时需要额外的缓存维护操作。例如,在处理器和外设DMA控制器共享一块带缓存的内存时,必须进行适当的缓存维护操作以保证内存一致性。
Cortex-M7处理器支持多种浮点支持选项,允许没有FPU,只包含单精度FPU或者同时包含单精度和双精度FPU。如果应用程序可以从双精度浮点单元支持中获益,该应用程序应该重新编译以利用双精度FPU。即使应用程序只使用单精度浮点运算,重新编译为Cortex-M7处理器的代码也是有益的,因为在Cortex-M7的FPU基于FPv5,而Cortex-M4处理器的FPU的是FPv4。FPv5增加了额外的浮点处理指令,有助于目标应用程序加速浮点数据处理。
程序代码更改
有许多可能需要更改程序代码的潜在领域。由于处理器具有更高的性能,一些程序代码可能需要由于执行速度变快进行适当的调节。最常见的例子是使用硬编码(hard code)的循环来实现延迟的应用程序,必须调整原本的循环次数以确保延时。
从一个微控制器设备迁移到另一个时,系统内存映射经常发生变化。另外,Cortex-M7处理器初始矢量表并不是必须从地址0x00000000开始。如果应用程序代码假设初始向量表地址为0,用户可能需要更新代码,以便能够通过读取Vector Table Offset寄存器来确定初始矢量表的位置。
由于在Cortex-M7处理器的多总线接口和更强大的写缓存,用户可能会发现有必要在程序代码中插入额外的内存barrier指令。内存barrier的使用指南请参阅“ARM application note AN321 – ARM Cortex-M Programming Guide to Memory Barrier Instructions”。在Cortex-M4处理器上,由于处理器流水线本身的特性,忽略内存barrier指令并不会造成任何问题。但在Cortex-M7处理器上,对内存barrier的需求是很严格的。
行动起来
Cortex-M7不仅继承了Cortex-M系列处理器的特性,如能源效率、高性能、易用性和更小的代码,它专门设计的灵活出色的内存和连接选项使得它特别适合于汽车、物联网和工业连接市场。在Cortex-M7处理器发布之后,基于它的MCU已经相继推出:
由于ARM Cortex-M4和Cortex-M7处理器在架构上有很多相似之处,确保了大部分应用程序代码可以直接迁移。软件开发人员可以开始动手,以确保他们的应用程序都适合于下一代智能连接嵌入式设备。迁移需要用户进行一些适应性修改。开发者可以根据 “从ARM Cortex-M4处理器到Cortex-M7处理器的应用程序迁移 - 软件开发人员指南( “Migrating Applications from an ARM Cortex-M4 Processor to a Cortex-M7 Processor - A Software Developer’s Guide”)”白皮书进一步了解迁移过程的细节。该白皮书可以在ARM Connected Community中找到,并提供了深入的技术讨论。