Будет ли переменная const в структуре переходить в RAM после инициализации структурной переменной? - PullRequest
1 голос
/ 27 апреля 2019

Мне нужна объектно-ориентированная модель для хранения некоторых параметров ряда сущностей. Я работаю над встроенным проектом на STM32, и у меня меньше 8 КБ SRAM. Большинство этих параметров являются константами, и я хочу, чтобы они сохранялись во флэш-памяти вместо оперативной памяти. Если я объявлю структуру с параметрами const, они перейдут в ОЗУ после инициализации структуры?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2019

Это вопрос, касающийся аппаратного обеспечения и реализации.

Например, многие гарвардские архитектуры будут помещать его в ОЗУ, поскольку доступ к FLASH может быть невозможен или требовать специальных средств.

Другоетакие архитектуры, как ARM, поместят его во флэш-память, поскольку они имеют одно адресное пространство, и могут напрямую загружать данные в память программ.

STM32 uC являются ядрами Cortex и будут помещены во флэш-память.Это распространяется даже на составные или сложные типы данных.

3 голосов
/ 27 апреля 2019

Чтобы дать компилятору и компоновщику наилучшую возможность поместить объект (например, структуру) во флэш-память, определите его с помощью 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.

...