Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 3 минуты назад, jcxz сказал: Не только. См. мой пример. У IAR только __packed? А как задается выравнивание на заданную границу? Цитата Возможно? Да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 1 минуту назад, Arlleex сказал: У IAR только __packed? А как задается выравнивание на заданную границу? #define __align2 __attribute__ ((aligned (2))) #define __align4 __attribute__ ((aligned (4))) #define __align8 __attribute__ ((aligned (8))) #define __align16 __attribute__ ((aligned (16))) #define __align32 __attribute__ ((aligned (32))) #define __align64 __attribute__ ((aligned (64))) #define __align128 __attribute__ ((aligned (128))) #define __align256 __attribute__ ((aligned (256))) u8 x __align8; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 6 minutes ago, jcxz said: Не только. См. мой пример. 6 minutes ago, jcxz said: Возможно? Я же говорю, что в GCC - НЕТ! ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Только что, repstosw сказал: Я же говорю, что в GCC - НЕТ! ))) __packed нет в GCC, но есть три других ключевых слова, которые с лихвой покрывают вообще все необходимые возможности. Осталось выяснить, как IAR-у сказать размещать с нужным выравниванием... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 1 минуту назад, Arlleex сказал: __packed нет в GCC, но есть три других ключевых слова, которые с лихвой покрывают вообще все необходимые возможности. Всё-таки интересно было бы увидеть код, который сгенерится для ядра, не поддерживающего аппаратно выравнивание при чтении/записи такой переменной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 7 минут назад, jcxz сказал: Всё-таки интересно было бы увидеть код, который сгенерится для ядра, не поддерживающего аппаратно выравнивание при чтении/записи такой переменной. Сформируйте небольшой тест, который Вас интересует. Я поменяю компиляторо-зависимые вещи и скомпилирую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба Ещё прикол от ИАРа. Объявление структуры: #define __packed __attribute__ ((packed)) struct __packed sunxi_prcm_reg { u32 cpus_cfg; /* 0x000 */ u8 res0[0x8]; /* 0x004 */ u32 apb0_ratio; /* 0x00c */ u32 cpu0_cfg; /* 0x010 */ u32 cpu1_cfg; /* 0x014 */ u32 cpu2_cfg; /* 0x018 */ u32 cpu3_cfg; /* 0x01c */ u8 res1[0x8]; /* 0x020 */ u32 apb0_gate; /* 0x028 */ u8 res2[0x14]; /* 0x02c */ u32 pll_ctrl0; /* 0x040 */ u32 pll_ctrl1; /* 0x044 */ u8 res3[0x8]; /* 0x048 */ //... }; Вот здесь: void clock_init_safe(void) { struct sunxi_prcm_reg * const prcm = (struct sunxi_prcm_reg *)SUNXI_PRCM_BASE; /* Set PLL ldo voltage without this PLL6 does not work properly */ clrsetbits_le32(&prcm->pll_ctrl1, PRCM_PLL_CTRL_LDO_KEY_MASK, (unsigned)PRCM_PLL_CTRL_LDO_KEY); Пишет, что якобы член структуры не выровнен: Quote Warning[Pa039]: use of address of unaligned structure member clock_sun6i.c 37 Вроде выровнен - адрес кратен 4. Или я невнимателен? Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 5 минут назад, repstosw сказал: Ещё прикол от ИАРа. Объявление структуры: #define __packed __attribute__ ((packed)) struct __packed sunxi_prcm_reg { u32 cpus_cfg; /* 0x000 */ u8 res0[0x8]; /* 0x004 */ u32 apb0_ratio; /* 0x00c */ u32 cpu0_cfg; /* 0x010 */ u32 cpu1_cfg; /* 0x014 */ u32 cpu2_cfg; /* 0x018 */ u32 cpu3_cfg; /* 0x01c */ u8 res1[0x8]; /* 0x020 */ u32 apb0_gate; /* 0x028 */ u8 res2[0x14]; /* 0x02c */ u32 pll_ctrl0; /* 0x040 */ u32 pll_ctrl1; /* 0x044 */ u8 res3[0x8]; /* 0x048 */ //... }; Вот здесь: void clock_init_safe(void) { struct sunxi_prcm_reg * const prcm = (struct sunxi_prcm_reg *)SUNXI_PRCM_BASE; /* Set PLL ldo voltage without this PLL6 does not work properly */ clrsetbits_le32(&prcm->pll_ctrl1, PRCM_PLL_CTRL_LDO_KEY_MASK, (unsigned)PRCM_PLL_CTRL_LDO_KEY); Пишет, что якобы член структуры не выровнен: Вроде выровнен - адрес кратен 4. Или я невнимателен? struct __packed sunxi_prcm_reg * не то же самое, что struct sunxi_prcm_reg *. Это первое. А второе - __packed тут зачем? Как раз им все испортили - уменьшили естественные выравнивания типов к 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 6 minutes ago, Arlleex said: struct __packed sunxi_prcm_reg * не то же самое, что struct sunxi_prcm_reg *. Если сделать так, то предупреждение не уходит: Quote struct __packed sunxi_prcm_reg * const prcm = (struct __packed sunxi_prcm_reg *)SUNXI_PRCM_BASE; Всё ясно. Надо убрать дефайн GCC и сделать так: __packed struct sunxi_prcm_reg { u32 cpus_cfg; /* 0x000 */ u8 res0[0x8]; /* 0x004 */ u32 apb0_ratio; /* 0x00c */ u32 cpu0_cfg; /* 0x010 */ u32 cpu1_cfg; /* 0x014 */ //... Тогда предупреждений нет. И не надо в функции постоянно писать __packed Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 3 минуты назад, repstosw сказал: Если сделать так, то предупреждение не уходит: Ну да, это я погорячился - обратите внимание на вторую часть моего предложения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 9 minutes ago, Arlleex said: А второе - __packed тут зачем? Как раз им все испортили - уменьшили естественные выравнивания типов к 1. Это к линуксописателям. 🤣 проблема решена: https://electronix.ru/forum/index.php?/topic/171952-компилятор-iar-85-си-не-дает-ошибку/&do=findComment&comment=1881951 Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 7 минут назад, repstosw сказал: Всё ясно. Надо убрать дефайн GCC и сделать так: __packed struct sunxi_prcm_reg { u32 cpus_cfg; /* 0x000 */ u8 res0[0x8]; /* 0x004 */ u32 apb0_ratio; /* 0x00c */ u32 cpu0_cfg; /* 0x010 */ u32 cpu1_cfg; /* 0x014 */ //... Тогда предупреждений нет. И не надо в функции постоянно писать __packed Нет, это некорректное описание структуры. Вам просто повезло, что резервные массивы делятся на 4 нацело, а регистры все u32. __packed нужно убрать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 6 minutes ago, Arlleex said: __packed нужно убрать. Полагаю, что нельзя __packed здесь убирать. Эта структура мэпится на MMIO - дырок между членами структуры быть не должно 6 minutes ago, Arlleex said: Нет, это некорректное описание структуры. А как корректное? 6 minutes ago, Arlleex said: . Вам просто повезло, что резервные массивы делятся на 4 нацело, а регистры все u32. Они и должны делиться на 4. И их никто не читает. Они неинтересны. Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 11 минут назад, repstosw сказал: А как корректное? Без __packed. С __packed натуральные выравнивания членов структуры сбиваются в 1, и если бы где-то было заполнение (резервный массив padding-а) не кратное 4 байтам, все последующие u32-регистры шли бы, мало того, что с не тем адресом, но еще и невыровненным (на Вашем CPU получили бы DataAbortHandler()). А раз еще и Цитата Эта структура мэпится на MMIO... то volatile тоже где-то по дороге потерялись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба Вот ещё одно тупое предупреждение. Код: c->luma_buffer = ve_malloc(c->input_buffer_size); if (c->luma_buffer == NULL) goto nomem; c->bytestream_buffer_size = 3 /*1*/ * 1024 * 1024; c->bytestream_buffer = ve_malloc(c->bytestream_buffer_size); if (c->bytestream_buffer == NULL) goto nomem; unsigned int luma_size =ALIGN(c->mb_width * 16, 32) * ALIGN(c->mb_height * 16, 32); unsigned int chroma_size=ALIGN(c->mb_width * 16, 32) * ALIGN(c->mb_height * 8, 32); //... nomem: printf("no mem. bye-bye...\n"); return; Не нравится объявление переменных после условия. Пока сделал объявление переменных в начале. Quote Warning[Pe546]: transfer of control bypasses initialization of: h264enc.c 307 variable "luma_size" (declared at line 321) 9 minutes ago, Arlleex said: Без __packed. С __packed натуральные выравнивания членов структуры сбиваются в 1, и если бы где-то было заполнение (резервный массив padding-а) не кратное 4 байтам, все последующие u32-регистры шли бы, мало того, что с не тем адресом, но еще и невыровненным (на Вашем CPU получили бы DataAbortHandler()). Спорное мнение. Ведь не спроста линуксописатели туда поставили __packed. На счёт "если бы было..." - это фигня, потому что реалии говорят, что в приведённой структуре этого нет и не может быть, так как это регистры. Значит они должны быть кратны 4. 9 minutes ago, Arlleex said: то volatile тоже где-то по дороге потерялся. Да. Я удивлён. Как правильно сделать - прописать volatile каждому члену структуры? Или есть лучший способ? Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться