為什麼這篇__asm__ volatile鄉民發文收入到精華區:因為在__asm__ volatile這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者kdjf (我抓得到什麼呢?)看板C_and_CPP標題[問題] volatile能保證執行順序...
開發平台(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
找網路時大部分的人說只要用vilatile就夠
to mimi0213, 用isb/dsb的意思是只好寫inline asm了?
inline asm應該不會也被reorder吧.. (還是這沒有規定,只是大部份的compiler沒那麼聰明?
※ 編輯: kdjf (1.169.194.43), 05/31/2015 10:19:39
而asm就看到reordering了,兩個同時發生(窘
不知道為什麼網路上沒看到關於stellaris的分享,launchpad系列不是已經算紅了嗎?
還是大家都用stellarisware的driver了(function call)所以沒發生?
我現在用function+FUNC_CANNOT_INLINE把可能出問題的時序包起來,等有mcu時跑看看
用寫8051/pic的等級玩arm好像遠遠的不太夠QQ
※ 編輯: kdjf (140.112.7.214), 05/31/2015 12:03:41
如果不夠再試試看isb等
linux kernel到處是可以挖寶的地方XD
謝謝大家提供這麼多意見~!
※ 編輯: kdjf (140.112.7.214), 05/31/2015 15:00:10