【问题标题】:Reading value from memory location (with 24-bit address) in 8-bit microcontroller从 8 位微控制器中的内存位置(使用 24 位地址)读取值
【发布时间】: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;
}

但是指针本身的值是0xFFFFexpectedCrc等于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


【解决方案1】:

来自 Cosmic 编译器数据表 https://www.cosmic-software.com/pdf/cxstm8_pd.pdf

cxstm8 根据应用程序的大小提供 2 种不同的内存模型。

对于小于 64k 的应用程序,“section 0”内存模型通过默认函数调用和指向 2 个字节的指针来提供最佳代码密度。

对于大于 64k 的应用程序,标准内存模型为轻松使用线性寻址空间提供了最佳灵活性。每个模型都有自己的一组库。

这可能是您的问题的原因。如果要直接访问16位以上地址的内存位置,需要使用正确的内存模型。

【讨论】:

    【解决方案2】:

    @Raje 回答说它是关于内存模型的,我在 COSMIC 用户指南 中进一步阅读,发现以下内容:

    STM8 编译器支持两种内存模型供应用 大于 64K,让您选择最高效的行为 取决于您的处理器配置和您的应用程序。全部 这些模型允许代码大于 64K 然后运行 指针默认为@far 指针(3 个字节)。数据指针是 默认为@near 指针(2 字节),除非明确声明 @far 修饰符。

    因此,解决方案是将@far 添加到指针的类型中,如下所示:

    uint32_t calculatedCrc = 0;
    
    expectedCrc = *(@far uint32_t*)0x27FF0;
    

    问题解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2011-04-18
      相关资源
      最近更新 更多