zoukankan      html  css  js  c++  java
  • 学习笔记-移动设备的处理器指令集 armv6 armv7 armv7s arm64

    首先要了解一下x86处理器和ARM处理器;

         来源于8086指令集的一系列处理器,都称为x86处理器;8086是最早的16位x86处理器,所以软件上标i386的时候,表示这个软件是32位的, 基于x86处理器的;所有32位和64位的x86处理器都能运行(除非软件上标着最低处理器限制);x86_64是处理器x86的64位的扩展,实现了从 32为到64位的平滑迁移,软件上标注x64或者amd64,就表示这个软件是64位的,基于x86处理器的,只有64位的处理器才能运行。

        X86架构是X86指令集,它属于CISC指令集。ARM架构ARM指令集,属于RISC指令集
    X86是冯若依曼结构,ARM是哈弗结构,这个不一定,比如ARM7TDMI用的就是冯若依曼结构。

    其实都是差不多,X86指令多,应用范围广,性能高,但效率就显得低一点,ARM指令少,应用范围小,功耗低,效率显得高。

           苹果手机不同的机型所支持的arm处理器的指令集

    Arm 处理器因为低功耗和小尺寸而闻名,几乎所有的手机设备上都是基于arm的,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色。

    1.armv6  支持 iPhone  iPhone2 iPhone3g和第一代 第二代的iPod touch

       armv7  支持iPhone4 和 iPhone4s

       armv7s 支持 iPhone5 和iPhone5c

       arm64 支持iPhone5s。需要最低支持5.1.1

    2.机器对于指令集是向下兼容的,也就是说armv7指令集  是可以运行在iPhone5上的,只是效率没那么高而已

    3.xcode里面关于arm的选项

    @1    Architecture : 指你想支持的指令集。

    @2    Valid architectures : 指即将编译的指令集。 (Architecture 和 Valid architectures 的交集,才是xcode编译生成的二进制包所支持的指令集。比如,将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置                  为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s 。)

    @3    Build Active Architecture Only : 只是否只编译当前连接设备的指令集。

      这个选项起作用需要两个条件:1.值设置为yes   2.成功连接上设备

    假定我们将Build Active Architecture Only值设置为YES,同时XCode连接上手机iPhone5S(匹配指令集arm64)

     

     第一种情况

    Architectures:  armv7, armv7s, arm64

    ValidArchitectures:  armv6, armv7s, arm64

    生成二进制包支持的指令集: arm64 

     

     第二种情况

    Architectures: armv6, armv7, armv7s

    Valid Architectures:  armv6, armv7s, arm64

    生成二进制包支持的指令集: armv7s 

     

     第三种情况

    Architectures:  armv6, armv7

    Valid Architectures: armv6, armv7s, arm64

    生成二进制包支持的指令集: armv7

     

     第四种情况

    Architectures: armv6

    Valid Architectures: armv6, armv7s, arm64

    生成二进制包支持的指令集: 虽然编译成功了,但是并没有任何目标生成, 因为从XCode4.5开始,就不再支持armv6指令集,所以列表中写了也是白写。

     

      第五种情况

    Architectures: armv7, armv7s, arm64

    Valid Architectures: armv7,armv7s

    生成二进制包支持的指令集: 编译出错信息

    1. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s) 

    可以看出:当Build Active Architecture Only起作用时:

    连接的手机指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。

     

    如连接手机为iPhone5S,其默认指令集为arm64,若Architectures列表为armv7, armv7s,则会选取armv7s指令集为目标指令集,如果此时Valid Architectures列表中包含该指令集,则成功生成的二进制包只支 持armv7s指令集,若valid Architectures列表不包含此指令集,则编译将会出错:

    1. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 arm64) 

     

    同样的,若Architectures列表为armv7,则会选取armv7作为目标指令集,若Valid Architectures列表中包含 了armv7指令集,则能够成功生成二进制包,其支持的指令集只有armv7,若Valid Architectures列表中不包含armv7,则编译 失败。

    建议:通常Debug模式设置值为Yes,Release模式设置为No。

     

    4.如果想APP在各个机器上高效率的运行,必须将Build Active Architecture Only 改为no,Valid Architectures 选择对应的指令集 为 armv7  armv7s  arm64。这个会为各个指令集 编译对应的代码,但是最后ipa包得体积就翻了3倍,release设置为NO.

     5.如果想让app体积保持最小,则现阶段应该选择Valid architectures 为  arm64 ,Build Active Architecture Only选择yes或者no就无所谓了。

     

     

     

    6.补充一点            iOS模拟器上不运行arm指令,软件会被编译成x86可以运行的指令,所以只有苹果设备上才会编译运行arm指令集。所以生成静态库时都是会先生成两个.a,一个是i386的用于在模拟器运行,另一个是在真实设备上运行的,然后再用命令行将两个.a合并成一个。

    因此如果一些程序中使用的静态库不支持armv7s,而你的工程支持armv7s时,就会出现“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的编译错误,想要解决这个问题,有两个方法:

    1.如果是开源的,能够找到源代码,则可以用源代码重新打一个支持armv7s的libaray, 或者在工程中直接使用源代码,而不是静态库。

    2.如果不是开源的,要么就坐等第三方库的支持,要么就暂时让你的工程不支持armv7s。

  • 相关阅读:
    ubuntu install ssh server
    blug聚会&&小资早餐
    virtual box share folder usage
    关于xrdp的安装设置
    使用scp传送文件
    firefox插件集锦
    原来ubuntu早有关机功能
    blug聚会&&小资早餐
    加域工具
    ubuntu安装virtual box在命令行
  • 原文地址:https://www.cnblogs.com/luningning0901/p/4877067.html
Copyright © 2011-2022 走看看