Перейти к содержанию
    

Компилятор IAR 8.5 Си не дает ошибку

3 минуты назад, jcxz сказал:

Не только. См. мой пример.

У IAR только __packed? А как задается выравнивание на заданную границу?
 

Цитата

Возможно?

Да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, jcxz said:

Не только. См. мой пример.

6 minutes ago, jcxz said:

Возможно?

Я же говорю, что в GCC - НЕТ! )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, repstosw сказал:

Я же говорю, что в GCC - НЕТ! )))

__packed нет в GCC, но есть три других ключевых слова, которые с лихвой покрывают вообще все необходимые возможности.

Осталось выяснить, как IAR-у сказать размещать с нужным выравниванием...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Arlleex сказал:

__packed нет в GCC, но есть три других ключевых слова, которые с лихвой покрывают вообще все необходимые возможности.

Всё-таки интересно было бы увидеть код, который сгенерится для ядра, не поддерживающего аппаратно выравнивание при чтении/записи такой переменной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, jcxz сказал:

Всё-таки интересно было бы увидеть код, который сгенерится для ядра, не поддерживающего аппаратно выравнивание при чтении/записи такой переменной.

Сформируйте небольшой тест, который Вас интересует.

Я поменяю компиляторо-зависимые вещи и скомпилирую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё прикол от ИАРа.

Объявление структуры:

#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.   Или я невнимателен?

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, repstosw сказал:

Если сделать так, то предупреждение не уходит:

Ну да, это я погорячился - обратите внимание на вторую часть моего предложения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Arlleex said:

А второе - __packed тут зачем? Как раз им все испортили - уменьшили естественные выравнивания типов к 1.

Это к линуксописателям. 🤣

 проблема решена:

https://electronix.ru/forum/index.php?/topic/171952-компилятор-iar-85-си-не-дает-ошибку/&do=findComment&comment=1881951

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 нужно убрать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, Arlleex said:

__packed нужно убрать.

Полагаю, что нельзя __packed здесь убирать.  Эта структура мэпится на MMIO - дырок между членами структуры быть не должно

6 minutes ago, Arlleex said:

Нет, это некорректное описание структуры.

А как корректное?

6 minutes ago, Arlleex said:

. Вам просто повезло, что резервные массивы делятся на 4 нацело, а регистры все u32.

Они и должны делиться на 4. И их никто не читает. Они неинтересны.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, repstosw сказал:

А как корректное?

Без __packed. С __packed натуральные выравнивания членов структуры сбиваются в 1, и если бы где-то было заполнение (резервный массив padding-а) не кратное 4 байтам, все последующие u32-регистры шли бы, мало того, что с не тем адресом, но еще и невыровненным (на Вашем CPU получили бы DataAbortHandler()).

А раз еще и

Цитата

Эта структура мэпится на MMIO...

то volatile тоже где-то по дороге потерялись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот ещё одно тупое предупреждение. Код:

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 каждому члену структуры?  Или есть лучший способ?

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...