我为ARM编译了一个相当大的项目。我使用AT91SAM9G25-EK作为运行Debian ARM映像的开发板。图像中的所有库和可执行文件似乎都是为armv4t指令集编译的。
我的CPU是ARM926EJ-S,它应该运行armv5tej代码。
我正在使用GCC为我的电路板进行交叉编译。我的CXX标志如下所示:
set(CMAKE_CXX_FLAGS "--signed-char --sysroot=${SYSROOT} -mcpu=arm926ej-s -mtune=arm926ej-s -mfloat-abi=softfp" CACHE STRING "" FORCE)
如果我尝试在我的主板上运行它,我会在初始化其中一个依赖项时使用非法指令信号(SIGILL
)(使用armv4t)。
如果我启用了拇指模式(-mthumb -mthumb-interwork
),它可以工作,但是对所有代码使用Thumb,在我的情况下运行速度较慢(我正在做一些严重的数字运算)。
在这种情况下,如果我指定一个要为ARM模式编译的函数(使用__attribute__((target("arm")))
),它将运行正常,直到调用该函数,然后以SIGILL
退出。
我输了。我使用armv4t链接库是不是很糟糕?我误解了ARM模式的工作方式吗?它是linux内核中的东西吗?
答案 0 :(得分:5)
softfp
的含义是在函数之间使用soft-float调用约定,但仍使用其中的硬件FPU。假设你的交叉编译器配置了默认的-mfpu
选项而不是“none”(运行arm-whatever-gcc -v
并查找--with-fpu=
来检查),那么你就遇到了问题,因为as从Atmel数据表中可以看出,SAM9G25没有FPU。
我的第一直觉就是在那里拍GDB,捕获信号并反汇编有问题的指令以确保,但Thumb代码工作正常的事实已经是赠品(在ARMv6T2之前的Thumb不包括任何协处理器指令,因此无法使用FPU。
简而言之,使用-mfloat-abi=soft
来确保ARM代码实际使用软件浮点并避免戳不存在的FPU。如果“严重的数字运算”涉及很多浮点,也许可以考虑使用不同的MCU ......