Cortex-M4内核在v6编译器下 __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");怎么修改
时间: 2023-07-05 12:20:22 浏览: 245
在v6编译器下,由于Cortex-M4内核已经支持了ARMv8-M架构,因此VFP指令已经被废弃,取而代之的是Advanced SIMD指令集和浮点指令扩展(Floating-Point Extension,FPE)。因此,在Cortex-M4内核上,将原来的VMSR指令更改为VMRS指令,并且需要使用FPEcc修饰符来指定FPEcc控制位的设置。
修改后的语句如下所示:
```c
__ASM volatile ("VMRS fpscr, %0" : : "r" (fpscr) : "fpexc");
```
该语句的作用是将传入的fpscr值写入FPSCR寄存器中,以配置和控制FPU的运算精度和舍入方式等。具体的操作是通过汇编指令 `VMRS fpscr, %0` 实现的,其中 `%0` 表示使用第一个输入参数(即fpscr值)替换指令中的占位符,将fpscr值写入FPSCR寄存器中。
需要注意的是,该语句中使用了 "fpexc" 修饰符,表示该指令依赖于FPEcc控制位的设置。因为在ARMv8-M架构中,VFPcc控制位已经被替换为了FPEcc控制位,因此需要使用 "fpexc" 修饰符来指定控制位的设置。
相关问题
在v6编译器下的具体函数__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
在ARM Cortex-M处理器中,浮点运算单元(FPU)的配置和控制是通过特殊寄存器FPSCR(浮点状态和控制寄存器)来完成的。在CMSIS库中,__set_FPSCR函数用于设置FPSCR寄存器的值。具体函数定义如下:
```c
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
{
__ASM volatile ("MSR fpscr, %0" : : "r" (fpscr) : "memory");
}
```
可以看到,该函数使用了 `__attribute__( ( always_inline ) )` 属性,表示该函数在编译时应该被强制内联,以提高函数调用的效率。函数实现内联后,可以直接将函数代码插入到调用处,避免了函数调用时的堆栈操作和跳转指令,从而提高了代码执行的效率。
该函数的作用是将传入的fpscr值写入FPSCR寄存器中,以配置和控制FPU的运算精度和舍入方式等。具体的操作是通过汇编指令 `MSR fpscr, %0` 实现的,其中 `%0` 表示使用第一个输入参数(即fpscr值)替换指令中的占位符,将fpscr值写入FPSCR寄存器中。
需要注意的是,该函数使用了 `__STATIC_INLINE` 关键字,表示该函数既是静态函数,又是内联函数。这意味着该函数只能在当前源文件中使用,并且在编译时应该被内联展开。
../CORE\core_cmFunc.h(615): error: unknown register name 'vfpcc' in asm怎么解决这个报错
这个错误是由于编译器不支持使用"vfpcc"作为内联汇编代码中的寄存器名称导致的。解决这个问题的方法是使用正确的寄存器名称或修改汇编代码以避免使用该寄存器。
在ARM Cortex-M处理器中,浮点寄存器是通过特殊的寄存器堆栈来管理的。因此,如果您需要在内联汇编代码中使用浮点寄存器,请使用正确的寄存器堆栈。
以下是使用正确的寄存器名称的示例代码:
```
__asm volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "memory");
```
这里使用了"memory"作为占位符,表示内联汇编代码可能会访问内存,以避免编译器优化引起的问题。
如果您无法使用正确的寄存器名称,您可以尝试修改汇编代码以避免使用该寄存器。例如,您可以使用其他寄存器来代替"vfpcc"寄存器。
需要说明的是,修改汇编代码可能会导致代码的功能发生变化,因此您需要仔细检查修改后的代码是否符合您的需求。
阅读全文