开启ARM中的FPU
FPU全称Float Process Unit,即浮点运算单元,在ARM cortex系列中,除了M0以外,其它M处理器基本都有FPU,FPU可以有效的提高浮点数的运算能力,虽然M0中没有FPU,但并不是说CM0+里不能使用浮点类型进行浮点运算,M0中浮点运算会通过软件方式实现,当然软件的方式,处理速度也会慢很多。
在有FPU的处理器的时候,程序编译的时候一定要显式的指明浮点运算的实现方式,否则可能出现在有FPU的情况下依然使用了软件实现,这个显然不是我们想要的结果。
另外,在使用了FPU单元进行编译的时候,我们还需要在芯片初始化的时候手动打开FPU,这个打开的操作是通过以下方式实现的:
;CPACR is located at address 0xE000ED88
LDR.W R0, =0xE000ED88
; Read CPACR
LDR R1, [R0]
; Set bits 20-23 to enable CP10 and CP11 coprocessors
ORR R1, R1, #(0xF << 20)
; Write back the modified value to the CPACR
STR R1, [R0] ;wait for store to complete
DSB
;reset pipeline now the FPU is enabled
ISB
这里给出的是汇编代码,其实看起来也不是很难,就是把0xE000ED88
的20~23位写1就可以了,用C语言则是以下的实现方式:
*(uint32_t *)0xE000ED88 |= (0xF << 20);
asm("DSB");
asm("ISB");
后面两句也不是完全必要,只是一个保险,防止你开启FPU之后立马使用。如果初始化之后还有很多代码执行,那么DSB, ISB
是可以省略的。
以上就是浮点单元的开启方式,记住,没有开启浮点单元情况下运行浮点指令会产生异常中断。
最后更新于 2019-10-12 09:55:25 并被添加「FPU 汇编」标签,已有 5120 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。