【问题标题】:Will a const variable in a structure go to RAM upon structure variable initialization?结构中的 const 变量会在结构变量初始化时进入 RAM 吗?
【发布时间】:2019-04-27 09:31:37
【问题描述】:

我需要一个面向对象的模型来存储一系列实体的一些参数。我正在 STM32 上开发一个嵌入式项目,我的 SRAM 不到 8kB。这些参数中的大多数都是常量,我希望它们保存在闪存中而不是 RAM 中。如果我声明一个带有 const 参数的结构,它们会在结构初始化时进入 RAM 吗?

【问题讨论】:

  • 可能,或者它们可能进入通常位于闪存段中的rodata部分。您的映射文件会告诉您,如果数据不在闪存段中,您可能必须与链接器对话(这是一个痛苦的练习,但您可能需要这样做)。

标签: c struct embedded constants stm32


【解决方案1】:

为了给编译器和链接器提供将对象(例如结构)放入闪存的最佳机会,请使用const 和静态存储持续时间对其进行定义。

要给它静态存储持续时间,请在任何函数之外或使用static 定义它。例如,如果你有struct foo,你可以定义它:

// Declared at global scope without "static":
//    Has static storage duration, external linkage.
const struct foo Parameters1 = { 3, 4 };

// Declared at global scope with “static":
//    Has static storage duration, internal linkage.
static const struct foo Parameters2 = { 5, 6 };

void foo(void)
{
    // Declared inside a function with "static".
    static const struct foo Parameters3 = { 7, 8 };
    …
}

这只会为对象提供它所需的属性——常量和静态存储持续时间——以允许编译器和链接器将其放入闪存中。他们是否这样做是这些工具的属性,因此您可能需要查阅他们的文档并使用命令行开关或这些工具的其他输入来为他们提供关于此的具体说明。

您可以将struct 的各个成员声明为const。但是,即使所有成员都声明为const,我也不一定希望编译器和链接器将其视为struct 声明为const

【讨论】:

  • 非常不精确。这是 uC 问题,const 对象的位置取决于 uC 架构。例如 AVR-s 会将它放在 RAM 中,因为 FLASH 访问需要特殊的机制。您可以强制编译器将其放置在 FLASH 中,但您需要使用特殊库 (PROGMEM) 或编译器扩展,如命名地址空间。其他一些哈佛 uC 根本不允许访问程序内存。
  • @P__J__ 这个问题专门针对 STM32,它是 ARM Cortex-M。
【解决方案2】:

这是非常具体的硬件和实现问题。

例如,许多哈佛架构会将其放在 RAM 中,因为可能无法访问 FLASH 或需要特殊方法。

ARM 等其他架构将其放置在 FLASH 存储器中,因为它们具有一个地址空间,并且可以直接访问程序存储器中的数据。

STM32 uC 是 Cortex 内核的,它将被放置在 FLASH 存储器中。即使对于复合或复杂数据类型,它也会被隔离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多