我正在使用MSP430G2553,而TI在我正在使用的标头(msp430g2553.h)中定义了一些帮助程序代码。因此,例如,如果我想设置端口1的GPIO引脚0的方向,我可以编写
P1DIR |= BIT0;
出于好奇,我看了看如何定义P1DIR。我发现
SFR_8BIT(P1DIR);
其中SFR_8BIT被定义为
#define SFR_8BIT(address) extern volatile unsigned char address
所以我们得到
extern volatile unsigned char P1DIR
P1DIR的值在链接时添加,并且定义为(在链接器脚本中):
P1DIR = 0x0022;
所以最后我们得到
extern volatile unsigned char 0x0022;
因此对我来说,P1DIR看起来像是一个指针,这意味着我们必须取消引用它。但是在所有文档中,我认为它们直接在P1DIR而不是* P1DIR上进行按位运算符。那怎么可能?
这个 ...
extern volatile unsigned char P1DIR
...声明P1DIR
为volatile unsigned char
,而不是指向一个的指针。在这样的对象上执行按位运算没有问题。
我也倾向于认为您误解了链接描述文件。你说
P1DIR的值在链接时添加
,但尽管我不知道所涉及的特定链接程序脚本语言,但它是一种链接语言。当然,如果脚本包含...
P1DIR = 0x0022;
...然后定义了对应于该符号的地址,而不是C语言意义上的值。这与存储在那里的值的类型无关。将地址与符号相关联是链接的全部目的。
那么,大概0x0022
是I / O端口的地址。当程序读取的值时P1DIR
,它正在从该地址读取一个值,因此也从端口读取一个值,这大概会显示状态寄存器或类似内容的值。它不读取地址本身。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句