July 10th, 2019

Костерок

Как правильно эмулировать 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.