[問題] volatile能保證執行順序嗎?

看板C_and_CPP作者 (我抓得到什麼呢?)時間9年前 (2015/05/31 08:55), 9年前編輯推噓8(8016)
留言24則, 9人參與, 最新討論串1/1
開發平台(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; ----(1 (*((volatile unsigned long *)0x400FE604))=0x10; ----(2 (*((volatile unsigned long *)0x400FE06C))=0x18; ----(3 (*((volatile unsigned long *)0x4005B420))|=0x0E; ----(4 補充說明(Supplement): "volatile" + ";" 還不夠保證存取的順序嗎?還能怎麼做? 是說怪的是這串我如果用single stepping跑,不一定會出錯 直接跑的話100%掛點...? 該不會在compiler optimization後,cpu pipeline/timming又做了什麼吧Zzz -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.194.43 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433033713.A.3AE.html ※ 編輯: kdjf (1.169.194.43), 05/31/2015 08:58:03

05/31 09:05, , 1F
印像中 vilatile 只是保證一定會去ram 讀/寫
05/31 09:05, 1F

05/31 09:06, , 2F
要 disable compiler OOO 要用 barrier ??
05/31 09:06, 2F

05/31 09:28, , 3F
還可以加__asm__ __volatile__ ("" : : : "memory")
05/31 09:28, 3F

05/31 09:29, , 4F
再來cpu這段要用isb or dsb去防止pipeline ooo.
05/31 09:29, 4F

05/31 09:30, , 5F
可以參考linux kerel怎麼寫
05/31 09:30, 5F

05/31 09:38, , 6F
不行. C/C++ 的 volatile 不禁止 compiler 與 CPU 進行 mem
05/31 09:38, 6F

05/31 09:38, , 7F
ory reordering
05/31 09:38, 7F
所以看起來在ti compiler下只能全部包成function call了.. 找網路時大部分的人說只要用vilatile就夠 to mimi0213, 用isb/dsb的意思是只好寫inline asm了? inline asm應該不會也被reorder吧.. (還是這沒有規定,只是大部份的compiler沒那麼聰明? ※ 編輯: kdjf (1.169.194.43), 05/31/2015 10:19:39

05/31 10:33, , 8F
out-of-order exe應該是cpu做的 並不是compiler isb/dsb
05/31 10:33, 8F

05/31 10:33, , 9F
可防此問題
05/31 10:33, 9F

05/31 10:52, , 10F
應該不是 'out-of-order exec', 就純粹 reordering XD
05/31 10:52, 10F
會覺得有OOO是因為stepping和run的結果不一樣, 而asm就看到reordering了,兩個同時發生(窘 不知道為什麼網路上沒看到關於stellaris的分享,launchpad系列不是已經算紅了嗎? 還是大家都用stellarisware的driver了(function call)所以沒發生? 我現在用function+FUNC_CANNOT_INLINE把可能出問題的時序包起來,等有mcu時跑看看

05/31 11:12, , 11F
好像有看過function 被設為volatile
05/31 11:12, 11F
volatile int a() 是returned var被設volatile吧

05/31 11:24, , 12F
可以設定 strong order ?
05/31 11:24, 12F
找不到相關的資料耶 請問是? 用寫8051/pic的等級玩arm好像遠遠的不太夠QQ ※ 編輯: kdjf (140.112.7.214), 05/31/2015 12:03:41

05/31 13:21, , 13F
instruction reorder compiler這端會做,所以用我提供的
05/31 13:21, 13F

05/31 13:22, , 14F
memory barrier code實作防止。isb/dsb是cpu指令
05/31 13:22, 14F

05/31 13:23, , 15F
去查查arm的spec。要寫inline asm或者不用寫都可以。
05/31 13:23, 15F
ti自己的compiler好像無法用inline asm產生memory barrier 如果不夠再試試看isb等

05/31 13:35, , 16F
撇開特定 toolchain 與 architecture 不談. 原則上存取順序
05/31 13:35, 16F

05/31 13:35, , 17F
與最佳化是相斥的. 需要可觀察的一致性就得要明確的同步 (
05/31 13:35, 17F

05/31 13:35, , 18F
如 barrier)
05/31 13:35, 18F
恩恩,已經看過一些code被compiler弄到難以理解例子了XD

05/31 13:40, , 19F
還有就是mmio這塊的address屬性要設成non-cacheable
05/31 13:40, 19F

05/31 13:42, , 20F
一般non-cacheable屬性就會有strongly order。這部份
05/31 13:42, 20F

05/31 13:42, , 21F
可以參考kernel實作。我想你應該是在non-os的環境。
05/31 13:42, 21F

05/31 13:44, , 22F
細節部份要對照spec,每種cache屬性有他的order定義。
05/31 13:44, 22F
只有用到crotex m4,暫時沒有mmu需要煩惱(還好 linux kernel到處是可以挖寶的地方XD 謝謝大家提供這麼多意見~! ※ 編輯: kdjf (140.112.7.214), 05/31/2015 15:00:10

05/31 18:22, , 23F
其實答案就是前面提的barrier啊... XD
05/31 18:22, 23F

05/31 18:53, , 24F
我有看到歐~
05/31 18:53, 24F
文章代碼(AID): #1LQblnEk (C_and_CPP)