看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
hpeter: 印像中 vilatile 只是保證一定會去ram 讀/寫 05/31 09:05
hpeter: 要 disable compiler OOO 要用 barrier ?? 05/31 09:06
mimi0213: 還可以加__asm__ __volatile__ ("" : : : "memory") 05/31 09:28
mimi0213: 再來cpu這段要用isb or dsb去防止pipeline ooo. 05/31 09:29
mimi0213: 可以參考linux kerel怎麼寫 05/31 09:30
fr3ak: 不行. C/C++ 的 volatile 不禁止 compiler 與 CPU 進行 mem 05/31 09:38
fr3ak: ory reordering 05/31 09:38
所以看起來在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
Joes1017: out-of-order exe應該是cpu做的 並不是compiler isb/dsb 05/31 10:33
Joes1017: 可防此問題 05/31 10:33
suhorng: 應該不是 'out-of-order exec', 就純粹 reordering XD 05/31 10:52
會覺得有OOO是因為stepping和run的結果不一樣, 而asm就看到reordering了,兩個同時發生(窘 不知道為什麼網路上沒看到關於stellaris的分享,launchpad系列不是已經算紅了嗎? 還是大家都用stellarisware的driver了(function call)所以沒發生? 我現在用function+FUNC_CANNOT_INLINE把可能出問題的時序包起來,等有mcu時跑看看
jackylu63: 好像有看過function 被設為volatile 05/31 11:12
volatile int a() 是returned var被設volatile吧
ables: 可以設定 strong order ? 05/31 11:24
找不到相關的資料耶 請問是? 用寫8051/pic的等級玩arm好像遠遠的不太夠QQ ※ 編輯: kdjf (140.112.7.214), 05/31/2015 12:03:41
mimi0213: instruction reorder compiler這端會做,所以用我提供的 05/31 13:21
mimi0213: memory barrier code實作防止。isb/dsb是cpu指令 05/31 13:22
mimi0213: 去查查arm的spec。要寫inline asm或者不用寫都可以。 05/31 13:23
ti自己的compiler好像無法用inline asm產生memory barrier 如果不夠再試試看isb等
fr3ak: 撇開特定 toolchain 與 architecture 不談. 原則上存取順序 05/31 13:35
fr3ak: 與最佳化是相斥的. 需要可觀察的一致性就得要明確的同步 ( 05/31 13:35
fr3ak: 如 barrier) 05/31 13:35
恩恩,已經看過一些code被compiler弄到難以理解例子了XD
mimi0213: 還有就是mmio這塊的address屬性要設成non-cacheable 05/31 13:40
mimi0213: 一般non-cacheable屬性就會有strongly order。這部份 05/31 13:42
mimi0213: 可以參考kernel實作。我想你應該是在non-os的環境。 05/31 13:42
mimi0213: 細節部份要對照spec,每種cache屬性有他的order定義。 05/31 13:44
只有用到crotex m4,暫時沒有mmu需要煩惱(還好 linux kernel到處是可以挖寶的地方XD 謝謝大家提供這麼多意見~! ※ 編輯: kdjf (140.112.7.214), 05/31/2015 15:00:10
Killercat: 其實答案就是前面提的barrier啊... XD 05/31 18:22
kdjf: 我有看到歐~ 05/31 18:53