ARM

TrustZone是ARM对ARM6的扩展,其实只是增加了一条指令,一个配置状态位,以及一个新的有别于核心态和用户态的安全态。ARM并没有把TrustZone设计成能够解决所有的安全问题,它的目标是希望TrustZone能把一些安全性要求高的代码放在安全区域里执行,这也就是TrustZone名字的由来。

ARM把TrustZone固化在硬件里的道理是,系统的安全性不能全靠软件来保证,而且改写现有的不安全的软件,使之更安全也不大可行。较为可行的方案就是引入一块安全的硬件逻辑,并且只让一小块软>件控制此安全逻辑。这样既保护了既有投资,也把系统的安全风险降到最小。

因为操作系统和普通应用都可以运行在安全态,所以安全态不同于传统的运行态环状的特权划分,因此ARM把安全态描述成一个平行区域,称之为安全区,又称为安全监控模式。

核心态程序要进入到安全区运行,必须执行安全监控中断( secure monitor interrupt, SMI)指令,而应用程序则必须通过API 函数来调用SMI 指令,此时,操作系统要负责检查应用程序是否安全,若通过检查则执行SMI指令进入到安全区。这样,整个系统的安全性就全由操作系统负责了。换句话说,TrustZone需要软件的支持,才能达到安全目标。

执行SMI 指令的具体动作是,SMI在CP15的安全状态寄存器中设置S位.。S位扩展还体现在AMBA总线上,这样外设也可以实现对TrustZone的支持。

安全监控程序(固件)是独立于操作系统的、自足的、不可重入的一小段代码。只要CP15安全状态寄存的S位处于置1状态,安全监控程序就要起作用(监测所有处理器操作)。首先监控程序要负责保存>上下文状态,即寄存器内容(一般保存到紧致内存TCM中),并且把当前处理器配置信息保存到CP15的单独一组分编(banked)寄存器中。TrustZone的开销是增加了大约350位状态信息,完成上下文切换需要200时钟周期。

由于TrustZone为安全区配备了单独的缓存、TLB和紧致内存TCM,上下文切换并不会导致这些性能构件内容的倒换,也即不会导致系统性能的降低。

ARM建议把安全监控程序及其运行时需要的内存置于一个TCM块中,以使延迟更低且更可预测。

安全扩展对于中断处理也有影响。因为中断既可以来自外设,也可来自软件,那就必须假定中断有可能造成安全漏洞,这样,在安全代码执行时,就不能简单地让任何中断切入进来。ARM建议的方案是,把中断也分为安全的和非安全的,安全代码只能被安全中断打断。当然,也可以把所有中断都提升为安全的,但那样会引入不必要的延迟。

TrustZone是体系结构的扩展,系统软件可以利用这一扩展提供安全支持,TrustZone本身并不能实现安全保障功能,但这一解决方案硬件实现不复杂,也不增加许多功耗,仍是具有很好性价比的安全嵌入式解决方案。

转自: http://blog.csdn.net/fanguannan0706/article/details/46720713

围观 2
19

针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发,针对不同种类的软件开发,有其不同的特点。今天我们来看看ARM-Linux开发和MCU开发的不同点,以及ARM-Linux的基本开发环境。

1、ARM-Linux应用开发和单片机开发的不同

这里先要做一个说明,对于ARM的应用开发主要有两种方式:一种是直接在ARM芯片上进行应用开发,不采用操作系统,也称为裸机编程,这种开发方式主要应用于一些低端的ARM芯片上,其开发过程非常类似单片机,这里不多叙述。还有一种是在ARM芯片上运行操作系统,对于硬件的操作需要编写相应的驱动程序,应用开发则是基于操作系统的,这种方式的嵌入式应用开发与单片机开发差异较大。ARM-Linux应用开发和单片机的开发主要有以下几点不同:

• 应用开发环境的硬件设备不同
单片机:开发板、仿真器(调试器)、USB线;

ARM-Linux:开发板、网线、串口线、SD卡;

对于ARM-Linux开发,通常是没有硬件的调试器的,尤其是在应用开发的过程中,很少使用硬件的调试器,程序的调试主要是通过串口进行调试的;但是需要说明的是,对于ARM芯片也是有硬件仿真器的,但通常用于裸机开发。

• 程序下载方式不同
单片机:仿真器(调试器)下载,或者是串口下载;

ARM-Linux:串口下载、tftp网络下载、或者直接读写SD、MMC卡等存储设备,实现程序下载;

这个与开发环境的硬件设备是有直接关系的,由于没有硬件仿真器,故ARM-Linux开发时通常不采用仿真器下载;这样看似不方便,其实给ARM-Linux的应用开发提供了更多的下载方式。

• 芯片的硬件资源不同
单片机:通常是一个完整的计算机系统,包含片内RAM,片内FLASH,以及UART、I2C、AD、DA等各种外设;

ARM:通常只有CPU,需要外部电路提供RAM以供ARM正常运行,外部电路提供FLASH、SD卡等存储系统映像,并通过外部电路实现各种外设功能。由于ARM芯片的处理能力很强,通过外部电路可以实现各种复杂的功能,其功能远远强于单片机。

• 固件的存储位置不同
单片机:通常具备片内flash存储器,固件程序通常存储在该区域,若固件较大则需要通过外部电路设计外部flash用于存储固件。

ARM-Linux: 由于其没有片内的flash, 并且需要运行操作系统,整个系统映像通常较大,故ARM-Linux开发的操作系统映像和应用通常存储在外部的MMC、SD卡上,或者采用SATA设备等。

• 启动方式不同
单片机:其结构简单,内部集成flash, 通常是芯片厂商在程序上电时加入固定的跳转指令,直接跳转到程序入口(通常在flash上);开发的应用程序通过编译器编译,采用专用下载工具直接下载到相应的地址空间;所以系统上电后直接运行到相应的程序入口,实现系统的启动。

ARM-Linux:由于采用ARM芯片,执行效率高,功能强大,外设相对丰富,是功能强大的计算机系统,并且需要运行操作系统,所以其启动方式和单片机有较大的差别,但是和家用计算机的启动方式基本相同。其启动一般包括BIOS,bootloader,内核启动,应用启动等阶段。

(a)启动BIOS
BIOS是设备厂家(芯片或者是电路板厂家)设置的相应启动信息,在设备上电后,其将读取相应硬件设备信息,进行硬件设备的初始化工作,然后跳转到bootloader所在位置(该位置是一个固定的位置,由BIOS设置)。(根据个人理解,BIOS的启动和单片机启动类似,需要采用相应的硬件调试器进行固件的写入,存储在一定的flash 空间,设备上电启动后读取flash空间的指令,从而启动BIOS程序。)

(b)启动bootloader
该部分已经属于嵌入式Linux软件开发的部分,可以通过代码修改定制相应的bootloader程序,bootloader的下载通常是采用直接读写SD卡等方式。即编写定制相应的bootloader,编译生成bootloader映象文件后,利用工具(专用或通用)下载到SD卡的MBR区域(通常是存储区的第一个扇区)。此时需要在BIOS中设置,或者通过电路板的硬件电路设置,选择bootloader的加载位置;若BIOS中设置从SD卡启动,则BIOS初始化结束后,将跳转到SD卡的位置去执行bootloader,从而实现bootloader的启动。

Bootloader主要作用是初始化必要的硬件设备,创建内核需要的一些信息并将这些信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。

(c)启动内核
bootloader启动完成初始化等相关工作之后,将调用内核启动程序。这就进入了实际的操作系统相关内容的启动了,包括相应的硬件配置,任务管理,资源管理等内核程序的启动。

(d)启动应用
在操作系统内核启动之后,就可以开始启动需要的应用,去完成真正的业务操作了。

2、ARM-Linux 基本开发环境

前面介绍了ARM-Linux应用开发和单片机开发的不同之处,相信你已经对ARM-Linux应用开发有了一个基本的认识了,下面将介绍一下ARM-Linux的基本开发环境。其主要包括硬件环境和软件环境两个部分,这里以iMX53和Ubuntu为例进行说明。

• 硬件环境

开发板:ARM运行的硬件环境,或者是相应项目的ARM电路板。

计算机:作为开发主机使用,安装Linux(如Ubuntu)),或者采用虚拟机安装Ubuntu。

串口线:用于开发过程中采用终端进行串口调试或下载程序。

网线:用于连接arm-board和开发主机,实现tftp下载内核(程序等),通过网络nfs运行程序等。

SD卡(及读卡器)或者其他存储设备:用于存储bootloader、内核映像等,以及最终的软件系统的存储;开发过程中,通常用于保存bootloader,引导系统启动。

• 软件环境

Ubuntu: 作为操作系统,是整个软件开发环境的载体,相应的开发工具都布置在此系统中。

LTIB: 这是freescale的提供的一个编译工具链,能够很方便的将源代码文件编译为适合的程序代码,并对程序进行调试;用户也可以通过下载源码构建自己的编译工具链。

tftp: 用于从开发主机Ubuntu上向arm-board 下载内核文件、应用文件等。

nfs网络文件系统:用于在开发主机上建立网络nfs文件根系统,arm-board通过nfs网络文件系统读取开发主机上的虚拟根文件系统,完成系统的启动;方便系统的开发与调试。

minicom:串口调试工具,用于在开发主机上与arm-board通信,实现对arm-board上应用程序的操作与调试。

Eclipse:集成开发环境,主要方便代码的编辑、编译等,也可采用DS5,RealView等;或者采用gedit进行编辑,通过LTIB进行编译和管理。

转自: 嵌入式资讯精选

围观 9
303

1.引言

通常微波所指的是分米波、厘米波和毫米波。关于其频率范围,一种说法是:

300MHz ~ 300GHz(1MHz =106Hz,1GHz =109 )相应的自由空间中的波长约为1m~1mm.

微波技术的兴起和蓬勃发展,使得国内大多数高校都开设微波技术课程。但还存在以下问题:测量时,由手工逐点移动探头并记录各点读数,然后手工计算实验结果并绘图。测量项目单一、精度低、测量周期长,操作也较为繁琐。本文主要研究一种实用的基于Labview的速调管微波频率自动测量系统。

2.系统整体结构

系统的整体结构如图2-1所示。由下位机跟上位机构成。微处理器通过驱动电路来控制步进电机,带动谐振式频率计的套筒转动,处理器采样检波电流,传送到上位机LabVIEW界面显示,并利用PC机强大的数据处理功能,分析出电流最小值,计算出所测频率。

基于ARM的微波频率自动测量系统设计

3.系统硬件设计

3.1 微处理器系统电路的设计

本系统选用的微处理器是S3C44B0.2.5VARM7TDMI内核,3.0~3.6V的I/O操作电压范围。可通过PLL锁相环倍频高至66MHz;71个通用I/O口;内嵌有8通道10位ADC,本系统选取了通道1作为晶体检波器电流输入通道。

3.2 复位电路

系统没有采用RC电路作为复位电路,而使用了电压监控芯片SP708SE,提高了系统的可靠性。复位电路的RST 端连接到S3C44B0的复位引脚nRESET,因为S3C44B0的复位信号是低电平有效,所以当系统掉电或复位按键SW_RST被按下时,电源监控芯片RST 引脚立即输出复位信号,使S3C44B0芯片复位。

基于ARM的微波频率自动测量系统设计

3.3 谐振式频率计自动测量电路的设计

3.3.1 定标法测频率原理

为了实现频率的自动化测量,本系统采用步进电机带动频率计的转动,当腔体转到了谐振位置时候,到达检波器的微波功率明显下降,检波电流出现明显的下降,而这个位置对应的频率就是所测频率。步进电机带动下的是非只读式频率计,所以先要用定标的方法,拟合出频率与刻度的对应关系式。定标法:同时配合两种频率计,一种是只读式的,可直接读出频率;另一种是非只读式的,只有刻度,不能直接读出频率。首先手动转动非只读式频率计到一个谐振的位置,记录这时的刻度,然后再转动只读式频率计,到另外一个谐振位置,记录对应的频率。重复这种操作,测出尽量多的频率和刻度对应点,根据测得数据再用最小二乘法拟合出两者的对应关系式。最后改换用步进电机带动非只读式频率计转动,当转动到检波电流出现明显的“吸收谷”时,读得这时的刻度,根据拟合出来的刻度与频率关系式,就可得所测频率。

3.3.2 步进电机及自动控制电路

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可通过控制脉冲频率来控制电机转动的速度,达到调速的目的。

本系统采用二相步进电机,具有如下一些特点:只需将电机与驱动器接线的A+和A-(或者B+和B-)对调即可实现电机的转动方向;步进角为1.8°的两相四线混合式步进电机,并把细分驱动器的细分数设置为8,电机的运转分辨率为每个脉冲0.225°。为了有效驱动电机,本文采用了基于TA8435H芯片的驱动电路。实际应用电路如下图3-2所示,芯片的输入信号有使能控制、正反转控制和时钟输入。

通过光耦器件TLP521可将驱动芯片跟输入级进行电隔离,起到逻辑电平隔离和保护作用。

M1,M2分别接高电平,所以为1/8细分方式。

由于REF IN引脚接高电平,因此VNF为0.8V.

输出级斩波电流为VNF/RNF=0.8/0.8=1A,因此R212、R213要选用功率大一些的电阻。选用不同的二相步进电机时,应根据其电流大小选择合适的R212和R213.R21和C5组成复位电路,D1~D4快恢复二极管可用来泄放绕组电流。

基于ARM的微波频率自动测量系统设计

电路中用到微处理器S3C44B0引脚PC0,PC1,PC2给驱动电路分别输出使能,正反转,时钟信号,通过控制输出脉冲的间隔可以控制电机转动的速率,而输出脉冲个数可控制步进电机走动的步数,达到控制频率计腔体位置目的。电路输出端口A, A, B, B接二相步进电机对应输入端子。

3.3.3 检波电流I/V转换及放大电路

检波晶体的作用是将微波微弱信号转换成直流信号。故可观察检波电流是否出现“吸收波谷”来判断腔体是否到达谐振位置。本系统将检波电流经过处理之后传送到上位机的LabVIEW界面显示,观察是否到谐振位置。

基于ARM的微波频率自动测量系统设计

由于微波信号在传输过程中受到外部干扰的噪声,线路的噪声,元器件的噪声等等,因此需要滤波电路来滤除这些干扰信号。由于处理器对信号的采集速率比较低,所以本系统采用了时间常数比较大的由R418和C409构成的低通滤波器。其截止频率为f p =30Hz有利于滤除电路中的尖峰噪声。电路采用两级运放,第一级为I/V转换,第二级为电压反相放大。调节可变衰减器,电机走完全程,观察到检波电流最大值为50.9μ A,因此电路中RF4=1K,R416=1K,RF5=45K,由Vout1=-RF4*I知,经过第一级I/V转换之后最大电压为50.9mV,再经过放大,最终输出电压最大为2.291V,满足S3C44B0的A/D转换输入要求。

4.软件设计

4.1 下位机软件

系统开机复位后,进入while(1)死循环,时刻检测上位机是否发来测量频率的命令,当接受到测量频率命令后,调用测频率模块子程序。频率测量子程序中,电机走完全程需要1854步,每一步带动谐振腔走0.005mm,每一步耗时44.44ms,电机每走动一步,把100次检波电流的A/D转换数据求平均值后再通过串口发送到上位机显示。

4.2 上位机软件设计

在虚拟仪器开发平台LabVIEW中,可以利用基于VISA的仪器驱动模板中的I/O接口函数来方便快速地开发驱动程序。本系统中通过PC机和主控芯片S3C44BO的RS232串行通信实现数据采集的驱动程序正是使用这种方法。

如图3-5频率测量的labview程序图。首先用最大值与最小值函数求出采集到的电流数据的最小值,并求出其对应的索引值,即步进电机在哪一步采集到的电流值,从而把这个索引值反馈回频率数组,求出其对应的元素,则为所测频率。

基于ARM的微波频率自动测量系统设计

5.信号源输出频率测量实验结果及分析

为了在上位机的LabVIEW界面得到所测量的微波信号频率,需在界面中显示出检波电流–频率曲线,从而可明显读出检波电流的“吸收波谷点”.需通过定标法先手工测量频率–距离(当前测量点与起始点的距离,可由套筒刻度算出)的一组尽可能多的数据点,然后利用步进电机每走一步的距离,就可以把距离转化为步数,再用matlab拟合出频率–步数的关系函数。从而可知道步进电机走到哪一步对应哪一个频率。电机走完全程需要1854步,那么把步数对应的1854个频率值组成一个数组作为曲线的横坐标,并把采集到的1854个电流值作为纵坐标。

限于本信号源频率及谐振式频率计测量范围的影响,本系统只能在8.48GHz和9.9GHz范围内测量。因此从套筒的起始位置9.9mm(对应于频率8 . 4 8 G H z ),截止位置0 . 6 3 m m (对应于频率9.9GHz),其全长为9.9mm-0.63mm=9.27mm.由于电机带动套筒每步的距离非常小,因此不能直接测量步进电机一步的距离,利用步进电机没有累计误差的特点,采用步进电机走动180步,测出套筒刻度前后位置差,得出步进电机带动套筒每一步移动平均距离为0.005mm.手工测出频率与刻度的42组数据点,利用MATLAB拟合出图5-1所示曲线。用MATLAB拟合出频率f 与刻度L 线性关系函数为f = ?0.1456* L + 9.9917(0.63mm ≤ L ≤ 9.9mm)。由于电机每步带动套筒移动0.005mm,起始位置在0.63mm,即步进电机走一步后,套筒的位置在0.63mm+0.005mm=0.635mm,而步进电机走完全程需要1854步,套筒的截止位置在0.63+0.005*1854=9.9mm.则刻度L 与步数n 的关系函数为L = 0.005n + 0.63(0 ≤ n ≤1854)。

可推导出频率f 与步数n的函数关系式为f = ?0.000728n + 9.9(0 ≤ n ≤1854)。把步数对应的1854个频率值组成一个数组作为曲线的横坐标,并把采集到的1854个电流值作为纵坐标,利用PC机在LabVIEW描绘的波形图如图5-2所示。

基于ARM的微波频率自动测量系统设计

再由LabVIEW自动计算检波电流最小值对应的频率值,如图5-4所示。可知这时信号源输出频率为9.337GHz.

基于ARM的微波频率自动测量系统设计

与手工测量做对比。换上可直接测出频率的谐振式频率计,测得这时的频率为9.357GHz,所以自动测量与手动测量的相对误差为:

基于ARM的微波频率自动测量系统设计

本系统设定步进电机走完全程需要82.4秒,不能设得走太快的原因是防止步进电机“丢步”(漏掉了脉冲没有运动到指定的位置)。另外太快很可能检测不到检波电流的“波谷点”.而手工测量一次信号源的输出频率,通常要两分多钟,可见本系统自动测量的实用性。

转自: news.qegoo.cn

围观 6
302

介绍了一种基于fpga的多轴控制器,控制器主要由arm7(LPC2214)和fpga(EP2C5T144C8)及其外围电路组成,用于同时控制多路电机的运动。利用Verilog HDL硬件描述语言在fpga中实现了电机控制逻辑,主要包括脉冲控制信号产生、加减速控制、编码器反馈信号的辨向和细分、绝对位移记录、限位信号保护逻辑等。论文中给出了fpga内部一些核心逻辑单元的实现,并利用QuartusⅡ、Modelsim SE软件对关键逻辑及时序进行了仿真。实际使用表明该控制器可以很好控制多轴电机的运动,并且能够实现高精度地位置控制。

随着电机广泛地应用于数字控制系统中,对电机控制的实时性和精度上的要求越来越高。如何灵活、有效地控制电机的运行成为研究的主要方向。文中采用现场可编程逻辑门阵列(Field Programmable Gate Array,fpga),通过Verilog语言编程来实现电机的控制。利用fpga设计具有硬件设计软件化、高度集成化、高工作频率等优点。fpga最大的特点就是灵活,实现你想实现的任何数字电路,可以定制各种电路,减少受制于专用芯片的束缚,真正为自己的产品量身定做。在设计的过程中可以灵活的更改设计,而且它强大的逻辑资源和寄存器资源可以让你轻松的去发挥设计理念。其并行执行,硬件实现的方式可以应对设计中大量的高速电子线路设计需求。

1 多轴控制器主要功能

多轴控制器与上位机、电机驱动器等配合使用,图1为采用多轴控制器组成的控制系统总体示意图。控制器接收上位机发送的控制指令,分析处理并产生相应的方向信号、脉冲信号给驱动器,从而达到控制电机运行的目的。为了提高系统的控制精度,将电机的编码器信号作为反馈信号输入给控制器(内部实现自动辨向及四细分)。在各轴运动过程中,专用控制器对电机运行的绝对位移进行记录,并且可以实时地将各轴的绝对位置信息上传给上位机。另外在电机运行的过程中,为了保证电机运行的安全性,控制器还采用了限位信号反馈实现全硬件保护措施。

基于ARM和FPGA的多路电机控制方案

2 多轴控制器组成

专用控制器由arm(LPC2214)、fpga(EP2C5T144C8)、驱动器接口电路、编码器接口电路、限位检测电路和电源电路等组成,如图2为一个八轴电机控制器的硬件组成图。arm通过串口实现与上位机之间的通信,解析从上位机获得的控制指令,并通过fpga产生相应输出信号给驱动器接口,驱动器接口外接驱动器。编码器信号作为位置反馈信号同编码器接口相连,形成位置环反馈。限位信号作为安全检测信号同限位检测接口相连,为整个系统添加一道安全保障。

基于ARM和FPGA的多路电机控制方案

3 fpga控制逻辑

专用控制器在完成整个控制的过程中,arm只负责指令解析、控制指令发送、实时数据上传等任务,fpga才是多轴专用控制器的核心。通过Verilog HDL语言在fpga内部实现了加减速曲线、编码器信号辩向及四细分、绝对位移记录等功能。图3为电机控制的整体输入、输出信号图,通过片选信号CS、读有效信号rd_enable、写有效图信号wr_enable进行电机通道选择。图4给出了1#通道控制的fpga内部逻辑示意图,下面将逐一对各主要模块进行详细介绍。

基于ARM和FPGA的多路电机控制方案

基于ARM和FPGA的多路电机控制方案

1)加减速曲线模块

为了更有效、更理想地控制电机的运行,在fpga内部设计了加减速曲线模块。文中采用了一种近似指数加减速曲线的方法,如图5为近似指数加速曲线,减速曲线与之对称。速度等距分布,那么在该速度级上保持的时间不一样场。为了简化,用速度级数N与一个常数C的乘积去模拟并且保持的时间用不熟来代替。因此,速度每升一级,电机都要在该速度级上走NC步(其中N为该速度级数)。

基于ARM和FPGA的多路电机控制方案

建立两个名为rom_pos、rom_div的ROM模块,如图6所示,rom_pos为脉冲个数存储器,rom_div为分频值存储器。通过相同的地址线将两个存储器连接起来,使一个地址对应一组脉冲个数和分频值。

fpga获得方向信号、脉冲(距离)信号、目标分频值之后.如果电机运行过程中不需要加减速,直接以目标分频值控制脉冲信号的发送即可。如果需要执行加减速,则fpga内部要调用加减速模块。根据地址线获取一组数据,即脉冲个数pul_cnt和分频值div_num,以div_num大小的分频值发送pul_cnt个脉冲,然后再按照下一组数据值发送脉冲,直到分频值达到目标分频值为止,减速过程与加速过程对称。当电机按照脉冲(距离)信号运行到一半行程的时候,如果分频值还未达到目标分频值,此时就要进行强制减速。

编写仿真程序,使两个存储器地址线相同,对存储器地址address做加1运算,从而可一次性读取两个存储器所对应存储单元的数据。利用Modulesim仿真工具对加减速模块进行功能仿真,仿真结果如图7所示,访问一个存储器地址就对应着一组脉冲个数和分频值的输出。

基于ARM和FPGA的多路电机控制方案

2)编码器反馈辨向及四细分

编码器反馈信号由A、B、Z三相信号组成。A、B两相信号相位相差90度,一个周期内A、B相信号会出现4种不同的组合状态,根据这一特征可以对编码器信号进行辩相和四细分处理。Z相信号为编码器零位信号,当编码器旋转一圈,Z相就会有信号输出。
在QuartusⅡ编译环境下成功编译之后,调用Modulesim仿真软件,编写仿真程序,使之产生全局时钟、复位信号、相位差为90度的A、B相信号和Z相信号。如图8所示,给出了该多轴控制器中所采用的编码器信号辩相及四细分的功能仿真图。

3)绝对位移记录

多轴专用控制器可以将电机运行的绝对位移实时地上传给上位机,这一功能的实现就有赖于fpga中的绝对位移记录部分的逻辑功能。在fpga内部设置一个绝对位移寄存器,用来对编码器反馈信号(辨向四细分之后)进行计数运算。当编码器信号的一个脉冲到来时,根据辩向后的方向信号做不同的运算处理。方向为正则绝对位移寄存器的值就进行加1运算,否则进行减1运算,从而达到对绝对位移进行记录的目的。并且arm可以随时读取该绝对位移寄存器的值,然后将其值上传给上位机,从而完成实时上传电机运行位置信息的功能。编写仿真程序对绝对位移寄存器进行功能仿真,结果如图9所示。

4 结束语

该方案成功已应用于某6轴Stewart平台运动控制中,在实现了0.1μm的运动定位精度的同时,运动机构得到了很好的保护,多次实验及实际使用中,该专用控制器运行安全可靠。

转自: 21ic.com

围观 2
183

CAN总线采用的是异步串行通信,也就是没有单独的时钟线来保证各个收发器之间时钟的一致,每个收发器是按事先设置的波特率来对总线上的电平进行分位。因此波特率设置准确对CAN总线的稳定通信来说非常重要。

CAN总线里我们可以通过对CAN 节点里的位定时寄存器的控制来实现不同波特率的通信。CAN协议里将一个位时间分为同步段、传播段、相位缓冲段1和相位缓冲段2。每个段的时间长度都可以用一个整数的基本时间单位表示,该基本时间单位由系统的时钟振荡器分频得到。

同步段位于一个位的起始位置,CAN-bus规定跳变沿为同步信号,但是发送节点发送一个位跟接收节点接收到这个位之间存在网络传播延迟,传播段则是为了补偿这段传播延迟,由于采样点位置在相位缓冲段1跟相位缓冲段2之间,通过设置相位缓冲段1和相位缓冲段2的值,可以调整采样点位置,保证每个位采样点一致。缓冲段的长度调节范围则是由同步跳转宽度(SJW)决定。

CAN总线中特殊波特率如何计算?
图 1 CAN位时间结构图

简单的了解了CAN总线位时间的分段后,我们来看看一个节点的波特率到底要如何设置。如图2是某ARM内核的CAN位时间特性寄存器 (CAN_BTR)。

CAN总线中特殊波特率如何计算?
图 2 某ARM内核位时间特性寄存器结构图

SILM(静默模式)跟LBKM(回环模式)用于调试
SJW:同步跳转宽度
TS2/TS1:位时间里两个时间段的分配
BRP:波特率分频器,该区域定义了基本时间单元的长度
例如某著名车厂CAN通信标准里规定,通信速率为125 kbps时,应该采用单次采样,采样点位置设置在70%~77%之间。其位定时参数取值可见表1与表2。

CAN总线中特殊波特率如何计算?
表 1 LS_CAN通信速率与采样点参数

CAN总线中特殊波特率如何计算?
表 2 LS_CAN可选时间份额与同步跳转带宽

采样点:采样点不能太靠前也不能太靠后,否则如果刚好处于一个位的上升沿或者下降沿区间,会造成识别错误,所以根据CIA105的规范,采样点在87.5%左右比较合适。但是一般我们可根据实际情况选取75%~85%之间

同步跳转宽度(SJW):SJW的值直接影响到重同步时相位缓冲段的可调节的范围,SJW的值可以在1~4之间选择,我们选择3、4可以使总线获得更宽的波特率容忍度

采样次数:分为单次采样跟三次采样,三次采样在设计之初虽然是为了过滤掉总线上毛刺,但是采用三次采样经常会影响SJW的跳转,所以实际应用中我们一般都会采用单次采样。

了解设置波特率的原则后,我们采用ZLG的波特率计算软件,对25kbps波特率的设置参数进行计算,计算结果如图3。

CAN总线中特殊波特率如何计算?
图 3 25kbps波特率计算参数

根据上面提到的原则,我们选取采样点为75%,SJW为4,时间份额为14的一组参数,采用ZLG的CAN卡做验证。
l自动波特率识别:采用CANScope自动侦测波特率的功能,对CAN卡的波特率进行识别,识别结果为25k

CAN总线中特殊波特率如何计算?
图 4 自动侦测波特率

l采样点测试:采用CANScope对当前波特率下CAN卡的采样点进行测试,测试结果为75%

CAN总线中特殊波特率如何计算?
图 5 采样点测试

l位宽容忍度测试:采用CANScope对当前波特率下CAN卡进行位宽容忍度测试,测试其对波特率的容忍度情况,测试结果为24kbps~26kbps,容忍度情况较好

CAN总线中特殊波特率如何计算?
图 6 位宽容忍度测试

l位时间测试:用CANScope的眼图功能对当前波特率下CAN卡进行位时间测试,位时间为40us,与25kbps波特率的位时间相符。

CAN总线中特殊波特率如何计算?
图 7 眼图测试位时间

通过对波特率计算器计算出来的波特率寄存器设置参数进行验证,发现测试结果跟我们的预期结果一致,因此在使用特殊波特率时,我们可以借助波特率计算器来快速计算出位定时寄存器的参数值。下面我们给出一些可参考的特殊波特率的参数:
CAN总线中特殊波特率如何计算?

来源: nxp社区

围观 10
232

一、存储器格式(字对齐):
Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。

存储器格式

1、大端格式:高字节在低地址,低字节在高地址;

2、小端格式:高字节在高地址,低字节在低地址;

指令长度:

Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,其中,字需要4字节对齐,半字需要2字节对齐。
注:所谓的指令长度是一条完整的指令的长度,而不是单纯的mov这3个字母长度

二、ARM体系的CPU有两种工作状态

1、ARM状态:处理器执行32位的字对齐的ARM指令;

2、Thumb状态:处理器执行16位的、半字对齐的Thumb指令;

在程序运行的过程中,可以在两种状态之间进行相应的转换。处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。

CPU上电处于ARM状态

三、ARM体系的CPU有以下7种工作模式:

1、用户模式(Usr):用于正常执行程序;

2、快速中断模式(FIQ):用于高速数据传输;

3、外部中断模式(IRQ):用于通常的中断处理;

4、管理模式(svc):操作系统使用的保护模式;

5、数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护;

6、系统模式(sys):运行具有特权的操作系统任务;

7、未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件;

CPU的模式可以简单的理解为当前CPU的工作状态,比如:当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网卡上有数据到达,产生中断信号,CPU自动切换到一般中断模式下处理网卡数据(普通应用程序没有权限直接访问硬件),处理完网卡数据,返回到用户模式下继续执行用户程序。

特权模式
除用户模式外,其它模式均为特权模式(Privileged Modes)。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。

异常模式
特权模式中除系统(system)模式之外的其他5种模式又统称为异常模式。它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。比如硬件产生中断信号进入中断异常模式,读取没有权限数据进入中止异常模式,执行未定义指令时进入未定义指令中止异常模式。其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式,正是由于有了软中断,用户程序才可以通过系统调用切换到管理模式。

(1)用户模式:
用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。

(2)系统模式:
系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

(3)一般中断模式:
一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。

(4)快速中断模式:
快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。

(5)管理模式:
管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下,当用户模式下的用户程序请求使用硬件资源时通过软件中断进入该模式。

(6)终止模式:
中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,Linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。

(7)未定义模式:
未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。

Arm的工作模式切换有两种方法:

被动切换:在arm运行的时候产生一些异常或者中断来自动进行模式切换
主动切换:通过软件改变,即软件设置寄存器来经行arm的模式切换,应为arm的工作模式都是可以通过相应寄存器的赋值来切换的。

Tips:当处理器运行在用户模式下,某些被保护的系统资源是不能被访问的。

除用户模式外,其余6种工作模式都属于特权模式;

特权模式中除了系统模式以外的其余5种模式称为异常模式;

大多数程序运行于用户模式;

进入特权模式是为了处理中断、异常、或者访问被保护的系统资源;

四、寄存器

ARM有31个通用的32位寄存器,6个程序状态寄存器,共分为7组,有些寄存器是所有工作模式共用的,还有一些寄存器专属于每一种工作模式;

R13——栈指针寄存器,用于保存堆栈指针;

R14——程序连接寄存器,当执行BL子程序调用指令时,R14中得到R15的备份,而当发生中断或异常时,R14保存R15的返回值;

R15——程序计数器;

快速中断模式有7个备份寄存器R8—R14,这使得进入快速中断模式执行很大部分程序时,甚至不需要保存任何寄存器;

其它特权模式都含有两个独立的寄存器副本R13、R14,这样可以令每个模式都拥有自己的堆栈指针和连接寄存器;

五、当前程序状态寄存器(CPSR)

CPSR中各位意义如下:

T位:1——CPU处于Thumb状态, 0——CPU处于ARM状态;

I、F(中断禁止位): 1——禁止中断, 0——中断使能;

工作模式位:可以改变这些位,进行模式切换;

六、程序状态保存寄存器(SPSR)

当切换进入某一个特权模式时,SPSR保存前一个工作模式的CPSR值,这样,当返回前一个工作模式时,可以将SPSR的值恢复到CPSR中;

七、模式切换

当异常发生,CPU进入相应的异常模式时,以下工作是由CPU自动完成的:

1、在异常模式的R14中保存前一工作模式的下一条即将执行的指令地址;

2、将CPSR的值复制到异常模式的SPSR中;

3、将CPSR的工作模式设为该异常模式对应的工作模式;

4、令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令;

从异常工作模式退回到之前的工作模式时,需要由软件来完成以下工作:

1、将异常模式的R14减去一个适当的值(4或8)后赋给PC寄存器;

2、将异常模式SPSR的值赋给CPSR;

arm v7 异常及中断处理
异常:
interrupts,
aborts,
reset

中断:由gic管理,中断号是一种标示,它独一无二的对应一个中断源,中断大部分是由peripheral触发,并经由gic统一上报,从而导致core IRQ或FIQ exception的发生,同时gic需要控制各个中断的优先级、状态、安全性。

interrupt can either be edge-triggered or level-sensitive.

Both the distributor and the CPU interfaces are disabled at reset.The GIC must be initialized after reset before it can deliver interrupts to the core.
In the distributor, software must configure the priority, target, security and enable individual interrupts. The distributor block must subsequently be enabled through its control register. For each CPU interface, software must program the priority mask and preemption settings.
Each CPU interface block itself must be enabled through its control register. This prepares the GIC to deliver interrupts to the core.
Before interrupts are expected in the core, software prepares the core to take interrupts by setting a valid interrupt vector in the vector table, and clearing interrupt masks bits in the CPSR.
The entire interrupt mechanism in the system can be disabled by disabling the distributor block. Interrupt delivery to an individual core can be disabled by disabling its CPU interface block, or by setting mask bits in CPSR of that core. Individual interrupts can also be disabled (or enabled) in the distributor.

For an interrupt to reach the core, the individual interrupt, distributor and CPU interface must all be enabled, and the CPSR interrupt mask bits cleared.

中断分为3类:
SGI: software generated interrupt(used for inter-core and num: 0 -15)
PPI: private periphral interrupt(per-core timer num: 16-31),
SPI: shared periphral interrupt(various peripherals, num: 32-1020)

interrupt state:
inactive(not asserted),
pending(source asserted, but not handled),
active,
active and pending(core is servicing and gic got a pending interrupt from the same source)

转自: IC_SOC_ARM的博客

围观 10
329

ARM最近刚刚宣布了对DesignStart项目的升级,加入了ARM Cortex-M3处理器。现在,可以通过DesignStart Eval即时、免费地获取相关IP,对基于Cortex-M0或者Cortex-M3处理器的定制化SoC进行评估、设计和原型开发。

原型设计的重要性常常被忽视,我希望通过本文以更多的细节阐述原型开发的重要性以及Cortex-M原型系统(MPS2+)如何帮助你方便地开始对你自己的设计进行评估和原型开发。
DesignStart不仅仅有处理器IP。DesignStart Eval和Designstart Pro包括处理器IP、一个参考子系统、以及免费的在线社区支持。此外,还提供来自ARM和ARM合作伙伴的专用支持、培训以及各种服务。

DesignStart Eval已经可以运行在ARM Cortex-M原型开发系统(即MPS2+)之上,帮助你更方便地迅速开始对你自己的设计进行评估和原型开发。

一旦你开始设计全新的定制化SoC,下一步就是进行原型开发。原型开发是SoC设计流程中的一个关键步骤:它不仅允许你对设计进行验证,也帮助你避免对一个有问题的设计进行流片。在进行验证的同时,你还可以在芯片出片之前就用原型进行软件开发,从而节约宝贵的时间。ARM的Cortex-M原型系统就是一个完美的解决方案。

为什么选择Cortex-M原型系统?

Cortex-M原型系统提供针对Cortex-M系列的快速FPGA原型开发,包括实例设计和软件支持。与市场上其它的开发板不同,该FGPA平台是针对Cortex-M处理器专门定制的,这意味着你可以快速开始和进行开发,从而专注于实施差异化。它支持ARM mbed OS、多个调试连接器(包括CMSIS-DAP),以及16MB零等候状态内存;这些都得到ARM的直接支持。

在MPS2+中实施的Cortex-M3 DesignStart

图:在MPS2+中实施的Cortex-M3 DesignStart

Cortex-M3 DesignStart包允许你用最喜欢的仿真器(Mentor® Questa®、Cadence® Incisive或Synopsys® VCS®)进行参考子系统设计的仿真,然后将你自己的IP加入设计,并在仿真环境下进行开发,对现有测试进行编辑。

ARM已经用DesignStart Eval包设计了一个实例FPGA实施,用于Cortex-M原型系统。你可以用这个实例将测试进一步延伸,针对这个平台对你的设计进行合成,以及在FPGA目标上重新运行各种仿真测试。

ARM Cortex-M3处理器以网表文件的形式提供,支持调试和追踪。Cortex-M3实例子系统设计尺寸非常小,在FPGA中留有充裕的空间让你用自己的IP进行扩展。板上有大量的外设,你也可以通过连接Arduino子板的转换器加入更多的外设。如果你找不到你所需的外设,你可以设计自己的板子,并使用所提供的PCB文件用于子板。请访问Cortex-M原型系统网站上的Arduino章节,获取实例文档。

简单、快速、方便使用

使用这一平台进行启动和运行非常方便!将电源和USB线连上PC,等待平台作为USB大容量存储设备顺利连接,将你的DesignStart文件拖拽上去,然后按下重置键来载入新的FPGA图像。一旦FPGA被载入,你可以将你的调试器连接到众多调试连接器之一,或者用CMSIS-DAP连接到核。这里有一个视频,提供更多如何对板子进行编程以及使用Keil MDK调试器的信息。

你也可以使用现有的Intel® Quartus® Prime项目文件来迅速添加自己的IP、对它进行合成以及创建FPGA图像,从而为你的IP开发软件或者开始为你的SoC创意开发原型。我们撰写了一个名为“Cortex-M3 DesignStart FPGA用户指南”的文档,详细描述了这一流程。该文档也是DesignStart下载包的一部分。

如何购买Cortex-M原型系统?

如果你还需要更多的理由来使用Cortex-M原型系统,那么你一定会很高兴地获悉,在未来一年,面向所有用户ARM将Cortex-M原型系统平台的价格降低了50%,现在只需495美元。考虑到FPGA相对庞大的尺寸(30万逻辑单元,300K LE)以及其他所有的功能(包括对mbed的支持),你就会同意这个价格非常低廉。你可以从www.arm.com/mps产品网页下单订购。

欲了解更多关于DesignStart的信息或者注册,请访问 http://designstart.arm.com

围观 12
567

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

William Gao, ARM 中国应用工程师与Gabriel Wang,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 微控制器处理器在单片机和深度嵌入式系统市场非常成功和受欢迎。

ARM Cortex-M 处理器家族介绍和比较

图 1: 处理器家族

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

ARM Cortex-M 处理器家族介绍和比较

表 1: 处理器特性总结

1.2 Cortex-M 处理器家族

Cortex-M处理器家族更多的集中在低性能端,但是这些处理器相比于许多微控制器使用的传统处理器性能仍然很强大。例如,Cortex-M4和Cortex-M7处理器应用在许多高性能的微控制器产品中,最大的时钟频率可以达到400Mhz。

当然,性能不是选择处理器的唯一指标。在许多应用中,低功耗和成本是关键的选择指标。因此,Cortex-M处理器家族包含各种产品来满足不同的需求:

ARM 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)

- 易用性

例如,嵌套向量中断控制器是内置的中断控制器

ARM Cortex-M 处理器家族介绍和比较

图 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处理器可以分为几个架构规范

ARM Cortex-M 处理器家族介绍和比较

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

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

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-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可选的浮点运算单元使用的。

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

图 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中:

ARM Cortex-M 处理器家族介绍和比较

表 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))处在安全状态。

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

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

ARM Cortex-M 处理器家族介绍和比较

表 8: 零等待内存系统条件下的中断延迟比较

事实上,真正的中断延迟受到内存系统等待状态的影响。例如,许多运行频率超过100Mhz的微控制器搭配的是非常慢的Flash存储器(例如30到50MHz)。虽然使用了Flash访问加速硬件来提高性能,中断延迟仍然受到Flash存储系统等待状态的影响。所以完全有可能运行在零等待内存系统Cortex-M0/M0+系统比Cortex-M3/M4/M7有更短的中断延迟。

当评估性能的时候,不要忘记把中断处理程序的执行时间考虑在内。某些8位或者16位处理器架构可能中断延迟很短,但是会花费数倍的时钟周期完成中断处理。非常短的中断响应时间和很短的中断处理时间才是实际有效的。

6 调试和跟踪特性

6.1 调试和跟踪特性简介

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

ARM Cortex-M 处理器家族介绍和比较

表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接口,或者选择新的只需要两个引脚的串行调试协议接口,串行调试接口对有限数目引脚的设备是非常适合的。

ARM Cortex-M 处理器家族介绍和比较

图 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)

ARM Cortex-M 处理器家族介绍和比较

图 11: Trace port 支持指令跟踪和其他跟踪功能必要的带宽

跟踪接口提供了在处理器运行的时候获取大量有用信息的能力。例如嵌入式跟踪单元(ETM)可以获取指令运行历史记录,数据跟踪单元(ITM)让软件产生消息(例如,通过printf)并利用Trace接口获取。另外,Cortex-M3/M4/M7/M33支持数据跟踪单元(DWT)模块。

- 可选的数据跟踪:内存地址的信息(例如,地址,数据和时间戳的组合)可以在处理器访问这个地址的时候采集

- 性能分析跟踪:CPU在不同操作任务使用的时钟周期数(例如,内存访问,休眠)

- 事件跟踪:提供服务器响应的中断/异常的运行时间和历史

ARM Cortex-M 处理器家族介绍和比较

图 12: Serial wire viewer 提供了低成本,少引脚的跟踪方案

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

ARM Cortex-M 处理器家族介绍和比较

Figure 13: Keil µVision 调试器的逻辑分析器

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

这个MTB跟踪特性也被Cortex-M23 and Cortex-M33支持。

ARM Cortex-M 处理器家族介绍和比较

图 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-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有限公司(或其子公司)在欧盟和/或其他地方注册的/或未注册的商标。保留所有权利。文中所有其他标志可能是其他所有人的商标。欲了解更多信息,请访问 www.arm.com/about/trademarks

围观 22
418

页面

订阅 RSS - ARM