В STM32F103 нет EEPROM, а флеш умеет стираться только страницами по 1-2кБ. Поэтому мне нужно не только выравнять размер структуры данных, где хранятся все переменные, которые пользователь может изменять, но и ограничить ее размер двумя килобайтами, чтобы gcc не впихнул туда что-нибудь.
Парсить map-файл, чтобы выяснить размер кода и впихнуть в следующую страницу эту структуру (чтобы после нее наверняка ничего не было), мне совершенно не хочется.
Для начала я навелосипедил так (там малость устаревший вариант, правда: еще будет поле size, чтобы при обновлении все было ОК): задал выравненный по 2048Б массив (const) размером 2кБ, далее создал указатель на структуру и приравнял его этому массиву. Эта реализация плоха тем, что каждый раз после прошивки в случае изменения размера структуры приходится еще раз перезаписывать этот кусок флеша, копируя туда данные по умолчанию.
Сейчас балуюсь на компьютере (хоть и не ARM, но выравнивает-то так же). Пытаюсь создать "терминатор" — лишний 2049-й байт, который будет выходить за границы структуры, но я не буду его использовать. В итоге вроде бы структура должна иметь размер 2049, однако, почему-то получаю 4096:
#include <stdio.h>
struct {
int i;
double d;
char ch __attribute__ ((aligned(2048)));
} test __attribute__ ((aligned(2048)));
int main(){
int i;
unsigned char *ptr = (unsigned char*)&test;
size_t s = sizeof(test);
test.i = 10;
test.d = 1.5;
test.ch = 'a';
for(i = 0; i < s; i++){
printf("%d: %u\n", i,*ptr++);
}
printf("size: %zd\n", s);
return 0;
}
Последние строчки:
2044: 0
2045: 0
2046: 0
2047: 0
size: 2048
Вопрос: возможно ли средствами gcc дополнить структуру нулями до 2048Б или 2049Б, чтобы она не заняла внезапно 4кБ?
Еще раз лучи ненависти тому, кто придумал, что без тегов нельзя.