楼主:
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
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:00instruction 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定义。
楼主:
kdjf (我抓得到什么呢?)
2015-05-31 18:53:00我有看到欧~