C++ 检查C+中地址的可变值+;

C++ 检查C+中地址的可变值+;,c++,arrays,pointers,raspberry-pi,volatile,C++,Arrays,Pointers,Raspberry Pi,Volatile,我正在尝试为Raspberry Pi实现一个邮箱写入。根据我找到的信息,当邮箱为空时,我可以写入地址0x2000B8A0,这意味着0x2000B898没有设置最后一位。我是这样写的: uint32_t *mailbox = reinterpret_cast<uint32_t*>(0x2000B880); while((mailbox[6] & 0x80000000) != 0); mailbox[8] = value + channel; uint32\u t*邮箱=r

我正在尝试为Raspberry Pi实现一个邮箱写入。根据我找到的信息,当邮箱为空时,我可以写入地址
0x2000B8A0
,这意味着
0x2000B898
没有设置最后一位。我是这样写的:

uint32_t *mailbox = reinterpret_cast<uint32_t*>(0x2000B880);

while((mailbox[6] & 0x80000000) != 0);

mailbox[8] = value + channel;
uint32\u t*邮箱=reinterpret\u cast(0x2000B880);
而((邮箱[6]&0x8000000)!=0);
邮箱[8]=值+通道;
但是反汇编显示,
邮箱[6]
上的值在循环之前只加载了一次,然后它只使用该值重复检查


我找不到解决办法,因为我甚至不知道这个问题的正确用词。我相信这很简单,但谷歌搜索并没有为这种特殊情况带来任何好处。

答案取决于你们问题的标题。 您应该使用以下选项:

volatile uint32_t *mailbox = const_cast<volatile uint32_t *>(reinterpret_cast<uint32_t*>(0x2000B880));
volatile uint32\u t*邮箱=const\u cast(重新解释cast(0x2000B880));

这将确保每次在循环中都加载该值。如果您看到任何“代码>应用程序没有响应,请考虑添加一些<代码>睡眠< /代码>或<代码>延迟< /代码>或<代码>收益率<代码>。

< P>答案是标题中的问题。 您应该使用以下选项:

volatile uint32_t *mailbox = const_cast<volatile uint32_t *>(reinterpret_cast<uint32_t*>(0x2000B880));
volatile uint32\u t*邮箱=const\u cast(重新解释cast(0x2000B880));

这将确保每次在循环中都加载该值。如果您看到任何“代码>应用程序没有响应< /COD>,请考虑添加一些<代码>睡眠<代码>或<代码>延迟< /代码>或<代码>收益率<代码>。

这是有效的。我不知道您可以在
reinterpret\u cast
类型中使用
volatile
volatile
内部
reinterpret\u cast
是可选的。只要
mailbox
是一个
volatile*
mailbox[6]
每次都会从内存中重新加载。我更喜欢使用
const\u cast
来添加volatile,而不是重新解释cast。这很有效。我不知道您可以在
reinterpret\u cast
类型中使用
volatile
volatile
内部
reinterpret\u cast
是可选的。只要
邮箱
是一个
易失性*
邮箱[6]
每次都会从内存中重新加载。我更喜欢使用
常量转换
添加易失性,而不是重新解释转换。