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

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

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

Не нравится объявление переменных после условия.  Пока сделал объявление переменных в начале.

Компиляция в C++ режиме? Тогда да, будет ругаться.

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


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

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

Спорное мнение.  Ведь не спроста линуксописатели туда поставили __packed.

Я весьма скептически отношусь к такого рода предположениям, т.к. повторюсь, авторитетных фигур в области программоделов лично у меня нет🙂
 

Цитата

На счёт "если бы было..." - это фигня, потому что реалии говорят, что в приведённой структуре этого нет и не может быть, так как это регистры. Значит они должны быть кратны 4.

Я уверен, что таким образом описанных структур периферии - не эта одна единственная. Будете их все просматривать?
 

Цитата

Как правильно сделать - прописать volatile каждому члену структуры?  Или есть лучший способ?

Тут универсального ответа я не дам - но с вероятностью 99% лучше сделать каждому члену volatile.

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


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

20 minutes ago, Arlleex said:

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

Ещё раз проглядел код. Он не нужен.  В линуховых сорцах все эти макросы сводятся к этим, где volatile указан:

#define __arch_getb(a)			(*(volatile unsigned char *)(a))
#define __arch_getw(a)			(*(volatile unsigned short *)(a))
#define __arch_getl(a)			(*(volatile unsigned int *)(a))
#define __arch_getq(a)			(*(volatile unsigned long long *)(a))

#define __arch_putb(v,a)		(*(volatile unsigned char *)(a) = (v))
#define __arch_putw(v,a)		(*(volatile unsigned short *)(a) = (v))
#define __arch_putl(v,a)		(*(volatile unsigned int *)(a) = (v))
#define __arch_putq(v,a)		(*(volatile unsigned long long *)(a) = (v))

Иначе, был бы получен неработающий линукс.

Типкасты. И ещё раз типкаcты.

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

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


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

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

А теперь представьте, что компилятор, видя обращение к packed-члену структуры, решил воспользоваться законным способом доступа к такому члену - побайтно.

Т.е. для чтения u32 он создал бы 4 инструкции чтения байтов. Последствия такого доступа для volatile-регистров, думаю, объяснять не нужно.

Но да, их макросы худо-бедно, но отработают правильно.

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


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

7 minutes ago, Arlleex said:

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

Мне бы хотелось узнать причины, заставляющие их так делать.   Другой альтернативы у меня нет:  нет документации, приходится использовать Линукс в качестве донора.

А рефакторить 100% их код в 100-500 исходниках - у меня нет желания и времени.

 

P.S. Хотя есть способ.  Препроцессинг в Си.  Размотать макросы и выдать исходник без вложенных макросов.

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

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


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

Насчет передачи управления по goto - после if() goto ...; делайте else и открывайте блок {...}.

Видимо, компилятор не различает аналогичный по своей сути вид

switch(x) {
  case 0:
    int x = 1;
    break;
  case 1:
    ...
}

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


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

28 minutes ago, Arlleex said:

Насчет передачи управления по goto - после if() goto ...; делайте else и открывайте блок {...}.

Если я правильно понял, то нижеперечисленное - не убирает предупреждения:

	if (c->luma_buffer == NULL)goto nomem;
        else {}

	if (c->bytestream_buffer == NULL)goto nomem;
        else {}

	unsigned int luma_size  =ALIGN((c->mb_width+1) * 16, 32) * ALIGN((c->mb_height+1) * 16, 32);
	unsigned int chroma_size=ALIGN( c->mb_width    * 16, 32) * ALIGN( c->mb_height    *  8, 32);

//...

	return c;

nomem:
	MSG("can't allocate VE memory\n");
	return NULL;

 

Поэтому объявил luma_size, chroma_size   в начале функции, в присвоения оставил том же месте. Предупреждение ушло:

	unsigned int luma_size,chroma_size;
//...
	
    if (c->luma_buffer == NULL)goto nomem;

	if (c->bytestream_buffer == NULL)goto nomem;

	  luma_size  =ALIGN((c->mb_width+1) * 16, 32) * ALIGN((c->mb_height+1) * 16, 32);
	  chroma_size=ALIGN( c->mb_width    * 16, 32) * ALIGN( c->mb_height    *  8, 32);

//...

	return c;

nomem:
	MSG("can't allocate VE memory\n");
	return NULL;

 

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

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


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

Нет, else не пустые, а с продолжением кода ниже. Компилятору тут лишь важно, чтобы переменные были внутри блока инициализированы до момента, когда будет return.

P. S. Избегайте множественных return. Уж если юзаете goto, то им переходите к выходу.

P. S. Я щас с телефона, не удобно писать, поэтому с else {} чуть позже напишу, просто это ж такая очевидность очевидная🙂

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


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

12 minutes ago, Arlleex said:

P. S. Я щас с телефона, не удобно писать, поэтому с else {} чуть позже напишу, просто это ж такая очевидность очевидная🙂

Мне кажется, мой вариант с объявлениями переменных в начале тела функции - требует меньше всего телодвижений со стороны портирующего чужой  код.

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


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

On 10/15/2023 at 1:29 PM, Arlleex said:

А такой?

#define TTT(x) \
{                                    \
  int y;                             \
  concat2(__m, __LINE__):            \
  y=test(x);                         \
  if(y) goto concat2(__m, __LINE__); \
  printf("%d\n",y);                  \
}

Здесь у goto свой номер строки, а метки свой номер строки. __LINE__ дает текущий номер строки.

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


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

22 минуты назад, dimka76 сказал:

Здесь у goto свой номер строки, а метки свой номер строки. __LINE__ дает текущий номер строки.

Нет)

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


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

On 10/15/2023 at 5:30 PM, Arlleex said:

Нет)

Чего нет ?

Quote

This macro expands to the current input line number

 

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


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

2 часа назад, repstosw сказал:
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);

Пишет, что якобы член структуры  не выровнен:

Нет, он пишет, что передаёте невыровненный адрес туда, где видимо ожидается выровненный. Покажите объявление функции. Видимо оно неверное.

2 часа назад, Arlleex сказал:

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

Почему? Вроде всё ок. Разве что __packed должен быть перед struct (хотя не уверен что это важно).

2 часа назад, repstosw сказал:
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;

Не нравится объявление переменных после условия.  Пока сделал объявление переменных в начале.

Можно просто обернуть инит luma_size в блок {}.

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


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

47 минут назад, dimka76 сказал:

Здесь у goto свой номер строки, а метки свой номер строки. __LINE__ дает текущий номер строки.

Вроде как там всего одна строка. Так как символ '\' - указывает, что это единая строка. После макроподстановки получится одна строка кода.

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


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

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

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

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

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

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

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

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

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

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