开启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是可以省略的。

以上就是浮点单元的开启方式,记住,没有开启浮点单元情况下运行浮点指令会产生异常中断。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论