__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");用编译器V6下为什么会报错
时间: 2023-07-05 16:19:19 浏览: 202
在编译器V6下,代码中的__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");可能会报错,原因是编译器V6不再支持GCC风格的内联汇编语法。所以,您需要使用新的内联汇编语法。
新的内联汇编语法如下:
```
__asm volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
```
其中,__asm是GCC扩展关键字,volatile表示汇编代码是具有副作用的,"VMSR fpscr, %0"表示汇编代码,":"表示分隔符,"r" (fpscr)表示将C语言变量fpscr传递给汇编代码,"vfpcc"表示使用vfpcc寄存器。
请注意,新的内联汇编语法在GCC和Clang编译器中都适用,但在其他编译器中可能会有所不同。
相关问题
在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"寄存器。
需要说明的是,修改汇编代码可能会导致代码的功能发生变化,因此您需要仔细检查修改后的代码是否符合您的需求。
阅读全文