【发布时间】:2023-03-14 01:15:01
【问题描述】:
我使用的是 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。这怎么可能?
【问题讨论】:
-
P1DIR至少根据上面的声明不是指针类型,如果它被定义为extern volatile unsigned char *P1DIR,它将是指针。 -
@kiranBiradar 是的,你是对的。但在我看来,P1DIR 的值是一个地址,就像指针的值是一个地址一样。那么,如果我们首先将指针转换为 int/char,我们能否在不取消引用指针的情况下对指针值进行按位操作?也许我错过了链接阶段发生的其他事情。
-
在这种情况下,我想我需要将 P1DIR 转换为指针,然后对其进行按位运算,例如 *((char *) (P1DIR)) |= BIT0; .好吧,也许这毕竟是有道理的,将其转换为指针然后解除引用会相互消除。
-
casting it to a pointer and then dereferencing eliminates each other不,这是不正确的。这样做实际上取消了0x0022位置。
标签: c pointers cpu-registers msp430