【发布时间】:2019-11-24 22:34:16
【问题描述】:
我认为应该很简单:
uint32_t getCrc(void)
{
uint32_t expectedCrc = *(uint32_t*)0x27FF0;
return expectedCrc;
}
那么expectedCrc应该等于0xECD8743D
但令人惊讶的是,值是:0x82828282
我尝试定义一个指向uint32_t 的指针并将内存地址分配给它,如下所示:
uint32_t getCrc(void)
{
uint32_t *ptr = (uint32_t*)0x27FF0;
uint32_t expectedCrc = *ptr;
return expectedCrc;
}
但是指针本身的值是0xFFFF和expectedCrc等于0x82828282
我在不同的内存地址中找到了这两个值:
我也对char *ptr = (char*)0x27FF0 进行了同样的尝试,但它给出了相同的值。
最后,我尝试使用 uint8_t size = sizeof(char*); 检查此控制器中指向 char 的指针的大小,答案是 0xb0,等于 176。
我认为这与 24 位内存地址和 CPU 架构有关。我正在开发stm8 控制器。
有人能解释一下为什么会这样吗?
更新
我尝试用0xFFF0 替换地址0x27FF0,它工作正常。所以问题出在长地址上。我想在最后一个地址中写入 CRC 值,以避免在程序变大时用代码本身覆盖它。我该如何处理?
【问题讨论】:
-
看起来,环境只支持 16 位整数。
-Wall没有编译器警告吗?uint32_t *ptr = (uint32_t*)0x27FF0LLU有什么不同吗? -
当你访问 flash 时,你应该添加 volatile 关键字
uint32_t expectedCrc = *(volatile uint32_t*)0x27FF0;但我不确定这会解决你的问题。 -
感谢您的回复。我尝试了选项
-Wall,但它是未知的。我正在使用Cosmic。但是我启用了警告并且没有关于此功能的信息。我试过LLU,它显示bad integer constant,只有U它编译但没有任何区别。我也试过volatile,但没有区别。 -
什么架构?许多 8 位微处理器的编译器需要对指针进行特殊处理以适应不同的寻址模式和功能(它们具有可变宽度指针)。我假设 STM8 给了你其他问题,但它确实与问题相关,需要说明。与您的其他问题一样,答案在手册中(
@far指针)和对架构的理解。
标签: c pointers memory embedded