wgdlly 发表于 2011-7-23 08:42:30

如何看懂IAR里面头文件的未定义部分代码?

最近在学习AVR,使用的开发环境是IAR,在参考一些资料和看了IAR开发环境提供个help文档之后,基本上可以把内部资源都调试成功,发现,IAR里面的位操作挺方便,但是自己打开头文件去看IAR是如何实现这种位操作的,但就是看不懂,所以就来这里向高手请教,以下是IAR头文件里面的一部分代码

特殊功能寄存器PORTA的定义如下

SFR_B_N(0x1B,PORTA,PORTA7,PORTA6,PORTA5,PORTA4,PORTA3,PORTA2,PORTA1,PORTA0)

SFR_B_N是一个宏,使用goto definition 可以看到其定义如下:

#define SFR_B_N(_ADDR, _NAME, _B7, _B6, _B5, _B4, _B3, _B2, _B1, _B0) \
               SFR_B_BITS_N(_NAME, _ADDR, \
                              Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7, \
                              _B0,_B1,_B2,_B3,_B4,_B5,_B6,_B7)

然后继续使用goto definition发现SFR_B_BITS_N的宏定义代码如下:
#define SFR_B_BITS_N(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H, \
                                 _A2,_B2,_C2,_D2,_E2,_F2,_G2,_H2) \
    __io union { \
      unsigned char   _NAME;         /* The sfrb as 1 byte */ \
      struct {                        /* The sfrb as 8 bits */ \
      __BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \
      };\
      struct {                        /* The sfrb as 8 bits */ \
      __BYTEBITS(_NAME, _A2,_B2,_C2,_D2,_E2,_F2,_G2,_H2) \
      };\
    } @ _ADDR;


继续。。。。__BYTEBITS的goto definition代码为:

#define __BYTEBITS(_NAME,_A,_B,_C,_D,_E,_F,_G,_H) \
unsigned char _NAME ## _ ## _A:1, \
            _NAME ## _ ## _B:1, \
            _NAME ## _ ## _C:1, \
            _NAME ## _ ## _D:1, \
            _NAME ## _ ## _E:1, \
            _NAME ## _ ## _F:1, \
            _NAME ## _ ## _G:1, \
            _NAME ## _ ## _H:1;
到这里就不能再往下进行goto definiton了,最终我还是看不懂这部分代码是如何实现位操作的,
这个问题很是困扰,因为我用IAR开发S3C2410的时候发现里面的头文件也是这样定义的,我猜这应该是IAR的一种风格吧


希望高手可以帮小弟解决问题呀


万分感谢!!!!!!!!!!

He_Simon 发表于 2011-8-12 18:20:06

这些代码都是和编译器有关的,其实不必去纠结,像这种宏定义你只要知道功能就行了,

funv 发表于 2011-10-16 21:53:58

一直用 KEIL C51, 最近学 EWAVR 我看到这里面的代码也头大, 上网查, 查到这里来了。

hysgoogle 发表于 2011-11-20 21:13:51

看不懂,这个和我们编程影响不大吧。

51_jiaduoW~W 发表于 2013-1-21 14:32:21

请问iar下s3c2410的启动文件有吗?最好有工程模板,能给我发一份吗?1183557534@qq.com,谢谢了

jisaowang 发表于 2013-2-5 20:44:44

看不懂的,都补习下C语言的宏定义就全明白了,提示:The `##' preprocessing operator performs token pasting. When a macro is expanded, the two tokens on either side of each `##' operator are combined into a single token
页: [1]
查看完整版本: 如何看懂IAR里面头文件的未定义部分代码?