Как понять куда размещена переменная 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 шт):
В компиляторе 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
Можно сделать массив константных структур, и этот массив будет в секции только для чтения. Тогда скорее всего, память лишняя выделяться не будет. И данные будут храниться только в кеше системы.
# 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 - не знаю. Надо вам самим проверять.