在学习正点原子I.MX6ull芯片开发板的时候,有两个裸机实验(串口和spi)涉及到了除法运算以及浮点运算,
先声明,除法运算(定点和浮点,浮点除法是浮点运算的一种)和浮点运算是两个东西:
1.除法分为定点除法和浮点除法,arm中定点除法例如32位无符号整形除法,是没有直接的汇编指令的,需要借助软件库来实现;
2.浮点数的除法可以调用软件库来进行软件模拟,也可以借助硬件进行浮点数运算(协处理器,cp15指令开启硬件浮点运算)。
一、定点数除法指令需要链接gcc库:
使用定点数除法运算的时候编译提示错误 (可以看出来uidiv uldiv,这些函数是针对int 和long 这些定点数进行除法运算的函数):
bsp_uart.c:(.text+0xd4):对‘__aeabi_uidivmod’未定义的引用
bsp_uart.c:(.text+0xe2):对‘__aeabi_uidiv’未定义的引用
bsp_uart.c:(.text+0xec):对‘__aeabi_uidiv’未定义的引用
bsp_uart.c:(.text+0x156):对‘__aeabi_uldivmod’未定义的引用
bsp_uart.c:(.text+0x166):对‘__aeabi_uidiv’未定义的引用
bsp_uart.c:(.text+0x17a):对‘__aeabi_uidiv’未定义的引用
bsp_uart.c:(.text+0x186):对‘__aeabi_uldivmod’未定义的引用
bsp_uart.c:(.text+0x1e2):对‘__aeabi_uidiv’未定义的引用
bsp_uart.c:(.text+0x236):对‘__aeabi_uidiv’未定义的引用
bsp_uart.c:(.text+0x240):对‘__aeabi_uidiv’未定义的引用
原因是ARM,没有定点数的除法指令。libgcc库包含除法指令的代码,于是加上链接库gcc:
-lgcc -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-li

本文深入探讨了在ARM架构下,定点除法和浮点除法的实现方式。详细介绍了ARM中定点除法的软件库实现,以及如何通过链接gcc库解决编译错误。同时,讲解了浮点数除法的软件模拟与硬件加速方法,并提供了开启硬件浮点运算的具体步骤。
最低0.47元/天 解锁文章
958





