Как инициализировать структуру во flash во время компиляции? - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над проектом встроенного C и хотел бы во время компиляции инициализировать структуру, которая хранится во flash (0x1200u), но я продолжаю получать странные ошибки компиляции.

typedef struct {
    float foo[2];
    ...other stuff...
} MY_STRUCT_DATA_TYPE

#define MY_FLASH_STRUCT    ((MY_STRUCT_DATA_TYPE *)(0x1200u)) // <-- error here

MY_FLASH_STRUCT MY_InitdStruct = {
        .foo[0] =  0.12345f;
        .foo[1] =  0.54321f;
        ...other stuff...
};

Ошибка, которую я получаю: " Ожидается" {"До" ("Маркер ." Кто-нибудь знает, как заставить это работать?

Обновление

Добавлено в файл компоновщика ...

MEMORY
{
  ... other stuff ...
  m_my_data_section    (RW)  : ORIGIN = 0x00001200, LENGTH = 0x00000400
  ... other stuff ...
}

SECTIONS
{
  ... other stuff ..
  .my_data_section :
  {
    . = ALIGN(4);
    KEEP(*(.my_data_section))
    . = ALIGN(4);
  } > m_my_data_section
  ... other stuff ...
}

код C ...

static volatile const MY_STRUCT_DATA_TYPE __attribute__ ((section (".my_data_section"))) MY_InitdStruct = {
        .foo[0] =  0.12345f;
        .foo[1] =  0.54321f;
        ...other stuff...
};

Я не уверен, что ключевые слова static или const необходимы, поскольку они предназначены только для одноразового использования для инициализации этого раздела флэш-памяти во время компиляции, но это не повредит ограничить использование этикетки.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

В приведенном вами примере ";" отсутствует после объявления MY_STRUCT_DATA_TYPE

typedef struct {
    float foo[2];
    ...other stuff...
} MY_STRUCT_DATA_TYPE;

Если это не ошибка копирования / вставки, это ошибка, которая может привести к типу сообщения об ошибке, которое у вас есть

0 голосов
/ 09 мая 2018

Я работаю над проектом встроенного Си и хотел бы инициализировать время компиляции, структура, которая хранится во флэш-памяти (0x1200u), но я продолжайте получать странные ошибки компиляции.

Это неудивительно, поскольку C не поддерживает то, что вы пытаетесь сделать. Вы можете предоставить инициализаторы для объектов, которые C выделяет, включая указатели, но язык C не имеет понятия об объектах, которые существуют независимо. Действительно, C не дает никаких гарантий относительно того, что происходит, когда вы что-либо делаете с (MY_STRUCT_DATA_TYPE *)(0x1200u), кроме преобразования его обратно в целое число.

Ошибка, которую я получаю: " Ожидается" {"до" ("токен. "

Компилятор жалуется, потому что в

MY_FLASH_STRUCT MY_InitdStruct = {

, расширение MY_FLASH_STRUCT не является типом, поэтому конструкция не является допустимым объявлением. Это также не допустимое присваивание, но даже если это так, операторы присваивания являются исполняемыми и поэтому могут появляться только внутри функций.

Назначение объекта по определенному адресу будет функцией компоновщика. Можно ли назначить объект конкретному адресу, который вы хотите, зависит от системы, и механизм, если таковой имеется, зависит от вашей цепочки инструментов.

0 голосов
/ 09 мая 2018

Это не имеет никакого смысла, синтаксически это так.

Что вам нужно сделать, так это выяснить, как ваш компилятор поддерживает это, поскольку это не то, что вы можете сделать с помощью обычного C.

В GCC вы используете __attribute(), чтобы поместить символ в определенный сегмент, а затем с помощью сценария компоновщика, чтобы поместить этот сегмент в определенный фрагмент фактической памяти.

Или просто дайте вашему компилятору воспользоваться преимуществом сомнения и попробуйте структуру static const, которая должна оказаться во флэш-памяти.

...