news 2026/8/25 15:32:51

【2015-02-13】《RealView编译工具编译器参考指南》摘录:部分指令内在函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2015-02-13】《RealView编译工具编译器参考指南》摘录:部分指令内在函数

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2015-02-13| 标题:《RealView编译工具编译器参考指南》摘录:部分指令内在函数分类:操作系统 / ARM |标签:ARM


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

    • 备注:
    • 4.7. 指令内在函数
      • 4.7.5. \_\_current\_pc
        • 语法
        • 返回值
      • 4.7.6. \_\_current\_sp
        • 语法
        • 返回值
      • 4.7.7. \_\_disable\_fiq
        • Note
        • 语法
        • Note
        • 返回值
        • 限制
        • 示例
      • 4.7.8. \_\_disable\_irq
        • Note
        • 语法
        • Note
        • 返回值
        • 示例
        • 限制
      • 4.7.9. \_\_enable\_fiq
        • Note
        • 语法
        • 限制
      • 4.7.10. \_\_enable\_irq
        • Note
        • 语法
        • 限制
      • 4.7.11. \_\_fabs
        • Note
        • 语法
        • 返回值
      • 4.7.12. \_\_fabsf
      • 4.7.18. \_\_nop
        • Note
        • 语法
      • 4.7.28. \_\_return\_address
        • 语法
        • 返回值
        • 限制
        • 不优化
        • 内联优化
        • 尾调用优化

备注:

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 中的中断标记。

示例
voidfoo(void){intwas_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 中包含的值。

示例
voidfoo(void){intwas_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 的返回地址。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 15:24:30

机器人破人类百米纪录:四足机器人的运动控制与工业落地

2026年,机器人再次刷新公众对运动能力的认知:一台四足机器人以10米/秒级别的速度完成百米冲刺,将“机器人破人类百米纪录”从实验室话题推向工程现实。对政企采购决策者而言,真正值得关注的不是单次赛跑成绩,而是这类高…

作者头像 李华
网站建设 2026/8/25 15:15:25

共享内存呀

共享内存(Shared Memory)是 IPC 进程间通信 方式之一,原理:在内核开辟一块物理内存,多个进程将这块内存映射到自己的虚拟地址空间,直接读写内存,无需内核拷贝数据,速度最快&#xff…

作者头像 李华
网站建设 2026/8/25 14:58:41

JVM规范第 3 章:从 Java 源码到字节码

本教程基于 Oracle 官方《The Java Virtual Machine Specification》(Java SE 26)第 3 章《Compiling for the Java Virtual Machine》整理编写。这一章本身不是规范性内容,而是由 Oracle 的 javac 示例展示「Java 源码是怎么变成 JVM 指令的…

作者头像 李华