下面是我的代码:
volatile uint32_t value = *((volatile uint32_t *) 0xA0000000); // here `value` is 12498value *= 2; // here `value` is still 12498value |= 0x0000001; // still 12498
volatile uint32_t value = *((volatile uint32_t *) 0xA0000000); // here `value` is 12498
value *= 2; // here `value` is still 12498
value |= 0x0000001; // still 12498
字符串在我的调试器中分析变量value时,它在所有行上都保持相同的值。我做错了什么?
value
wvyml7n51#
也许你的调试器实际上并不那么好。当我的一个工具似乎不正常时,我总是用另一个工具来检查它。尝试用老式的方法调试,使用:
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);
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);
字符串如果printf不可用,则使用其他输出方法(看起来您可能正在嵌入式空间中工作)。看看你得到了什么-我更倾向于相信printf-调试比调试器。如果您的问题不是与value有关,而是与0xA0000000位置的内存有关,那么它正在按预期工作。您操作的是局部变量,而不是内存位置。你需要写回值,类似于:
printf
0xA0000000
*((volatile uint32_t *) 0xA0000000) = value;
型然而,考虑到你使用的是volatile,你完全可能只是想要一个指向该位置的变量 * 指针 *,这样变化就会立即反映出来。如果是这样的话,你需要的东西沿着:
volatile uint32_t *pValue = (volatile uint32_t *) 0xA0000000;*pValue *= 2;*pValue |= 0x00000001;
volatile uint32_t *pValue = (volatile uint32_t *) 0xA0000000;
*pValue *= 2;
*pValue |= 0x00000001;
型在这种情况下,存储器位置将在每个指令 * 处改变,而 * 不必显式地写入值。
sqyvllje2#
1.可能你的优化器已经注意到value是一个自动变量,它的地址从来没有被取过,所以实际上忽略了它的volatile,因为它碰巧知道一些关于它运行的架构,并得出结论,一个符合标准的程序不能观察到它发生的读写顺序,即使标准说这是可观察的。显然,这对调试器不是很友好,但如果它发生了,我也不会感到惊讶。实际上,编译器会假设你不能“看到”堆栈,如果你使用调试器,检查核心转储,将堆栈标记为只读并处理结果信号等,这是假的。检查反汇编,看看multipy/shift和bit-set是否真的出现。1.可能是调试器没有正确跟踪值,原因可能是(1)或其他原因。
ylamdve63#
尝试将值写入另一个临时变量并检查该值。有时这会欺骗编译器/调试器做你想做的事情。volatile告诉编译器总是读取该值,如果它从未被读取,则不必保留它以供写入。
3条答案
按热度按时间wvyml7n51#
也许你的调试器实际上并不那么好。当我的一个工具似乎不正常时,我总是用另一个工具来检查它。
尝试用老式的方法调试,使用:
字符串
如果
printf
不可用,则使用其他输出方法(看起来您可能正在嵌入式空间中工作)。看看你得到了什么-我更倾向于相信
printf
-调试比调试器。如果您的问题不是与
value
有关,而是与0xA0000000
位置的内存有关,那么它正在按预期工作。您操作的是局部变量,而不是内存位置。你需要写回值,类似于:
型
然而,考虑到你使用的是volatile,你完全可能只是想要一个指向该位置的变量 * 指针 *,这样变化就会立即反映出来。
如果是这样的话,你需要的东西沿着:
型
在这种情况下,存储器位置将在每个指令 * 处改变,而 * 不必显式地写入值。
sqyvllje2#
1.可能你的优化器已经注意到
value
是一个自动变量,它的地址从来没有被取过,所以实际上忽略了它的volatile,因为它碰巧知道一些关于它运行的架构,并得出结论,一个符合标准的程序不能观察到它发生的读写顺序,即使标准说这是可观察的。显然,这对调试器不是很友好,但如果它发生了,我也不会感到惊讶。实际上,编译器会假设你不能“看到”堆栈,如果你使用调试器,检查核心转储,将堆栈标记为只读并处理结果信号等,这是假的。检查反汇编,看看multipy/shift和bit-set是否真的出现。1.可能是调试器没有正确跟踪值,原因可能是(1)或其他原因。
ylamdve63#
尝试将值写入另一个临时变量并检查该值。有时这会欺骗编译器/调试器做你想做的事情。volatile告诉编译器总是读取该值,如果它从未被读取,则不必保留它以供写入。