码迷,mamicode.com
首页 > 移动开发 > 详细

学习笔记-移动设备的处理器指令集 armv6 armv7 armv7s arm64

时间:2015-10-14 14:07:56      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:

首先了解一下  苹果手机不同的机型所支持的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。

学习笔记-移动设备的处理器指令集 armv6 armv7 armv7s arm64

标签:

原文地址:http://www.cnblogs.com/luningning0901/p/4877067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!