Емельянов Эдуард Владимирович (eddy_em) wrote in ru_radio_electr,
Емельянов Эдуард Владимирович
eddy_em
ru_radio_electr

Category:

Как правильно эмулировать EEPROM во флеш STM32?

Обычно занимают лишь одну страницу флеша, что кажется расточительным, особенно когда прошивка занимает 8кБ, а флеша 128кБ! Инициализирую так:
typedef struct{
	user_conf all_stored;
	char struct_end[0] __attribute__ ((aligned(FLASH_BLOCK_SIZE))); // this pointer provides size of structure multiple of page size
} flash_storage;

#define USERCONF_INITIALIZER  { \
	.userconf_sz = sizeof(user_conf)	\
    ,.id = "identifier" \
	,.dist_min = LIDAR_MIN_DIST			\
	,.dist_max = LIDAR_MAX_DIST			\
	}

static const flash_storage Flash_Storage __attribute__ ((aligned(FLASH_BLOCK_SIZE))) = {
	.all_stored = USERCONF_INITIALIZER
};

static const user_conf *Flash_Data = &Flash_Storage.all_stored;

И gcc помещает этот блок перед другими константами серии text. А мне нужно, чтобы он был последним и я мог использовать всю свободную память.

Ткните, пожалуйста, в примеры кода, где это реализуется правильно. Может, надо в линкере какую-то секцию указать и эту переменную с нужным смещением из линкера размещать?

P.S. Если кто знает ответ, можно себе увеличить карму на SO.
Subscribe
  • Post a new comment

    Error

    Comments allowed for members only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments