c - 在c中包装一个读取宏

标签 c linux kernel

有一个读取宏如下:

#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_mmio2end_mmio2 定义为返回 0 的函数。例如:

static inline int start_mmio2(void)
{
    __start_mmio();
    return 0;
}

关于c - 在c中包装一个读取宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27161757/

相关文章:

c - 如何将主函数中的反向字符串函数转换为自己的独立函数?

C&Lua : luaL_dostring return value

c - 这个程序的输出是什么意思?

c - 从 sysctl.h 实现 GetBSDProcessList

linux - vim 中的可视化 block 编辑

linux - 如何创建自己的 Linux 发行版?

linux - 杀死命令中特定值位于特定范围之间的进程

c++ - printf 网络数据

c - Linux redhat 内核头文件

linux - 任何 x86 处理器上是否有最小页面大小?