【问题标题】:Accessing typedef struct elements访问 typedef 结构元素
【发布时间】:2019-08-10 17:12:46
【问题描述】:

我已经声明了一个 tydef 结构,如下所示。

#define START_ADDR 0xXXXXX
typedef struct{
     uint32_t checksum;
     uint16_t index[len];
} block;

我使用以下语句更改了块的内存分配:

block *value = (block*) START__ADDR;

我也验证了内存分配的变化,没有问题。 现在我正在尝试使用

更新校验和的值
value->checksum=0xa5a5a5a5;

但是校验和的值是 0x00000000 并且没有更新为 0xa5a5a5a5。 谁能告诉我如何更改校验和的值。

提前致谢。

问候 维巴夫

【问题讨论】:

  • 请发minimal reproducible example,以便我们重现问题并帮助您调试
  • 如果您在 X86 处理器上运行上述代码,则无法写入像 0xXXXXX 这样的任意内存地址。您的代码导致 UB
  • @Achal 我在 ARM cortex M4 处理器上运行我的代码
  • 正如How to assign pointer address manually in C programming language? @crowder 引用的“任意地址必须是某种“知名地址”,这些通常是(尽管并非总是如此)只读
  • 这个地址在哪里,在 RAM 或闪存或其他类型的内存中?如果在闪存中,那么很可能需要使用特殊方法写入,不能使用简单赋值。

标签: c struct embedded cortex-m


【解决方案1】:

您不能像 RAM 那样写入闪存,仅此而已。 Flash 是 ROM。这就是为什么您在闪存中分配的所有变量都是/必须是const 限定的,这意味着只读。

可以更换闪存,您的零件可以为此目的配备专用的数据闪存/eeprom。但是写入内存的这些部分并不是编译器会为你做的事情。您需要自己编写一个闪存编程驱动程序。如题,需要学习手册+应用笔记中的flash编程部分。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多