[问题] volatile能保证执行顺序吗?

楼主: kdjf (我抓得到什么呢?)   2015-05-31 08:55:09
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
TI CCS + TI arm compiler
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
none
问题(Question):
因为out-of-order execution产生bus fault
喂入的资料(Input):
none
预期的正确结果(Expected Output):
none
错误结果(Wrong Output):
asm中被重排成read 3, write 1, write 2, write 4, write 3,在device上产生bus fault
程式码(Code):(请善用置底文网页, 记得排版)
(*((volatile unsigned long *)0x400FE608))=0x01;
作者: hpeter (hpeter)   2015-05-31 09:05:00
印像中 vilatile 只是保证一定会去ram 读/写要 disable compiler OOO 要用 barrier ??
作者: mimi0213 (提拉米苏好好吃喔)   2015-05-31 09:28:00
还可以加__asm__ __volatile__ ("" : : : "memory")再来cpu这段要用isb or dsb去防止pipeline ooo.可以参考linux kerel怎么写
作者: fr3ak (fr3@K)   2015-05-31 09:38:00
不行. C/C++ 的 volatile 不禁止 compiler 与 CPU 进行 memory reordering
作者: Joes1017 (阿伦)   2015-05-31 10:33:00
out-of-order exe应该是cpu做的 并不是compiler isb/dsb可防此问题
作者: suhorng ( )   2015-05-31 10:52:00
应该不是 'out-of-order exec', 就纯粹 reordering XD
作者: jackylu63 (J)   2015-05-31 11:12:00
好像有看过function 被设为volatile
作者: ables (笑点)   2015-05-31 11:24:00
可以设定 strong order ?
作者: mimi0213 (提拉米苏好好吃喔)   2015-05-31 13:21:00
instruction reorder compiler这端会做,所以用我提供的memory barrier code实作防止。isb/dsb是cpu指令去查查arm的spec。要写inline asm或者不用写都可以。
作者: fr3ak (fr3@K)   2015-05-31 13:35:00
撇开特定 toolchain 与 architecture 不谈. 原则上存取顺序与最佳化是相斥的. 需要可观察的一致性就得要明确的同步 (如 barrier)
作者: mimi0213 (提拉米苏好好吃喔)   2015-05-31 13:40:00
还有就是mmio这块的address属性要设成non-cacheable一般non-cacheable属性就会有strongly order。这部份可以参考kernel实作。我想你应该是在non-os的环境。细节部份要对照spec,每种cache属性有他的order定义。
作者: Killercat (杀人猫™)   2015-05-31 18:22:00
其实答案就是前面提的barrier啊... XD
楼主: kdjf (我抓得到什么呢?)   2015-05-31 18:53:00
我有看到欧~

Links booklink

Contact Us: admin [ a t ] ucptt.com