LINUX.ORG.RU

gcc, задание размера структуры

 ,


1

2

В 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
Переменная ch, как и ожидалось, лежит в 2049-м байте.

Вопрос: возможно ли средствами gcc дополнить структуру нулями до 2048Б или 2049Б, чтобы она не заняла внезапно 4кБ?


Еще раз лучи ненависти тому, кто придумал, что без тегов нельзя.

☆☆☆☆☆

Ответ на: комментарий от mix_mix

Обалдеть! Спасибо!!!

А куда делась ch[0] на выводе? Размер всей структуры ровно 2048Б получился. На выходе

2045: 0
2046: 0
2047: 0
однако, саму ch[0] выводит... Странно.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от mix_mix

Спасибо. А в данном случае не выезжаю, т.к. фактически-то на компьютере по 4к выравнивание.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

однако, саму ch[0] выводит... Странно.

Вот этот код тоже работает. Ничего странного.

#include <stdio.h>
int main(void) {
  printf("%d\n", *(int *)0x400000);
  return 0;
}

i-rinat ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.