Arlleex 187 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 3 минуты назад, repstosw сказал: Не нравится объявление переменных после условия. Пока сделал объявление переменных в начале. Компиляция в C++ режиме? Тогда да, будет ругаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 3 minutes ago, Arlleex said: Компиляция в C++ режиме? Тогда да, будет ругаться. Си Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 8 минут назад, repstosw сказал: Спорное мнение. Ведь не спроста линуксописатели туда поставили __packed. Я весьма скептически отношусь к такого рода предположениям, т.к. повторюсь, авторитетных фигур в области программоделов лично у меня нет🙂 Цитата На счёт "если бы было..." - это фигня, потому что реалии говорят, что в приведённой структуре этого нет и не может быть, так как это регистры. Значит они должны быть кратны 4. Я уверен, что таким образом описанных структур периферии - не эта одна единственная. Будете их все просматривать? Цитата Как правильно сделать - прописать volatile каждому члену структуры? Или есть лучший способ? Тут универсального ответа я не дам - но с вероятностью 99% лучше сделать каждому члену volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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ты. Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Ну вот, как видите, в святом линуксе трусы через голову надевать не просто практикуют, но и делают это с особой любовью и периодичностью. А теперь представьте, что компилятор, видя обращение к packed-члену структуры, решил воспользоваться законным способом доступа к такому члену - побайтно. Т.е. для чтения u32 он создал бы 4 инструкции чтения байтов. Последствия такого доступа для volatile-регистров, думаю, объяснять не нужно. Но да, их макросы худо-бедно, но отработают правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 7 minutes ago, Arlleex said: Ну вот, как видите, в святом линуксе трусы через голову надевать не просто практикуют, но и делают это с особой любовью и периодичностью. Мне бы хотелось узнать причины, заставляющие их так делать. Другой альтернативы у меня нет: нет документации, приходится использовать Линукс в качестве донора. А рефакторить 100% их код в 100-500 исходниках - у меня нет желания и времени. P.S. Хотя есть способ. Препроцессинг в Си. Размотать макросы и выдать исходник без вложенных макросов. Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Насчет передачи управления по goto - после if() goto ...; делайте else и открывайте блок {...}. Видимо, компилятор не различает аналогичный по своей сути вид switch(x) { case 0: int x = 1; break; case 1: ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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; Изменено 15 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба Нет, else не пустые, а с продолжением кода ниже. Компилятору тут лишь важно, чтобы переменные были внутри блока инициализированы до момента, когда будет return. P. S. Избегайте множественных return. Уж если юзаете goto, то им переходите к выходу. P. S. Я щас с телефона, не удобно писать, поэтому с else {} чуть позже напишу, просто это ж такая очевидность очевидная🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 12 minutes ago, Arlleex said: P. S. Я щас с телефона, не удобно писать, поэтому с else {} чуть позже напишу, просто это ж такая очевидность очевидная🙂 Мне кажется, мой вариант с объявлениями переменных в начале тела функции - требует меньше всего телодвижений со стороны портирующего чужой код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 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__ дает текущий номер строки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 22 минуты назад, dimka76 сказал: Здесь у goto свой номер строки, а метки свой номер строки. __LINE__ дает текущий номер строки. Нет) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба On 10/15/2023 at 5:30 PM, Arlleex said: Нет) Чего нет ? Quote This macro expands to the current input line number Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 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 в блок {}. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 47 минут назад, dimka76 сказал: Здесь у goto свой номер строки, а метки свой номер строки. __LINE__ дает текущий номер строки. Вроде как там всего одна строка. Так как символ '\' - указывает, что это единая строка. После макроподстановки получится одна строка кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться