__asm__ __volatile__ ("" : : : "memory")

本文详细解析了内存屏障(memory barrier)的基本概念及其实现方式。通过深入探讨__asm__,__volatile__和memory的作用,揭示了如何利用这些技术确保CPU正确地处理内存操作,防止不必要的优化行为。

1.内存屏障(memory barrier)
  #define set_mb(var, value) do { var = value; mb(); } while (0)
  #define mb() __asm__ __volatile__ ("" : : : "memory")

1)set_mb(),mb(),barrier()函数追踪到底,就是__asm__ __volatile__("":::"memory"),而这行代码就是内存屏障。
2)__asm__用于指示编译器在此插入汇编语句
3)__volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
4) memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。
5)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。在后文将讨论什么叫串行化指令。
6)__asm__,__volatile__,memory在前面已经解释

`__asm volatile()` 是 C/C++ 中用于插入**内联汇编代码**的一种语法结构,常见于嵌入式开发(如 ARM、RISC-V、x86 等平台),特别是在操作系统底层、驱动程序或实时系统中。 --- ### 含义解析: #### `__asm` - 表示插入一段**汇编指令**。 - 不同编译器语法略有不同: - GCC/Clang 使用:`__asm__` - MSVC 使用:`__asm` - ARM 编译器也支持 `__asm` #### `volatile` - 告诉编译器:**不要对该汇编代码进行优化或重排**。 - 保证该段代码按你写的顺序执行,常用于硬件操作、内存屏障等关键代码。 --- ### 基本语法(GCC 示例): ```c __asm volatile ( "instruction1" : outputs : inputs : clobbers ); ``` - `"instruction1"`:实际的汇编指令字符串。 - `outputs`:输出操作数。 - `inputs`:输入操作数。 - `clobbers`:告知编译器哪些寄存器被修改。 --- ### 示例:使用 `__asm volatile()` 插入 WFE 指令 ```c void wait_for_event(void) { __asm volatile ("wfe"); } ``` 这等价于调用 `__wfe()` 函数。 --- ### 示例:读取当前程序计数器 PC(ARM Cortex-M) ```c unsigned int get_pc(void) { unsigned int pc; __asm volatile ("MOV %0, PC" : "=r"(pc)); return pc; } ``` - `"MOV %0, PC"`:将程序计数器值移动到寄存器中。 - `=r(pc)`:输出到变量 `pc` 所在的寄存器。 --- ### 示例:插入内存屏障指令(ARM DMB) ```c __asm volatile ("dmb ish" ::: "memory"); ``` 用于确保内存访问顺序,防止编译器和CPU乱序执行。 --- ### 注意事项: | 项目 | 说明 | |------|------| | 可移植性 | 内联汇编依赖具体架构,不具可移植性 | | 调试困难 | 内联汇编不易调试,建议封装成函数 | | 编译器支持 | GCC、Clang 支持较好;MSVC 风格不同 | | volatile 的作用 | 防止编译器优化和指令重排 | --- ### 总结:`__asm volatile()` 是干嘛的? > **用于在C/C++代码中插入不可优化汇编指令,实现对硬件、CPU状态、内存顺序等底层控制,是嵌入式和系统级编程的重要工具。** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值