MSP430寄存器上的按位运算符,无需取消引用

用户2251965

我正在使用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

...声明P1DIRvolatile unsigned char,而不是指向一个的指针。在这样的对象上执行按位运算没有问题。

我也倾向于认为您误解了链接描述文件。你说

P1DIR的值在链接时添加

,但尽管我不知道所涉及的特定链接程序脚本语言,但它是一种链接语言。当然,如果脚本包含...

P1DIR              = 0x0022;

...然后定义了对应于该符号的地址,而不是C语言意义上的值。这与存储在那里的值的类型无关。将地址与符号相关联是链接的全部目的。

那么,大概0x0022是I / O端口的地址。当程序读取的值时P1DIR,它正在从该地址读取一个值,因此也从端口读取一个值,这大概会显示状态寄存器或类似内容的值。它不读取地址本身。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何分配变量指针访问MSP430上的硬件寄存器?

来自分类Dev

hashCode中按位运算符>>>

来自分类Dev

按位运算符的优先顺序

来自分类Dev

按位'&'运算符

来自分类Dev

了解&按位运算符的用法

来自分类Dev

按位运算符的说明

来自分类Dev

MSP430 CMP运算符

来自分类Dev

在MSP430上,取消引用空指针会发生什么?

来自分类Dev

按位运算符如何工作

来自分类Dev

运算符按位左移

来自分类Dev

按位运算符违反Misra

来自分类Dev

数组引用速度与按位运算符

来自分类Dev

MSP430(MSP430-GCC)链接器的未定义引用

来自分类Dev

按位运算符的通用约束

来自分类Dev

Gremlin中的按位运算符

来自分类Dev

if语句中的按位运算符

来自分类Dev

不同长度BitArrays上的按位运算符

来自分类Dev

XMM寄存器中的取消引用指针(收集)

来自分类Dev

按位运算符如何工作?

来自分类Dev

Java | 按位运算符

来自分类Dev

PHP中的按位运算符

来自分类Dev

按位运算符的类型转换

来自分类Dev

字节上的Scala按位运算符

来自分类Dev

OpenCL:更好地使用更多的寄存器,还是使用位移运算符打包值?

来自分类Dev

C按位运算符

来自分类Dev

MSP430(MSP430-GCC)链接器的未定义引用

来自分类Dev

对A寄存器进行XOR运算如何清除Z80中F寄存器上的进位位?

来自分类Dev

按位或运算符

来自分类Dev

带有寄存器的枚举和按位运算符