运行针对我的CPU的ARM代码时出现"非法指令"

Rim*_*mio 2 linux gcc arm cross-compiling

我正在为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内核中的东西吗?

Not*_*hat 5

什么softfp意思是使用函数之间的软浮点调用约定,但仍然使用其中的硬件FPU.假设您的交叉编译器配置了默认-mfpu选项而不是"none"(运行arm-whatever-gcc -v并寻找--with-fpu=检查),那么您就遇到了问题,因为据我所知,从Atmel数据表中可以看出,SAM9G25没有一个FPU.

我的第一直觉就是在那里拍GDB,捕获信号并反汇编违规指令以确保,但Thumb代码工作正常的事实已经是赠品(ARMv6T2之前的Thumb不包含任何协处理器指令,因此可以不使用FPU.

简而言之,用于-mfloat-abi=soft确保ARM代码实际使用软件浮点并避免戳不存在的FPU.如果"严重的数字运算"涉及很多浮点,也许可以考虑使用不同的MCU ......

  • 正如我所提到的,Thumb hard-float只能从ARMv6T2开始发生(因为VFP指令需要32位Thumb-2编码),因为VFP指令需要32位Thumb-2编码 - 根本没有合理的方法将它们装入16位.因为你的代码仍在使用软浮点ABI,编译器可以自由地回归到纯软件FP - 为了比较,尝试`-mfloat-abi = hard -mthumb -mcpu = arm926ej-s`然后看看会发生什么. (2认同)