Может, чтобы не плодить прошивки, при старте грузить промежуточный загрузчик? Он смотрит, если есть корректный образ OTA в верхних адресах, то его переписывает, в противном случае запускает App.После загрузки новой прошивки по OTA по адресам выше, оно и будет запускаться, но базовая останется
Не обязательно. Зависит от архитектуры. Кажется M0 позволяет загружать невыровненные 4-х байтные слова.При __attribute__((packed)) он uint32_t будет загружать побайтно, не смотря на выровненность адреса.
Да пофиг на архитектуру - создавайте сами структуры только с выровненными адресами переменных. Это упрощает работу с ними в других системах. Но вот лишние байты в конце, если структура {uint32 x; uint8 b} тут всё нарушают. И вместо 5 байт выходит 8-мь.Не обязательно. Зависит от архитектуры. Кажется M0 позволяет загружать невыровненные 4-х байтные слова.
#pragma pack()
struct {
uint8_t sz;
uint32_t val;
} aaa;
#pragma pack()
aaa.sz = 1;
11020d6e: 2101 movs r1, #1
11020d70: 4a0d ldr r2, [pc, #52] @ (11020da8 <read_sensor+0x9c>)
11020d72: 7011 strb r1, [r2, #0]
aaa.val = _r32;
11020d74: 7053 strb r3, [r2, #1]
11020d76: 1851 adds r1, r2, r1
11020d78: 0a1a lsrs r2, r3, #8
11020d7a: 704a strb r2, [r1, #1]
11020d7c: 2200 movs r2, #0
11020d7e: 0e1b lsrs r3, r3, #24
11020d80: 708a strb r2, [r1, #2]
11020d82: 70cb strb r3, [r1, #3]
Это сделано, чтобы в случае массива из этих структур выравнивание не нарушалось.Но вот лишние байты в конце, если структура {uint32 x; uint8 b} тут всё нарушают. И вместо 5 байт выходит 8-мь.
Где тут не выровнено?Это сделано, чтобы в случае массива из этих структур выравнивание не нарушалось.
Что-то слишком большая разница.-fpack-struct - text на 12 килобайт больше
Наоборот тоже пробовал, еслиТак делать не нужно:
#pragma pack(1)
, то sizeof=5, но доступ побайтный. В противном случае sizeof=8Где тут не выровнено?
#pragma pack(1)
struct {
uint32_t val;
uint8_t sz;
} aaa[2];
aaa[1].val
окажется невыровненным.Я не Ардуинщик и не собираюсь составлять из нечетных по размеру структур массивы.Это сделано, чтобы в случае массива из этих структур выравнивание не нарушалось.
void test(void) {
struct {
uint32_t a;
uint8_t b;
}x1;
struct {
uint32_t a;
uint8_t b;
}x2;
x1.a = 1;
x1.b = 2;
x2.a = 1;
x2.b = 2;
if (!memcmp(&x1, &x2, sizeof(x1)))
return;
LOG("BAG/BAD GCC! %u,%u != %u,%u\n", x1.a, x1.b, x2.a, x2.b);
}
BAG/BAD GCC! 1,2 != 1,2
Массивы значит?aaa[1].val
окажется невыровненным.
void test(void) {
struct {
uint32_t a;
uint8_t b;
}x[2];
x[0].a = 1;
x[0].b = 2;
x[1].a = 1;
x[1].b = 2;
if (!memcmp(&x[0], &x[1], sizeof(x[0])))
return;
LOG("BAG/BAD GCC! %u,%u != %u,%u\n", x[0].a, x[0].b, x[1].a, x[1].b);
}
BAG/BAD GCC! 1,2 != 1,2
АгаМассивы значит?
void test(void) {
struct {
uint32_t a;
uint8_t b;
}x[2];
memset(x, 0, sizeof(x));
x[0].a = 1;
x[0].b = 2;
x[1].a = 1;
x[1].b = 2;
if (!memcmp(&x[0], &x[1], sizeof(x[0])))
return;
LOG("BAG/BAD GCC! %u,%u != %u,%u\n", x[0].a, x[0].b, x[1].a, x[1].b);
}
-munaligned-access
к ключам компиляции, gcc начал выдавать warning: target CPU does not support unaligned accesses
.