[問題] 嵌入式特殊語意

作者: TianBonBon (田蹦蹦)   2017-04-14 14:14:11
開發平台(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),
實際執行時會發生啥不可預期的結果嗎?
作者: soheadsome (師大狗鼻哥)   2016-04-14 14:14:00
m_queue_start_index 型態是?
作者: TianBonBon (田蹦蹦)   2017-04-14 14:16:00
static volatile uint8_t m_queue_start_index;static volatile uint8_t m_queue_end_index;
作者: notBeing (read and be read)   2017-04-14 15:56:00
volatile...
作者: james732 (好人超)   2017-04-14 16:27:00
那個tmp變數好像非必要?
作者: changenew (星巴克天空有綠茶.....)   2017-04-14 17:00:00
volatile是關鍵
作者: coldStart   2017-04-14 17:24:00
個人猜測是要強制更新變數
作者: Hazukashiine (私は幸せです)   2017-04-14 17:40:00
個人猜測這只是作者想寫這樣而已
作者: chuegou (chuegou)   2017-04-14 19:15:00
同意volatile是關鍵
作者: LPH66 (-6.2598534e+18f)   2017-04-14 19:16:00
好像只有差在 == 不保證取值順序的樣子?寫兩行的話中間有個 ; 斷開, 所以 start 必先於 end 取值不過我不太確定作者是不是有這個意圖就是了volatile 應該只是保證取來的必定是最新結果而已
作者: TWkobe (中華柯比)   2017-04-14 19:46:00
會不會是不能保證每次queue_start_index都一樣?
作者: james732 (好人超)   2017-04-14 20:45:00
這個index看起來也不像是會自己改變的hardware reg
作者: xvid (DivX)   2017-04-16 00:19:00
我猜以前tmp還有被拿來做其他運算 後來被刪掉了?

Links booklink

Contact Us: admin [ a t ] ucptt.com