我有信心我了解rvalue
和lvalue
的含义。我不清楚的是解除是否是rvalue
。
考虑一下:
#define GPIO_BASE 0x20200000
#define GPFSEL1 (*(volatile unsigned int *)(AUX_MU_BASE + 0x4))
gpfsel1是对未签名的int指针的解释。未签名的int指针是硬件寄存器的物理地址。
我读到,这是裸金属编程中的一种常见技术,可以直接访问硬件寄存器。到目前为止,我能够毫无问题地使用它。
现在,我希望reference
到GPFSEL1
作为结构的成员。这可能吗?
struct MotorControl
{
u8 pwm_pin;
u8 ctrla_pin;
u8 ctrlb_pin;
volatile unsigned int* MYGPFSEL; // this is not the same thing so does not work
}
在下面给定此功能,参考GPFSEL1
的正确方法是什么,哪些在其他地方定义了以及如何将其解释以设置其值?
MotorContorl group
group.MYGPFSEL = ?
void set(unsigned char pin_number, bool high)
{
if (high)
{
// how to correct this statement
group.MYGPFSEL |= 1<< pin_number;
}
}
" deReference"是一个动词 - 您将指示指向访问指向的值的指针。
类型转换很简单 - 如果您有指向整数的指针,并且您将其解释,那么您现在正在使用整数。这是一个LVALUE,因为它(通过构造)占据了内存中的位置,并且您可以(通常)修改一个位置。
int x = 10;
int* xptr = &x;
*xptr = 5; // *xptr is an lvalue
std::cout << "X: " << x << std::endl; // Prints 5
但是,指针需要指向内存中的位置。如果您只是从
开始int* xptr;
*xptr = 5;
您将遇到一个错误,因为您正在尝试放置一个指针,该指针没有指向有效的内存地址。(如果确实如此,那纯粹是偶然的,您会错误地更改价值。)
如果您想引用GPFSel1作为MotorControl结构的成员,则您将无法初始化结构,而无需传递其将引用的对象。您可能想要的是结构内部的指针,它更容易使用:
MotorControl myMotorControl;
myMotorControl.MYGPFSEL = GPFSELF1;
您的当前方法可以正常工作,您只需要适当地初始化成员变量,例如
struct MotorControl control;
control.MYGPFSEL = (volatile unsigned int *)(AUX_MU_BASE + 0x4);
另外,您可以将其初始化为
control = &GPFSEL1;
鉴于您已将gpfsel1定义为原来的问题:
#define GPFSEL1 (*(volatile unsigned int *)(AUX_MU_BASE + 0x4))`
现在您可以阅读寄存器:
foo = *control.MyGPFSEL;
或设置寄存器:
*control.MyGPFSEL = 123;
这是一个很容易回答的问题,解雇可以是作业的左侧,因此它是L值。
易于说明的案例:
char sz[] {"hello"};
*sz = 'j';
如果某物可以是作业的左侧,则根据定义是l值。