浅谈处理器核心构架,嵌入应用又有啥新招
Undef模式。
图4 AArch32作业模式
模式的转换通常为自动发生,但也可在Current Program Status Register(CPSR)中写入Mode栏位,用软体控制来完整切换模式。其细节描述如下。与SVCall指令类似,SVC指令用于让软体引发SVC异常并进入SVC模式。
图4中未显示AArch32所支援的另两个模式(为节省空间),也就是Hyp模式(用于Hypervisor)与Monitor模式(用于TrustZone安全性)。相关主题较为复杂,本文不予讨论。
备份暂存器
图5显示ARMv7-M和AArch32的备份暂存器。可看出,许多暂存器为共有,因为这两种架构均是沿袭自ARMv6及先前的架构。
图5 ARMv7-M登录集
多数指令可存取十三个通用型的暂存器r0-r12。在这两种架构中,r13保留为Stack Pointer(SP),r14保留为Link Register(LR),r15则保留为Program Counter(PC)。在ARMv7-M中,这些特殊暂存器的存取仅限于某些反映这些暂存器功能的特定使用状况;在AArch32中,这些暂存器的存取则类似任何其他通用的暂存器(虽然变更Program Counter的数值可能造成非预期的副作用)。
ARMv7-M指定小部分额外特殊用途的暂存器PRIMASK、FAULTMASK、xPSR、CONTROL和BASEPRI,用于控制及设定处理器,及用于管理异常处理。
指令集
图5与图6分别是ARMv7-M与AArch32登录集,两相比较可看出AArch32也提供许多与特定作业模式关联的暂存器。这些暂存器会在进入相关的模式时与其在User模式下的暂存器交换。除了少数特殊指令,其他指令均无法存取这些暂存器,但也无法直接存取。其数值在模式变更时亦会保留,有助于处理异常。每个异常模式皆有自己的专属SP,每个异常均可在独立的堆叠上处理,因此异常处理的程式设计更为稳固且安全。取得异常时,相关模式下的LR设定为异常传回位址。
图6 AArch32登录集
每个异常模式下会出现的还有叫SPSR的额外暂存器。SPSR用于在进入例外时取得目前CPSR数值的快照,搭配LR使用下,可提供自动化的内容储存。
AArch32图中未显示Mon和Hyp模式,其各自支援备份暂存器的R13和R14,如同其他的模式。
在Cortex-A中,另有一个与ARM NEON SIMD指令集(如下所述)相关的备份暂存器,共包含三十二个128位元宽度的暂存器。每个暂存器均可定址为字组、双字组或四字组,且NEON指令集从位元组到四字组均支援向量作业。
异常模式
这两个架构的异常模式有相当大的差异,两者均支援内部与外部异常,可由系统事件或外部周边中断所执行。
ARMv7-M支援与传统微控制器极为类似的模型,所有外部中断分别透过包含处理常式位址的向量表来向量。
AArch32支援的模型则类似旧型ARM架构,当中只有八个有独立向量的异常类型。向量表包含可执行的指令,其通常为直接连往合适的异常处理常式的分支指令。仅支援两个外部中断来源:FIQ和IRQ。一般只会有一个高优先的中断连接至FIQ,其余则连接至IRQ。亦即系统必须整合软体分配器,或如同现代化系统所常见的,包含可用个别向量位址进行程式设计的Vectored Interrupt Controller(VIC)。
许多Cortex-A系统包含采用ARM之Generic Interrupt Controller(GIC)架构的标准中断控制器。GIC可作为许多实体中断和ARM核心的两个中断输入(FIQ和IRQ)之间的介面。其可处理优先顺序的决定、遮掩、个别中断启用/停用和抢夺。
指令集
ARM指令集自25年前在ARM1首次推出后已经过许多演进。Cortex-A处理器实际上支援两个指令集,每个指令集均有许多延伸。
.ARM指令集
ARM指令集以第一个ARM处理器所支援的原始指令集为基础,但已经过多次延伸。其为load-store指令集,内含独立指令群组,可用于资料处理、记忆体存取、系统控制及控制流量。现代的ARM指令集具有高效能,且范围广泛。此指令集中的所有指令均以固定长度的32位元字组编码,且字组边界必须对齐。
.Thumb指令集
Thumb指令集为ARM指令集的子集,其中每个指令均编码为16位元的半字组,其半字组边界必须对齐。Thumb指令集的原始概念是为了在编译C之类的高阶语言时,缩小最常用指令的大小,藉此改善程式码的密度。指令缩小后,由于指定的快取行内可放入更多指令,因此也有助于从指令快取内执行。
.进阶SIMD延伸集
进阶SIMD延伸集(Advanced SIMD Extensions)亦称为NEON,是大型的指令集,可利用延伸暂存器组合提供SIMD向量处理功能。
.向量浮点(VFP)
VFP指令集在与NEON相同的备份暂存器上执行,其可提供高效能的IEEE-754相容单一与双重精准浮点作业。
.Thumb-2技术
Thumb-2为延伸集的名称,在ARMv6T2(首先出现在ARM1156T2-S处理器)加入到Thumb指令集内。其为混合长度的指令集,结合Thumb的程式码密度与ARM指令集的较高效能与弹性。
假如使用者已利用Cortex-M微控制器进行开发,应该会对Thumb-2很熟悉。这些程式码在从最小(Cortex-M0和Cortex-M0+)到最大(Cortex-M7)的各种子集中仅支援Thumb-2。转移到Cortex-A处理器,能为程式码生成开启许多可能性。
一般来说,多数针对Cortex-A处理器编译的高阶程式码将以Thumb(含Thumb-2)为目标。因此编译人员可获得最大的自由,在有多重选择下合理选择所要使用的指令,在针对程式码空间进行编译与针对效能进行编译两种情况下实现最高的差异。
ARM指令集通常用于必须要达到最高效能的程式码区段。这些区段有时可在组译器内手动编码,而ARM指令集通常会是最好的选择。
- 细说嵌入式领域的那些专业厂商认证(02-22)
- 嵌入式微处理器将走向何方?(03-09)
- 嵌入式系统与FPGA的最新动向(05-18)
- 2011 TI技术研讨会中国站揭开大幕(09-24)
- 新兴嵌入式产品持续推动传感器快速增长(06-20)
- Cortex-M4致三大嵌入式领域比拼新技术(09-13)