- 论坛徽章:
- 1
|
编译一个用例如下
int main(int argc, char **argv)
{
unsigned long a, b, c;
unsigned int d, e, f;
c = a / b;
f = d / e;
return 1;
}
arm-none-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -mfpu=vfp3 -mfloat-abi=soft div.c -o div-arm-soft
4.6.3的arm-none-linux-gnueabi-gcc编译,反汇编结果如下:
0000842c <main>:
842c: e92d4800 push {fp, lr}
8430: e28db004 add fp, sp, #4
8434: e24dd020 sub sp, sp, #32
8438: e50b0020 str r0, [fp, #-32] ; 0xffffffe0
843c: e50b1024 str r1, [fp, #-36] ; 0xffffffdc
8440: e51b0008 ldr r0, [fp, #-8]
8444: e51b100c ldr r1, [fp, #-12]
8448: eb00000a bl 8478 <__aeabi_uidiv>
844c: e1a03000 mov r3, r0
8450: e50b3010 str r3, [fp, #-16]
8454: e51b0014 ldr r0, [fp, #-20] ; 0xffffffec
8458: e51b1018 ldr r1, [fp, #-24] ; 0xffffffe8
845c: eb000005 bl 8478 <__aeabi_uidiv>
8460: e1a03000 mov r3, r0
8464: e50b301c str r3, [fp, #-28] ; 0xffffffe4
8468: e3a03001 mov r3, #1
846c: e1a00003 mov r0, r3
8470: e24bd004 sub sp, fp, #4
8474: e8bd8800 pop {fp, pc}
可以看到unsigned long和unsigned int的除法,arm-none-linux-gnueabi-gcc都是调的__aeabi_uidiv
我没有4.8的gcc,只能猜测,可能4.8中的unsigned long型的除法是调用的__aeabi_uldiv
所以如果LZ驱动中用的是unsigned long型的话可以尝试改成unsigned int试试
这个问题应该就是4.8的eabi软浮点库对unsigned long和unsigned int型的除法不再一样了,但是内核中又没跟上这种变化,所以导致编译出错
|
|