好记性不如铅笔头

ARM, 操作系统

《RealView编译工具编译器参考指南》摘录:部分指令内在函数

备注:

1 本部分文档摘录自ARM网站【 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bc/index.html 】,版权归属于ARM。

2 作者只摘录了部分内容,全面详细的内容清参考ARM网址。

4.7. 指令内在函数

4.7.5. __current_pc

通过使用此内在函数,可以确定程序中使用该内在函数的位置处的程序计数器的当前值。

语法

unsigned int __current_pc(void)

返回值

__current_pc 内在函数返回程序中使用该内在函数的位置处的程序计数器的当前值。

4.7.6. __current_sp

此内在函数返回程序中当前位置的堆栈指针值。

语法

unsigned int __current_sp(void)

返回值

__current_sp 内在函数返回程序中使用该内在函数的位置处的堆栈指针的当前值。

4.7.7. __disable_fiq

此内在函数禁用 FIQ 中断。

Note

通常,此内在函数通过设置 CPSR 中的 F 位禁用 FIQ 中断。但对于 v7-M,它设置故障掩码寄存器 (FAULTMASK)。v6-M 中不支持 FIQ 中断。

语法

int __disable_fiq(void)

Note

在 M-profile 上,__disable_fiq 内在函数具有以下原型:
void __disable_fiq(void)

返回值

__disable_fiq 返回在禁用 FIQ 中断之前 FIQ 中断掩码在 PSR 中包含的值。

限制

只能在特权模式(即非用户模式)下执行 __disable_fiq 内在函数。在用户模式下,此内在函数不会更改 CPSR 中的中断标记。

示例

void foo(void)
{
    int was_masked = __disable_fiq();
    /* ... */
    if (!was_masked)
        __enable_fiq();
}

4.7.8. __disable_irq

此内在函数禁用 IRQ 中断。

Note

通常,此内在函数通过设置 CPSR 中的 I 位禁用 IRQ 中断。但对于 M-profile,它设置异常掩码寄存器 (PRIMASK)。

语法

int __disable_irq(void)

Note

在 M-profile 上,__disable_irq 内在函数具有以下原型:
void __disable_irq(void)

返回值

__disable_irq() 返回在禁用 IRQ 中断之前 IRQ 中断掩码在 PSR 中包含的值。

示例

void foo(void)
{
    int was_masked = __disable_irq();
    /* ... */
    if (!was_masked)
        __enable_irq();
}

限制

只能在特权模式(即非用户模式)下执行 __disable_irq 内在函数。在用户模式下,此内在函数不会更改 CPSR 中的中断标记。

4.7.9. __enable_fiq

此内在函数启用 FIQ 中断。

Note

通常,此内在函数通过清除 CPSR 中的 F 位启用 FIQ 中断。但对于 v7-M,它清除故障掩码寄存器 (FAULTMASK)。v6-M 中不支持 FIQ 中断。

语法

void __enable_fiq(void)

限制

只能在特权模式(即非用户模式)下执行 __enable_fiq 内在函数。在用户模式下,此内在函数不会更改 CPSR 中的中断标记。

4.7.10. __enable_irq

此内在函数启用 IRQ 中断。

Note

通常,此内在函数通过清除 CPSR 中的 I 位启用 IRQ 中断。但对于 Cortex M-profile 处理器,它清除异常掩码寄存器 (PRIMASK)。

语法

void __enable_irq(void)

限制

只能在特权模式(即非用户模式)下执行 __enable_irq 内在函数。在用户模式下,此内在函数不会更改 CPSR 中的中断标记。

4.7.11. __fabs

此内在函数在编译器生成的指令流中插入 VABS 指令或等效的代码序列。通过使用此内在函数,可以从 C 或 C++ 代码中获取双精度浮点值的绝对值。

Note

__fabs 内在函数类似于标准 C 库函数 fabs。它在以下方面不同于标准库函数:可确保在基于 ARM 体系结构且配备 VFP 协处理器的处理器上将 __fabs 调用编译为单个内联机器指令。

语法

double __fabs(double val)
其中:
val
    是一个双精度浮点值。

返回值

__fabs 内在函数以 double 形式返回 val 的绝对值。

4.7.12. __fabsf

此内在函数是 __fabs 内在函数的单精度版本。它与 __fabs 的功能相当,只不过:
    它使用 float 类型的自变量,而不是 double 类型的自变量
    它返回 float 值,而不是 double 值。

4.7.18.  __nop

此内在函数在编译器生成的指令流中插入 NOP 指令或等效的代码序列。将为源代码中的每个 __nop 内在函数生成一个 NOP 指令。
除了正常删除不会到达的代码之外,编译器不会优化删除 NOP 指令。__nop 内在函数还用作编译器中的指令调度屏障。即,不会由于优化而将指令从 NOP 一侧移到另一侧。

Note

可以使用 __schedule_barrier 内在函数插入调度屏障,而无需生成 NOP 指令。

语法

void __nop(void)

4.7.28.  __return_address

此内在函数返回当前函数的返回地址。

语法

unsigned int __return_address(void)

返回值

__return_address 内在函数返回在从当前函数返回时使用的链接寄存器的值。

限制

__return_address 内在函数不 影响编译器执行优化的功能,如内联、尾调用和代码共享。如果进行了优化,__return_address 返回的值将反映所执行的优化:

不优化

    如果未执行任何优化,__return_address 从函数 foo 中返回的值是 foo 的返回地址。

内联优化

    如果函数 foo 已内联到函数 bar,则 __return_address 从 foo 中返回的值是 bar 的返回地址。

尾调用优化

    如果从函数 bar 中尾调用函数 foo,则 __return_address 从 foo 中返回的值是 bar 的返回地址。

Leave a Reply

10 − 6 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据