从ARM公司发布的白皮书看,Cortex-M系列内核的指令集如下图所示:
需要注意的是FPU单元是指的芯片上的一个独立于CPU处理的浮点运算单元整个单元在大多厂家芯片中都是可以被使能和关闭的。相对于芯片,编译器也设置了相应的FPU功能开启/关闭的选项,在编译时需要告诉编译器是否开启FPU功能。汇编器一旦开启FPU功能,在处理单精度浮点运算的语句时就会带V-开头的汇编指令进行编译。
如果编译器使能了FPU功能,而芯片未开启FPU单元,程序运行到浮点语句时就会出现异常。相反,如果编译器未能使能FPU功能,芯片即使开启了FPU单元,程序还是会按照未使能FPU的代码进行处理。
以KEIL为例,在创建一个Cortex-M4的工程后,在工程的Options for target “xxx”窗口的Target页面中选择是否开启FPU功能。如下图所示:
编译器通过该选项来判断是否使用V-开头的浮点运算指令。
一旦选择了“use FPU”功能,如果代码中有单精度浮点运算的代码,编译器就会使能带V-的FPU单元汇编指令,无论芯片是否开启了FPU单元功能。如果选择了不使用FPU功能,即使芯片开启了FPU单元,编译器一样不会采用带V-的汇编指令。
下面用一个实例来分析开启、关闭FPU单元的程序处理。
其中011.~014. 行在开启编译器FPU功能后,编译出来的代码为:
其中红色标注的都是以V-开头的汇编代码,这些代码在FPU单元中运行。
如果关闭编译器的FPU功能,编译出来的代码如下:
其中红色标注部分是程序执行浮点加法运算的部分,调用了单精度浮点运算的库函数。