Как понять куда размещена переменная const в область флешь или озу

Написал структуру такого типа:

typedef struct {
    const char name[20];
    const char textExtension[4];
    const uint32_t size;
    const uint32_t date;
    const uint32_t time;
    const uint32_t adrr;
    const uint32_t crc;
    const uint32_t reserve[5];
} headerFileList[256];

Все переменные const. Как понимаю должны быть размещены только во флешь, но как в этом убедиться, что они гарантированно там? Мне нужно только читать данные поля структуры, писать туда ничего не нужно.


Ответы (2 шт):

Автор решения: Yaroslav

В компиляторе gcc есть стандартные атрибуты section ("section-name")

struct s_header_file_list{
    char name[20];
    char textExtension[4];
    uint32_t size;
    uint32_t date;
    uint32_t time;
    uint32_t adrr;
    uint32_t crc;
    uint32_t reserve[5];
};
 
struct s_header_file_list[256] __attribute__ ((section ("FLASH"))) = {0};

В файле линковки *.ld нужно указать в каком адресном пространстве находится секция FLASH

→ Ссылка
Автор решения: AlexGlebe

Можно сделать массив константных структур, и этот массив будет в секции только для чтения. Тогда скорее всего, память лишняя выделяться не будет. И данные будут храниться только в кеше системы.

# include <stdint.h>

typedef struct headerFile headerFile  ;

struct headerFile {
    char name[20];
    char textExtension[4];
    uint32_t size;
    uint32_t date;
    uint32_t time;
    uint32_t adrr;
    uint32_t crc;
    uint32_t reserve[5];
} ;

headerFile const headerFileArray [ 256 ] =
  {{"n","t",0,0,0,0,0,{0}}};

# include <stdio.h>

int main(){
  printf("headerFileArray[0].name=%s\n",headerFileArray[0].name);
  (*(char*)&(headerFileArray[0].name[0]))=0;
}

В ассемблере смотрим, вроде RO :

 ...
 .globl headerFileArray
 .section   .rodata
 .align 32
 .type  headerFileArray, @object
 .size  headerFileArray, 16384
headerFileArray:
 .string    "n"
 ...

проверка :

headerFileArray[0].name=n
Ошибка сегментирования (стек памяти сброшен на диск)

Проверил только через gcc компилятор. Как ведёт себя eclipse - не знаю. Надо вам самим проверять.

→ Ссылка