我细看了一下,缺少一个加号,下行中已经加入。
#define portaddr(port, reg) (port_base[port] + (reg)) <<看到了吗?这里要一个"+"号
对代码的分析如下:
根据c文件中定义:
#define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
static u32 port_base[] = {S3C24XX_VA_UART0, S3C24XX_VA_UART1, S3C24XX_VA_UART2};
现在把portaddr(port, reg) 展开
portaddr(port, reg)
=(port_base[port] + (reg)
例如port=0, reg= S3C2410_ULCON=0x0 (实际物理地址0x50000000+0x0)
= (S3C24XX_VA_UART0 + S3C2410_ULCON)
这里的意思基地址+偏移地址。这样的话,再把__raw_writeb(val, portaddr(port, reg))展开就对了:
__raw_writeb(val, portaddr(port, reg))
=__raw_writeb(val, S3C24XX_VA_UART0+S3C2410_ULCON)
这里我们要注意__raw_writel(v,a)是这样定义的(include/asm-arm/io.h):
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))
如果没有这个加号,编译器把宏展开后就得到(仍以上面的地址为例)
wr_regb(port, reg, val)
= __raw_writeb(val, portaddr(port, reg))
=__raw_writeb(val, S3C24XX_VA_UART0 S3C2410_ULCON)
这样与定义不符,编译器看到了一个与已经定义的函数同名,但不同功能的函数。
因此:error: called object is not a function。
这个错误引起的原因往往是:函数定义与系统的函数或变量同名,编译器不知道调用谁或怎么调用。比如你自定义一个MAX宏,但系统GCC中往往已经有了这么个东西。