我想指定的ARMv6 VFP与Android设备。
我在下面一行Android.mk
文件来启用VFP
LOCAL_CFLAGS := -marm -mfloat-abi=softfp -mfpu=vfp -Wmultichar
我相信我的目标ARMv5
用VFP
。
我编辑android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\setup.mk
以除去-msoft-float
。 我也试图与原setup.mk
我的代码工作的时间精细99.99%,但有些时候去疯狂的ARMv6设备。 我有特殊的代码,当它疯狂的检测。
码
glm::vec3 D = P1 - P2;
float f1 = sqrtf(D.x*D.x + D.y*D.y + D.z*D.z);
if(!(f1 < 5)){
// f1 is bigger then 5 or NaN
mylog_fmt("Crazy %f %f %f %f", P1.x, P1.y, P1.z, f1);
mylog_fmt("%f %f %f", P2.x, P2.y, P2.z);
}
logcat的 :
12-14 00:59:08.214: I/APP(17091): Crazy -20.000031 0.000000 0.000000 20.000000
12-14 00:59:08.214: I/APP(17091): -20.000000 0.000000 0.000000
它可以计算2点之间的距离。 通常它是0.000031但是,当crazy mode
是它是20.0
当我的ARMv7 CPU上运行,它的问题不存在。 它的存在只ARMv6的CPU上。
我相信它应该是与编译器设置或版本的一些常见已知的bug。 可能是代码缺少内存屏障。
我想看到一些参考类似错误。 的方式来解决它。 或约错误的性质。
我也经常得到的ARMv6 NaN值当的ARMv7相同的代码不给NaN的。
我调试的代码2周已经和Web搜索。 如果有人可以分享链接,类似的问题,这将是一个很大的帮助!
PS。 这里是示例编译命令之一。 我尝试了许多不同的设置了。
编译器设置
c:/soft/Android/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-g++
-MMD -MP -MF ./obj/local/armeabi/objs/main/sys/base.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-march=armv5te -mtune=arm6
-mfloat-abi=softfp -mfpu=vfp
-fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64
-Ijni/main/ -Ijni/main/sys -Ijni/main/bullet/src -Ijni/main/bullet/src/LinearMath -Ijni/main/bullet/src/BulletCollision/BroadphaseCollision
-Ijni/main/bullet/src/BulletCollision/CollisionDispatch -Ijni/main/bullet/src/BulletCollision/CollisionShapes -Ijni/main/bullet/src/BulletCollision/NarrowPhaseCollision
-Ijni/main/bullet/src/BulletDynamics/ConstraintSolver -Ijni/main/bullet/src/BulletDynamics/Dynamics -Ijni/main/../libzip/ -Ic:/soft/Android/android-ndk-r8b/sources/cxx-stl/stlport/stlport
-Ic:/soft/Android/android-ndk-r8b/sources/cxx-stl//gabi++/include -Ijni/main
-DANDROID
-marm -march=armv6 -mfloat-abi=softfp -mfpu=vfp -Wmultichar
-Wa,--noexecstack -frtti -O2 -DNDEBUG -g -Ic:/soft/Android/android-ndk-r8b/platforms/android-5/arch-arm/usr/include -c jni/main/sys/base.cpp
-o ./obj/local/armeabi/objs/main/sys/base.o
更新2
所有这些设备有高通MSM7227A,具有ARM1136JF-S
我了解到,到目前为止是该错误可能涉及到de-norms
我读某处的ARMv6是有差异的ARMv7 denorms
默认和ARM1136SF-S零冲洗有它可选。 http://infocenter.arm.com/help/topic/com.arm.doc.ddi0211k/DDI0211K_arm1136_r1p5_trm.pdf
尚未确定如何验证ARM是嵌入式到零标志。
更新3
该CPU的VFP称为VFP11
我发现--vfp11-denorm-fix
选项。 还有--vfp-denorm-fix
他们纠正勘误VFP11
的CPU。 看起来像我的目标问题。 几个有关VFP11勘误发现帖子。 希望这将修复代码。