看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) CortexM0 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc-arm-none-eabi-4_8-2014q1-20140314-linux 問題(Question): 目前正在玩nRF51822,核心是CortexM0,沒有OS, 在追蹤它提供的一些util時發現某個有趣的寫法, 搞不懂它為何要拆成兩行來寫, static __INLINE uint8_t app_sched_queue_empty() { uint8_t tmp = m_queue_start_index; return m_queue_end_index == tmp; } 如果改寫成return(m_queue_end_index == m_queue_start_index), 實際執行時會發生啥不可預期的結果嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.47.144 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1492150454.A.259.html
soheadsome: m_queue_start_index 型態是? 04/14 14:14
TianBonBon: static volatile uint8_t m_queue_start_index; 04/14 14:16
TianBonBon: static volatile uint8_t m_queue_end_index; 04/14 14:16
notBeing: volatile... 04/14 15:56
james732: 那個tmp變數好像非必要? 04/14 16:27
changenew: volatile是關鍵 04/14 17:00
coldStart: 個人猜測是要強制更新變數 04/14 17:24
Hazukashiine: 個人猜測這只是作者想寫這樣而已 04/14 17:40
chuegou: 同意volatile是關鍵 04/14 19:15
LPH66: 好像只有差在 == 不保證取值順序的樣子? 04/14 19:16
LPH66: 寫兩行的話中間有個 ; 斷開, 所以 start 必先於 end 取值 04/14 19:17
LPH66: 不過我不太確定作者是不是有這個意圖就是了 04/14 19:18
LPH66: volatile 應該只是保證取來的必定是最新結果而已 04/14 19:18
TWkobe: 會不會是不能保證每次queue_start_index都一樣? 04/14 19:46
james732: 這個index看起來也不像是會自己改變的hardware reg 04/14 20:45
xvid: 我猜以前tmp還有被拿來做其他運算 後來被刪掉了? 04/16 00:19