[問題] 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
→
05/31 09:05, , 1F
05/31 09:05, 1F
→
05/31 09:06, , 2F
05/31 09:06, 2F
推
05/31 09:28, , 3F
05/31 09:28, 3F
→
05/31 09:29, , 4F
05/31 09:29, 4F
→
05/31 09:30, , 5F
05/31 09:30, 5F
→
05/31 09:38, , 6F
05/31 09:38, 6F
→
05/31 09:38, , 7F
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
05/31 10:33, 8F
→
05/31 10:33, , 9F
05/31 10:33, 9F
→
05/31 10:52, , 10F
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
05/31 11:12, 11F
volatile int a() 是returned var被設volatile吧
推
05/31 11:24, , 12F
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
05/31 13:21, 13F
→
05/31 13:22, , 14F
05/31 13:22, 14F
→
05/31 13:23, , 15F
05/31 13:23, 15F
ti自己的compiler好像無法用inline asm產生memory barrier
如果不夠再試試看isb等
推
05/31 13:35, , 16F
05/31 13:35, 16F
→
05/31 13:35, , 17F
05/31 13:35, 17F
→
05/31 13:35, , 18F
05/31 13:35, 18F
恩恩,已經看過一些code被compiler弄到難以理解例子了XD
推
05/31 13:40, , 19F
05/31 13:40, 19F
→
05/31 13:42, , 20F
05/31 13:42, 20F
→
05/31 13:42, , 21F
05/31 13:42, 21F
→
05/31 13:44, , 22F
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
05/31 18:22, 23F
→
05/31 18:53, , 24F
05/31 18:53, 24F