在v6编译器下的具体函数__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
时间: 2023-08-12 07:21:14 浏览: 158
在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` 关键字,表示该函数既是静态函数,又是内联函数。这意味着该函数只能在当前源文件中使用,并且在编译时应该被内联展开。
相关问题
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
这段代码使用了 `__attribute__((always_inline))` 和 `__STATIC_INLINE` 来定义了一个函数 `__disable_irq`。
`__attribute__((always_inline))` 是一个编译器属性,用于告诉编译器应该尽可能地将函数内联展开,即在调用处直接插入函数体的代码,而不是通过函数调用的方式执行。这样可以减少函数调用的开销,提高代码执行的效率。在这个例子中,`__disable_irq` 函数会被尽可能地内联展开。
`__STATIC_INLINE` 是一个宏定义,它用于指示编译器将函数定义为静态内联函数。静态内联函数可以在多个源文件中使用,而不会引起重复定义的错误。它一般用于头文件中定义的内联函数。
综合起来,这段代码定义了一个静态内联函数 `__disable_irq`,并使用 `__attribute__((always_inline))` 属性告诉编译器尽可能地将函数内联展开。由于这是编译器相关的扩展,具体的行为和效果可能会因编译器而异。
static __inline__ __attribute__((__always_inline__)) void _disable (void) { __asm__ volatile ("disable" ::: "memory"); }
以下是给出的演示代码:
```c
static __inline__ __attribute__((__always_inline__)) void _disable (void) {
__asm__ volatile ("disable" ::: "memory");
}
```
这段代码是一个函数 `_disable`,使用了 `static` 和 `__inline__` 关键字进行修饰,并且添加了 `__attribute__((__always_inline__))` 属性。这些修饰和属性的作用是将函数内联,即在调用函数的地方直接插入函数体的代码,而不是通过函数调用的方式执行。
阅读全文