【问题标题】:memory assignment for a structure with constant member具有常量成员的结构的内存分配
【发布时间】:2013-06-25 03:37:59
【问题描述】:

我正在用 C 语言编写嵌入式系统,我定义了一个包含两个常量成员“val”和“ptr”的结构。

typedef struct{
const u8 val;
u8 *const ptr;
}TEST;

如果我将这种类型变量声明为全局变量,该变量是放在 ROM 中还是 RAM 中?

TEST var;

谢谢

【问题讨论】:

  • 为什么要存储在ROM中。内存分配在堆栈或堆中!!!请提及您使用的语言,因为内存分配因语言而异。
  • 我正在用c语言编写嵌入式系统,我知道如果声明“u8 var”,所有变量都将放在RAM中,如果声明“const u8 var”,则放在ROM中。但是我不确定当我声明一个如上所述的全局结构变量时,具有常量成员的结构是否会将其成员放在 RAM 或 ROM 中。谢谢。
  • 请在问题中添加适当的标签,以便适当的人指导您。
  • 这取决于您的系统——阅读手册。初始化变量后,您将无法修改 TEST.ptr,因此它将始终为空指针(因为您没有提供任何显式初始化,所以它全为零)。这可能不是你的想法。变量不应该在 ROM 中; TEST.val 可以在运行时修改。你的编译器可能有其他想法...
  • 由于您必须依赖于您的结构的完整实例可通过单个指针访问这一事实,因此您的 const 成员至少必须在与 const 成员相同的内存区域中可访问。为此,我假设如果一个成员在 ROM 中而另一个成员在 RAM 中,则内存管理器(如果有的话)不够聪明,无法确保正确的访问地址。

标签: c variables embedded system structure


【解决方案1】:

TEST 实例需要进入读/写内存 - TEST 实例是非常量的,即使它的所有成员都是 const。 GCC 会将结构发送到可读写的 .data 中,链接描述文件应将其放入适当的内存类型中。

C 中的'const' 并不能保证存储确实是不可变的 - 它只意味着严格按照 C 标准执行的程序不会修改 'const' 项。

如果您希望数据进入 ROM,那么您需要一个合适的链接描述文件,将 .rodata 部分放入 ROM。

【讨论】:

  • 我会在这个体面的答案中添加两件事。一个是在源代码中您需要使用编译器特定的关键字(例如带有 gcc 的“属性部分”)来使变量进入链接描述文件中定义的适当部分,另一个可能是“const”的作用应该澄清一下。例如,通常您可以将指向 const 的指针传递给不应修改内容的函数,并且“const volatile”明显的矛盾修饰法也值得一提。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2021-06-04
  • 2012-11-22
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多