• 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

  • 相关阅读:
    MySQL数据库之索引
    python面向对象编程
    linux端口占用
    lintcode
    java基础
    lintcode
    linux 常用命令
    Docker & Kubernates
    angular preparation
    java 命令行
  • 原文地址:https://www.cnblogs.com/txqdm/p/14434168.html
Copyright © 2020-2023  润新知