作者TianBonBon (田蹦蹦)
看板C_and_CPP
标题[问题] 嵌入式特殊语意
时间Fri Apr 14 14:14:11 2017
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1492150454.A.259.html
1F:推 soheadsome: m_queue_start_index 型态是? 04/14 14:14
2F:→ TianBonBon: static volatile uint8_t m_queue_start_index; 04/14 14:16
3F:→ TianBonBon: static volatile uint8_t m_queue_end_index; 04/14 14:16
4F:→ notBeing: volatile... 04/14 15:56
5F:推 james732: 那个tmp变数好像非必要? 04/14 16:27
6F:推 changenew: volatile是关键 04/14 17:00
7F:推 coldStart: 个人猜测是要强制更新变数 04/14 17:24
8F:推 Hazukashiine: 个人猜测这只是作者想写这样而已 04/14 17:40
9F:推 chuegou: 同意volatile是关键 04/14 19:15
10F:推 LPH66: 好像只有差在 == 不保证取值顺序的样子? 04/14 19:16
11F:→ LPH66: 写两行的话中间有个 ; 断开, 所以 start 必先於 end 取值 04/14 19:17
12F:→ LPH66: 不过我不太确定作者是不是有这个意图就是了 04/14 19:18
13F:→ LPH66: volatile 应该只是保证取来的必定是最新结果而已 04/14 19:18
14F:推 TWkobe: 会不会是不能保证每次queue_start_index都一样? 04/14 19:46
15F:→ james732: 这个index看起来也不像是会自己改变的hardware reg 04/14 20:45
16F:→ xvid: 我猜以前tmp还有被拿来做其他运算 後来被删掉了? 04/16 00:19