Cortex-M系列:ARM架构与汇编指令集的关系
原文链接:https://blog.csdn.net/NoDistanceY/article/details/104177163
本章是花费大好多功夫整理总结的,某种意义上算原创。文中大量内容是引用的,请见谅。
文中比的比较仅到Armv8-M架构的Cortex-M33,没涉及后续新版本(也没法预计到)。
1 ARM处理器分类
ARM的老产品树:
1、第一级——架构:ARMv4~ARMv6
2、第二级——产品系列:如ARMv4下的部分ARM7、部分ARM9
3、第三级——产品实例:如ARM7下的ARM7TDDMI(编号命名)
可见,这种命名法产品系列和架构处于网状对应结构,容易引起歧义。而产品实例的编号命名方式个人感觉还行,可以反映处理器的微架构。ARM公司自2004年推出ARMv7内核架构时,摒弃了以往”ARM+数字”这种处理器命名方法(ARM11之前的处理器统称经典处理器系列),重新启用Cortex来命名[4]。
ARM的新产品矩阵:
一维——架构 :Armv6~Armv8
另一维——应用角度下的产品系列:Cortex-M,Cortex-R,Cortex-A
两个维度交际下生成子架构:如ARMv7下有ARMv7-A、ARMv7-R、ARMv7-M架构。
具体产品实例无法直接根据产品名确定微架构的变化(架构版本),如Cortex-M4使用的是ARMv7E-M。
2 基于Thumb-2技术的Thumb®指令集
1、什么是Thumb?
Thumb指令能够看做是ARM指令压缩形式的子集。是针对代码密度的问题而提出的。它具有16位的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序仅仅运行Thumb指令而不支持ARM指令集[5]。
2、为什么要有Thumb2,它与其他指令的关系如何?
注意上面的官方用语,用的是技术而不是说“Thumb-2指令集”。从官方角度说,并没有“Thumb-2指令集”。但[1]提及了,也算是合理的存在吧。
基于Thumb-2技术的Thumb指令集,不仅在原先的Thumb指令集基础上又添加了一些与ARM指令集中相同的指令(添加的这些指令大多是4字节编码的),而且降低了大多数原先Thumb指令集中运行条件的限制[3]。另外,为了提高架构见的软件移植性,并使得不同架构的ARM处理器符合同一汇编语言语法[1],基于Thumb-2技术的Thumb指令集引入了全新的汇编语法——“统一汇编语言UAL”,从而实现了对独立的ARM语法和Thumb语法的代替[3]。
3、Cortex-M与Thumb-2
为了方便设计对成本敏感的设备,Cortex-M7处理器实现了紧密耦合的系统组件,减少了处理器面积,同时显著提高了中断处理和系统调试能力。Cortex-M7处理器实现了基于Thumb-2技术的Thumb®指令集的一个版本,确保了高的代码密度和降低的程序内存需求。Cortex-M7处理器指令集提供了现代32位架构所期望的卓越性能,比大多数8位和16位微控制器具有更好的代码密度[2]。
由于处理器支持Thumb-2指令集中的16为和32指令,因此无须在Thumb状态(16位指令)和ARM状态(32位指令)间来回切换。
CortexM系列对Thumb-2指令集支持的程度是不同的,具体详见各自的手册。可以根据不同处理器支持的特性来初步判断是否有某些指令,如CortexM4支持浮点运算,因此就有“V”开头的一些浮点运算指令。
一个有趣的现象:Cortex-M4可选择没有FPU和有单精度FPU。Cortex-M7可选单精度FPU和双精度FPU。可能是FPU作为协处理器是独立于CPU的存在吧。(高清图,请到[6]下载)
顺便提一下,想用DSP加速程序的前提是:不是浮点运算。然后才是在SIMD和fast MAC中找下原先有几条基础指令才能完成但用DSP指令能一条完成的情况。使用时,尽量用CMSIS_DSP库。
而下图是Armv8下的CortexM系列的指令[6]。但不是本文的重点,(高清图,请到[6]下载)
3 参考资料
[1] Joseph Yiu. ARM Cortex-M3与Cortex-m4权威指南(第3版)[M]. 吴常玉,曹孟娟,王丽红,译. 北京:清华大学出版社,2015.
[2] ARM® Cortex®-M7 Devices Generic User Guide
[3]What is the difference between the ARM, Thumb and Thumb 2 instruction encodings? https://stackoverflow.com/questions/28669905/what-is-the-difference-between-the-arm-thumb-and-thumb-2-instruction-encodings
[4] 扒一扒ARM Cortex-M各版本的第一款MCU http://blog.sina.com.cn/s/blog_7889f9830102wth7.html
[5] Thumb指令集与ARM指令集的差别 https://www.cnblogs.com/mthoutai/p/7043477.html
[6] Cortex-M for Beginners - 2017_EN_v2 https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/white-paper-cortex-m-for-beginners-an-overview-of-the-arm-cortex-m-processor-family-and-comparison
未引用资料:
[1] ARM架构及ARM指令集、Thumb指令集你了解多少? http://www.sohu.com/a/339622340_100281310
[2] arm的一些概念(ARM7、Cortex-M的区别) https://www.cnblogs.com/locean/p/5710377.html