在ARM Cortex-A9 MPCore上存储/加载原子性
假设在ARM Cortex-A9 MPCore实现上分配和访问32位整数是原子操作,并且分配的值与所有内核同步,安全吗?C编译器能保证吗在ARM Cortex-A9 MPCore上存储/加载原子性,c,assembly,arm,C,Assembly,Arm,假设在ARM Cortex-A9 MPCore实现上分配和访问32位整数是原子操作,并且分配的值与所有内核同步,安全吗?C编译器能保证吗 uint32_t *p; *p = 4711; 及 是否在汇编程序中转换为原子操作?“原子”和“与所有内核同步”是不同的要求。市场上所有的ARM内核都以原子方式对内存执行32位操作(也就是说,如果没有其余部分,你永远看不到单词的“部分”)不是所有这些都是核心之间的缓存一致性,细节(尤其是像big.LIGHT这样更奇特的配置)非常复杂 使用操作系统同步原语。这
uint32_t *p;
*p = 4711;
及
是否在汇编程序中转换为原子操作?“原子”和“与所有内核同步”是不同的要求。市场上所有的ARM内核都以原子方式对内存执行32位操作(也就是说,如果没有其余部分,你永远看不到单词的“部分”)不是所有这些都是核心之间的缓存一致性,细节(尤其是像big.LIGHT这样更奇特的配置)非常复杂
使用操作系统同步原语。这种复杂性是他们设计用来抽象的。不,这就是strex/ldrex的原因。在内核中,正常的str和ldr是可以的,但为了确保对其他内核的访问,您必须使用strex/ldrex(并有一个支持它们的内存系统)。您可以随时分解对象文件并自己检查。@JoachimPileborg,永远不要这样做。结果可能会从一个生成配置更改为另一个生成配置。
uint32_t *p;
return *p;