→ 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