结构变量初始化后,结构中的const变量会进入RAM吗?

时间:2019-04-27 09:31:37

标签: c struct embedded const stm32

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

2 个答案:

答案 0 :(得分:3)

要给编译器和链接器最好的机会将对象(例如结构)放入闪存,请使用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的{​​{1}}一样对待。

答案 1 :(得分:3)

这是非常关于硬件和实现的问题。

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

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

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