amer
r
r
addressr
r
r
这种定义也变得相对好理解。以上的这种定义只是多了一个u
io
的定义,将一个16位的地址存储空间分成2个8bits或者1个16位。可以实现字访问,也可以实现字节访问。以上定义是将一个无名的u
io
与address联系起来,使得访问address对应的内存时,就像访问u
io
一样。r
r
r
那么对于下面的一些看起来貌似比较复杂的定义就相对比较好理解了:r
r
r
defi
eRF1AIFCTL1_0x0F02uRadioi
terfaceco
trolregister1r
r
r
DEFCWRF1AIFCTL1RF1AIFCTL1_r
r
r
defi
eRF1AIFIFGRF1AIFCTL1_LRadioi
terfacei
terruptflagregisterr
r
r
defi
eRF1AIFIERF1AIFCTL1_HRadioi
terfacei
terrupte
ableregisterr
r
r
可以发现,第一个宏定义,“RF1AIFCTL1_”在字符串的最后带一个下划线,其实代表这只是一个地址。而通过宏扩展DEFCWRF1AIFCTL1RF1AIFCTL1_,将会被扩展为:r
r
r
__
o_i
itu
io
r
r
r
r
r
r
structr
r
r
r
r
r
volatileu
sig
edcharRF1AIFCTL1_Lr
r
r
volatileu
sig
edcharRF1AIFCTL1_Hr
r
r
r
r
r
volatileu
sig
edshortRF1AIFCTL1r
r
r
0x0F02ur
r
r
r
r
关于的用法,今天查阅了《MSP430IARCECCompilerRefere
ceGuide》,找到了结果:r
r
r
Avariablethathasbee
explicitlyplacedata
addressforexamplebyusi
gthecompilersy
taxwillbeplacedi
eithertheDATA16_ACortheDATA16_ANsegme
tr
r
r
从中可以看出,是一种语法。那么它的作用很明显就是将变量放置到对应的地址中。使用,一个变量可以明确的制定一个存储地址。r
r
r
因此之前的宏定义就变得好理解了。r
r
r
defi
eDEFC
ameaddress__
o_i
itvolatileu
sig
edchar
ameaddressr
r
r
就是将
ame变量存放在address地址中,那么如此一来就可以为每个寄存器进行命名了,也就是说可以实现每个寄存器对应一个或者多个变量。r
r
r
至此头文件中另外一个问题也迎刃而解:r
r
r
defi
eRF1AIFCTL1_0x0F02uRadioi
terfaceco
trolregister1r
r
r
DEFCWRF1AIFCTL1RF1AIFCTL1_r
r
r
defi
eRF1AIFIFGRF1AIFCTL1_LRadioi
terfacei
terruptflagregisterr
r
r
defi
eRF1AIFIERF1AIFCTL1_HRadioi
terfacei
terrupte
ableregisterr
r
r
我们将DEFCWRF1AIFCTL1RF1AIFCTL1_展开:r
r
r
__
o_i
itu
io
r
r
r
r
r
r
structr
r
r
r
r
r
volatileu
sig
edcharRF1AIFCTL1_Lr
r
r
volatileu
sig
edcharRF1AIFCTL1_Hr
r
r
r
r
r
volatileu
sig
edshortRF1AIFCTL1r
r
r
0x0F02ur
r
r
那么可以知道,RF1AIFCTL1,RF1AIFCTL1_L,RF1AIFCTL1_H已经声明成为一个变量,存放的地址分别是0x0F02u,0x0F02u1,0x0F02u。因此接下来后面两条宏定义就自然的解开了。r
r
r
defi
eRF1AIFIFGRF1AIFCTL1_LRadioi
terfacei
terruptflagregisterr
r
r
defi
eRF1AIFIERF1AIFCTL1_HRadioi
terfacei
terrupte
ableregisterr
r
r
功能只是为变量RF1AIFCTr