最近在学习TI 的BLE协议栈,其中发现了一个问题: #define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) #define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) 其中st(x)应作何解释? #define st(x) do { x } while (__LINE__ == -1) 其中:__LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的, 所以__LINE__ == -1 等同于0,化简为: #define st(x) do { x } while (0)2,do {} while (0)通常用于宏中, 为的是避免如下情况: #define st(x) x 那么我们在调用 if (0) st(a = b; b = c;) 时会被解释成 if(0) a = b; b = c; 可见, b = c会任何时候都执行。所以有人想到了用 do { } while (0) 来解决这个问题, do {} while 语句是需要分号来结束的, 另外, 现代编译器的优化模块能够足够聪明地注意到这个循环只会执行一次而将其优化掉.综上所述, do { } while(0) 这个技术就是为了类似的宏可以在任何时候使用. 注: 如果你看过 linux 内核源代码, 这个技巧非常常见转载于http://blog.youkuaiyun.com/oyyj42/article/details/26235613
谈谈#define st(x) do { x } while (__LINE__ == -1) 的理解
最新推荐文章于 2021-07-10 21:39:12 发布
本文深入解析了TI蓝牙低功耗(BLE)协议栈中用于保护临界区的宏定义HAL_ENTER_CRITICAL_SECTION与HAL_EXIT_CRITICAL_SECTION的工作原理。通过分析宏st(x)的实现方式,即使用do{}
5469

被折叠的 条评论
为什么被折叠?



