有一个读取宏如下:
#define I915_READ16(reg) i915_read16(dev_priv, (reg))
#define I915_WRITE16(reg) i915_write16(dev_priv, (reg))
我想测量每个读/写命令所用的时间。 我可以很容易地写如下
#define I915_WRITE_NOTRACE(reg, val) \
do { \
__start_mmio(); \
writel(val, dev_priv->regs + (reg));\
_end_mmio(); \
} while(0)
其中 __start_mmio 和 __end_mmio 是测量时间的函数。 但是对于阅读,如果我这样做,这个宏会给我一个编译错误,因为宏的使用如下:
val = I915_READ16(reg)
将被解码为
val = do {
__start_mmio();
readl(dev_priv->regs + (reg));
_end_mmio();
} while(0)
肯定是编译错误。
最佳答案
使用这个宏:
#define I915_READ_NOTRACE(reg) \
(start_mmio2() + readl(dev_priv->regs + (reg)) + end_mmio2())
将 start_mmio2
和 end_mmio2
定义为返回 0 的函数。例如:
static inline int start_mmio2(void)
{
__start_mmio();
return 0;
}
关于c - 在c中包装一个读取宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27161757/