zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/txqdm/p/14434168.html
Copyright © 2011-2022 走看看