[問題] 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