微控制器将何去何从?

editor的头像
editor 发布于:周二, 10/18/2016 - 17:34 ,关键词:

嵌入式领域的发展日新月异。你也许还没有注意到,但是如果你停下来想一想微控制器系统十年前的样子并与当今的微控制器系统比较一下,你会发现PCB设计、元件封装、集成度、时钟速度和内存大小已经经历了好几代的变化。在这方面最热门的话题之一是仍在使用8位微控制器的用户何时才能摆脱传统架构并转向使用现32位处理器架构,如基于ARM Cor tex-M的微控制器系列。在过去几年里,嵌入式开发者向32位微控制器的迁移一直呈现强劲势头。本文将讨论加速这种迁移的一些因素。

切换的原因? 在本文的第一部分,我们将总结为什么嵌入式开发者应该考虑向32位微控制器迁移。

采取这一行动的最强有力的理由是市场和消费者对嵌入式产品复杂性的需求大大增加。随着嵌入式产品彼此互联越来越多、功能越来越丰富,目前的8位和16位微控制器已经无法满足处理要求。即使8位或16位微控制器能够满足当前的项目需求,它也存在限制未来产品升级和代码重复使用的严重风险。

第二个常见原因是嵌入式开发者开始认识到迁移到32位微控制器带来的好处。且不说32位微控制器能提供超过10倍的性能,单说这种迁移本身就能够带来更低的能耗、更小的程序代码、更快的软件开发时间以及更好的软件重用性。这些优势将在本文后面详述。

另一个原因是 基于ARM的器件的选择余地、性能范围和可用性。如今,越来越多的微控制器供应商提供基于ARM的微控制器。这些产品能提供选择范围更广的外设、性能、内存大小、封装、成本等等。另外,基于ARM
Cortex-M的处理器还具有专门针对微控制器应用的一些特性。这些特性使ARM微控制器具有日益广泛的应用范围。与此同时,基于ARM的微控制器的价格在过去5年里已大幅降低,并且面向开发者的低成本甚至免费开发工具也越来越多。

与其它架构相比,选择基于A R M的微控制器也是更好的投资。现今,针对A R M微控制器开发的软件代码可在未来多年内供为数众多的微控制器供应商重复使用。随着ARM架构的应用更加广泛,聘请具有ARM架构行业经验的软件工程师也比聘请其他架构工程师更加容易。这也使得嵌入式开发者的产品和资产能够更加面向未来。

在下一节,我们将讨论32位微控制器是如何赢得代码长度的比赛,该领域传统上可是8位微控制器的强势领域。

代码长度

指令长度

在很多人的印象中,8位微控制器采用8位指令,而32位微控制器采用32位指令。

事实上,8位微控制器的许多指令是16位、24位或者8位以上的其它指令长度,例如,PIC18的指令是16位。即使是古老的8051 架构,有些指令长度是1字节,也有很多多其它指令是2或3字节。16位架构同样如此,例如,MSP430的某些指令是6字节(MSP430X指令甚至是8字节)。


图 1:不同处理器中单条指令长度

ARM Cortex-M3和 Cortex-M0处理器基于能提供卓越代码密度的 T humb®-2技术。采用T humb-2技术的处理器可以支持同时包含16位和32位指令的Thumb指令集,32位指令功能是16位版本的超集。在大多数情况下,C编译器使用16位版本指令,除非操作只能使用32位版本才能执行。

在Cortex-M处理器的编译程序中,32位指令的数量仅占整个指令数量的一小部分。例如,在专为Cortex-M3编译的Dhrystone程序映像中,32位指令的数量仅占指令总数的15.8%(平均指令长度为18.53位)。而对C or tex-M0来说,32位指令数量所占的比例更低,仅为5.4%(平均指令长度为16.9位)。

指令集效率

ARM Cortex-M微控制器使用的Thumb指令集的效率很高。例如,ARM 微控制器的多加载指令、多存储指令、堆栈推入和堆栈弹出指令允许由单条指令实现多个数据传输。

强大的内存寻址模式还简化了A R M微控制器的内存访问序列。例如,通过寄存器偏移、立即偏移、P C相关或堆栈指针相关(对本地变量有用)的寻址模式等单一指令都可以访问内存。同时,还具有内存指针自动调整等附加功能。

所有基于A R M的处理器在处理8位和16位数据方面是非常高效的。对于8位、16位和32位数据处理,无论是有符号还是无符号,都有紧凑型内存访问指令可以使用。另外还有一些指令专门用于数据类型转换。总的来说,使用 ARM 处理器处理8位和16位的数据与处理32位数据一样简单和高效。

基于ARM Cortex-M的微控制器可提供强大的条件执行功能。针对有符号和无符号数据类型的分支条件进行综合选择,这是现在所有ARM微控制器共有的功能,此外,基于ARM Cortex-M3的微控制器还提供有条件执行、以及比较和分支复合指令。

Cortex-M0和Cortex-M3都支持32位的单周期乘法操作。此外,基于 Cortex-M3的微控制器还支持有符号和无符号的整数除法,饱和运算、32位和64位累积乘法 (MAC) 操作以及多种位字段操作指令。

8位应用程序的神话

许多嵌入式开发人员错误地认为其应用程序仅执行8位的数据处理,因此没必要迁移到32位处理器。但是如果深入了解一下C编译器手册,就会知道丑整数(humble integer,即因子为2/3/5的整数)在 8 位微控制器上其实是16位数据 - 每次执行一个整数操作,或者访问需要整数操作的C库函数,处理的都是16位数据。8位处理器内核必须使用一系列指令和更多时钟周期来处理这些数据。

同样的情况也适用于指针。在大多数的8位或16位微控制器中,地址指针至少需要16位。如果在8051中使用通用内存指针,由于需要额外的信息以表明所指的是哪块内存,或使用存存储体切换或类似技术来克服64K字节内存障碍,指针的使用将增加。

因此,在8位系统中内存指针的处理效率是非常低的。由于在寄存器库中的每个整数变量占用多个寄存器,因此,在8位微控制器中进行整数运算也会导致更多的内存访问,更多的内存读/写指令,以及更多的堆栈操作指令。所有这些问题都大大增加了8位微控制器的程序代码长度。

那么,让我们看看在特定基准实例的比较结果?例如,针对多种进行长度优化的架构编译的Dhrystone程序会产生以下结果:

大多数嵌入式应用程序迁移到基于ARM Cortex-M的微控制器后,由于使用较少的代码而受益,因为这意味着对微控制器内存要求降低,可以使用更便宜的微控制器。代码尺寸减小的原因是指令集效率更高、指令规模更小、以及大多数嵌入式应用程序需要处理16位或更大的数据。

ARM微控制器的代码尺寸较小的优势能够影响微控制器的性能、功耗和成本。在下一节中,我们将从这些方面对基于ARM Cortex-M的微控制器和8 位微控制器进行比较。

性能和能耗

许多嵌入式开发人员从8位和16位微控制器切换到32位微控制器的一个重要原因是其嵌入式产品对性能有更高的需求。切换到ARM微控制器还可降低功耗并且延长嵌入式产品的电池寿命,尽管这些益处通常不易觉察和理解。

性能

比较微控制器性能的一种常见方法是使用Dhrystone基准。它免费、易用且小巧,在微控制器中只占很小的内存(尽管它不是一个“最理想的”基准套件)。原始的8051的性能仅为0.0094DMIPS/M H z。新型8 015s的性能略有提高,例如,Maxim 80C310设备为0.027 D MI P S,最快的8015微控制器宣称拥有0.1 DMIPS/MHz的Dhrystone性能。这仍然大大低于基于ARM Cortex-M微控制器的性能,如Cortex-M3处理器的最高性能是1.25 DMIPS/MH z,C o r tex-M0处理器的最高性能达到0.9DMIPS/MHz。

其它8位和16位架构又如何呢?P I C18的性能为0.02 D M I P S/MHz(内部时钟),比某些8051s的性能还要低,并且Microchip的16位产品性能还不及ARM Cortex-M3微控制器的一半。

图 2:基于Dhrystone 的基本性能比较

8位和16位微控制器的局限

总的来说,8位微控制器在处理16位和32位数据时效率很低。如前文所述,这程涉及到C代码和库函数中的整数及指针的处理。每次在处理整数变量和指针时,都需要一系列的指令,这会导致更低的性能和更长的代码。

造成许多8位和16位微控制器效率低下的另一个原因是指令集和编程模型的局限。例如,8051 严重依赖于累加器 (ACC) 和数据指针 (DPTR) 进行数据传输和处理。结果,将数据移入和移出 ACC 和 DPTR都需要指令,这对代码长度和执行周期来说是个很大的开销。

内存接口本身也制约8位和16位处理器的性能。例如,许多8051 指令是多字节的。由于程序内存接口是8位,所以需要进行多次读取访问,因此,即使指令操作非常简单,获取指令也需要多个时钟周期。

如果需要访问超过64K字节的内存,8位和16位微控制器的性能会进一步降低。这些架构是为处理16位地址而设计的(这些架构使用16位程序计数器和16位数据指针,且指令集的设计只考虑了支持64K字节地址范围)。如果需要超过64K字节的内存,就需要额外的硬件和指令开销来产生额外的地址位。对于需要访问大于64K字节内存的标准8051来说,将把内存分成若干段并且所有段转换代码都要通过#0库来执行。这就增加了代码长
度和时钟周期开销,降低了内存使用效率。某些16位微控制器通过使用更大的程序计数器和内存分割来避免这个缺陷,但是大的地址值仍需要额外处理,还是难免降低性能并增加了程序代码。

低功耗

功耗怎么样呢?关于向ARM架构迁移的最常见问题是它是否会增加能耗。如果您研究一下基于ARM微控制器的最新产品,这个问题就会很清楚了,ARM Cortex-M微控制器的能耗实际上低于许多16位和8位微控制器。

ARM处理器本来就是为低功耗设计的,它采用了多项低功耗技术。例如,Cor tex-M0和Cor tex-M3处理器在架构上支持睡眠模式和Sleep-on-exit功能(一旦中断处理完成,处理器即返回到睡眠模式)。

微控制器中的能耗

要了解Cortex-M微控制器何以降低嵌入式系统的能耗,最好是先了解一下典型微控制器产品的基本构造。在现代的微控制器中,处理器内核不是影响面积的最主要因素。

图 3:使用ARM Cortex-M处理器可以减少硅片面积

如前文所述,8位微控制器的代码密度很低,因此就需要一个更大的闪存,这样就增加了整体能耗。而A R M微控制器具有卓越的代码密度,能够利用更小闪存来降低能耗和成本。

内存访问效率

使用32位总线由于减少了内存访问所需次数,从而降低了能耗。对于在内存中拷贝同样数量的数据,8位微控制器需要4倍的内存访问次数和更多的取指。因此,即使内存大小相同,8位微控制器也要消耗更多功率才能达到相同结果。

Cortex-M微控制器的取指效率要比8位和16位微控制器高很多,因为每次取指是32位,所以每个周期可取得多达2个16位的Thumb指令,同时为数据访问提供更多总线带宽。对于同样长度的指令序列,8位微控制器需要4倍的内存访问次数,而16位微控制器需要2倍的取指次数。因此,8位和16位微控制器比ARM微控制器要消耗更多的能量。

通过降低操作频率来降低能耗

32位高性能微控制器可以通过在更低的时钟频率上运行应用程序来降低能耗。例如,原来在8051上以30MHz运行的应用程序,可以在ARM Cortex-M3微控制器上仅以3MHz的时钟频率运行并且达到同样的性能水平。

通过缩短活跃周期来降低能耗

另外,通过ARM微控制器的休眠模式,可以在某个处理任务完成后进一步降低能耗。与8位或16位微控制器相比,Cortex-M微控制器具有更高的性能,可以在完成任务后更快地进入睡眠模式,从而缩短微控制器处于活跃状态的时间。

图 4:Cortex微控制器可以通过减少处于活跃状态的时间来降低系统能耗

低功耗的总体优势

与8位和16位微控制器相比,ARM Cortex-M微控制器可提供最佳的能效和更高的性能。ARM处理器为实现高能效而设计,应用程序可以充分利用这个优势通过多种方式来降低能耗。

软件开发

任何微控制器,如果没有相应的应用程序支持,只不过就是一个硬件而已。一些嵌入式软件开发人员可能认为ARM处理器的软件开发比较困难。事实上,为ARM Cor tex-M微控制器开发软件要比开发8位微控制器产品简单得多。Cortex-M的处理器不仅可以采用100%的C语言编程,而且具有多种增强调试功能,方便定位软件中的问题。此外,互联网上还有很多实例和教程,其包括许多基于ARM的微控制器供应商网站以及包括在微控制器开发工具包之内的资源。

从8位或16位微控制器向ARM移植软件

与简单的8位微控制器相比,ARM Cortex-M微控制器在外设里通常有更多的寄存器。ARM微控制器的外设通常功能更多,因此可利用的编程寄存器也更多。但是别担心,ARM微控制器供应商会提供设备驱动程序库,只需调用少数几个函数就可以配置外设。

与大多数8位或16位架构相比,ARM微控制器的编程更加灵活。例如,没有硬件堆栈限制,函数可递归调用(局部变量存储在堆栈而不是静态存储器中),也不用担心特殊寄存器在中断处理程序中的保存问题,它在中断入口由处理器进行处理。例如,对MSP430来说,您可能会在乘法处理过程中禁用中断,而对于PIC,您可能会在中断处理程序中保存表指针和乘法寄存器。

有个小知识非常实用:对于一个架构来说,正确使用数据类型非常重要,因为它能使代码长度和性能产生很大差别 -ARM的微控制器和8位/16位微控制器的某些数据类型大小是不一样的。

如果应用程序依赖于数据类型的大小,例如,预计某个整数要在16位边界溢出,那么,该代码就需要修改,便于在ARM微控制器上运行。

数据大小差异的另一个影响是数组的大小。例如,8位微控制器应用程序对ROM中的整型数组可定义为:const int mydata = { 1234, 5678, …};

对于ARM微控制器,为避免不必要地增大,其定义应该改为:const short int mydata = { 1234, 5678, …};

浮点指令的差异也可导致计算结果略有不同。由于8位和16位微控制器性能的局限性,双精度 数据,其实是作为单精度数据(32位)来处理。在ARM微控制器中,双精度数据类型是64位,因此32位浮点(单精度)应使用浮点数据类型而不是双精度数据类型。这种差异也会影响数学函数。例如,下面取自Whetstone的代码在ARM微控制器中将产生双精度数学函数:

X=T*atan(T2*sin(X)*cos(X)/(cos(X+Y)+cos(X-Y)-1.0));

若仅是单精度,程序代码应变为

X=T*atanf(T2*sinf(X)*cosf(X)/(cosf(X+Y)+cosf(X-Y)-1.0F));

调试

对于一些用户来说,选择微控制器的关键要求之一是调试支持。ARM Cortex-M微控制器支持全面调试功能,包括硬件断点、观察点、寄存器访问和运行时内存访问。调试可采用JTAG或串行线协议(两根信号线),搭配标准的Cor tex调试连接器 ,方便将目标板连接到调试主机。

图 5:Cortex-M微控制器的调试功能

Cortex-M3用户还可以通过跟踪支持实现额外的调试功能。Cortex-M3支持选择性数据跟踪、事件跟踪、异常跟踪和文本输出(仪器跟踪)。跟踪数据可以由串行线输出的单引脚接口进行收集,与调试主机连接共享JTAG/串行线连接器。这样,与程序执行相关的有用信息可通过低成本调试硬件所捕获,无需额外的跟踪硬件。

图 6:跟踪功能可提高代码的可视性

许多基于Cortex-M3的微控制器还支持嵌入式跟踪宏单元(ETM) ,它支持完整的指令跟踪。此功能可以对应用程序代码的执行情况进行详细分析。由于Cortex-M0和Cortex-M3存在相似性,可以通过指令跟踪在Cortex-M3上开发和调试应用程序,然后进行少量的代码修改即可将应用程序移植到Cortex-M0上。

选择

使用ARM微控制器的一个最重要优势是选择范围大。基于Cortex-M的微控制器的供应厂商越来越多,外围设备、接口、内存大小、封装和主频范围也多种多样。市场上既有免费和低成本的开发工具,也有具有许多高级功能的专业开发工具。支持ARM 的嵌入式操作系统、编解码器和中间件供应商也日益增多。

软件可移植性

ARM Cortex-M微控制器还提供了高度的软件可移植性。虽然微控制器供应商为数众多,各自都有自己的设备驱动程序库,C编译器供应商也有若干,但是嵌入式软件开发者通过C o r tex微控制器软件接口标准 (CMSIS),可以轻松实现软件移植。

CMSIS已经被包含在许多微控制器供应商提供的设备驱动程序库中。它给内核函数和内核寄存器提供软件接口,并提供标准化的系统异常处理程序名称。基于CMSIS开发的软件可以在不同的Cortex-M微控制器之间轻松地移植,并且使得嵌入式操作系统或中间件可以同时支持多家微控制器供应商和多种编译器套件。CM S I S通过提供更好的软件可重用性来保护软件开发上的投资。

图 7:32 位微控制器的价格已大幅下降

迁移成本

随着近年来制造工艺的不断进步,ARM Cortex微控制器的成本也不断降低,已经与8位和16位微控制器处于同等水平。另一方面,用户对性能优越、功能丰富的微控制器的需求不断增加,大大提高了产量并降低了单位成本。

许多针对ARM Cortex-M微控制器的低成本开发套件和免费开发程序包也不断推出,同时,由于C or tex-M微控制器性能优越且易于使用,有利于减少产品开发时间,从而降低产品的整体开发成本。

结论

从8位微控制器向ARM Cortex-M微控制器迁移可以得到更好的性能,降低复杂软件的开发成本,还能够降低能耗和代码尺寸。迁移到16位架构或其它32位架构则不会获得同样级别的好处。从8位迁移到16位架构只能解决8位微控制器中出现的部分限制。16位架构在处理大型内存(>64K字节)时具有与8位架构相同的效率低下的问题,并且通常基于私有架构,限制了设备选择性和软件可移植性。其它32位微控制器架构在中断特性、能效、系统特性和软件支持等方面也相对落后。一般情况下,迁移到 ARM才能实现最大效益,包括降低成本和适应
未来发展。

无论您的应用程序有何要求,您都可以轻松找到一个适合的ARM Cortex-M微控制器产品。即便日后您需要增强产品以实现更多功能和更高性能或更低能耗,ARM Cortex-M处理器的架构兼容优势还可以让您在不同的A R M微控制器产品之间轻松转换。

图 8:Cortex-M微控制器的优势涵盖深嵌入式系统的各方面要求

展望未来,随着更多Cortex-M微控制器产品的推出,越来越多的嵌入式项目将迁移到ARM。从长远来看,不难发现,ARM Cortex-M成为微控制器的标准架构已是不争的事实。

(本文作者为 Joseph Yiu。Joseph Yiu是ARM公司的处理器设计工程师,负责基于ARM的SoC项目以及包括AMBA开发工具包、PrimeCells、CoreSight在内的IP模块设计。他一直致力于各种Cortex-M处理器开发。)

围观 296