皮质-m3上的挥发性uint32_t

Ran*_*lue 1 c cortex-m3

这是我的代码:

volatile uint32_t value = *((volatile uint32_t *) 0xA0000000); // here `value` is 12498
value *= 2; // here `value` is still 12498
value |= 0x0000001; // still 12498
Run Code Online (Sandbox Code Playgroud)

value在我的调试器中分析变量时,它在所有行上保持相同的值.我究竟做错了什么?

pax*_*blo 5

也许你的调试器实际上并不那么好.当我的某个工具似乎没有表现时,我总是在另一个工具上检查它.

尝试调试老式的方法,:

volatile uint32_t value = *((volatile uint32_t *) 0xA0000000);
printf ("A:%d\n", value);

value *= 2;
printf ("B:%d\n", value);

value |= 0x0000001;
printf ("C:%d\n", value);
Run Code Online (Sandbox Code Playgroud)

或者其他一些输出方法如果printf不可用(看起来你可能在嵌入式空间中工作).

看看你得到了什么 - 我更倾向于信任printf- 调试比调试器.


如果您的问题不在,value而是在位置的内存0xA0000000,那么它正在按预期工作.

你正在操纵局部变量,而不是内存位置.您需要将值写回,例如:

*((volatile uint32_t *) 0xA0000000) = value;
Run Code Online (Sandbox Code Playgroud)

但是,考虑到你使用volatile,你完全有可能只需要一个指向该位置的变量指针,以便更改立即反映出来.

如果是这种情况,你需要的是:

volatile uint32_t *pValue = (volatile uint32_t *) 0xA0000000;
*pValue *= 2;
*pValue |= 0x00000001;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,存储器位置将在每条指令处改变,不必显式写入该值.