Kabdim 0 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба Не смогу, я из армии приверженцев гнутым компиляторам. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 25 минут назад, Kabdim сказал: Не смогу, я из армии приверженцев гнутым компиляторам. :) Вот чего удалось добиться: Спойлер union __attribute__ ((aligned (4))) AdcFastData1 { struct { u16 ampU; u16 ampV; u16 ampW; u16 voltH; //UQ0.16 }; u16 raw[4]; u32 raw32[2]; }; void AdcAvgFastData(AdcFastData1 const *src, AdcFastData1 *dst, uint cnt) { if (!cnt) return; u32 u = 0, v = 0, w = 0, h = 0, j; do { j = src->raw32[0]; u += (u16)j; v += j >> 16; j = src->raw32[1]; w += (u16)j; h += j >> 16; src++; } while (--cnt); dst->ampU = (u << 2) / cnt; dst->ampV = (v << 2) / cnt; dst->ampW = (w << 2) / cnt; dst->voltH = (h << 2) / cnt; } Результат: Спойлер ... 455 do { 456 j = src->raw32[0]; \ ??AdcAvgFastData_1: (+1) \ 0000000E 0xF850 0x7B04 LDR R7,[R0], #+4 457 u += (u16)j; \ 00000012 0xFA15 0xF587 UXTAH R5,R5,R7 458 v += j >> 16; \ 00000016 0xEB06 0x4617 ADD R6,R6,R7, LSR #+16 459 j = src->raw32[1]; \ 0000001A 0xF850 0x7B04 LDR R7,[R0], #+4 460 w += (u16)j; 461 h += j >> 16; 462 src++; 463 } while (--cnt); \ 0000001E 0x1E52 SUBS R2,R2,#+1 \ 00000020 0xFA13 0xF387 UXTAH R3,R3,R7 \ 00000024 0xEB04 0x4417 ADD R4,R4,R7, LSR #+16 \ 00000028 0xD1F1 BNE.N ??AdcAvgFastData_1 ... LDM всё равно не использует, но хоть UXTAH стал использовать. ;) А если так: Спойлер union __attribute__ ((aligned (8))) AdcFastData1 { struct { u16 ampU; u16 ampV; u16 ampW; u16 voltH; //UQ0.16 }; u16 raw[4]; u32 raw32[2]; u64 q; }; void AdcAvgFastData(AdcFastData1 const *src, AdcFastData1 *dst, uint cnt) { if (!cnt) return; u32 u = 0, v = 0, w = 0, h = 0; u64 q; do { q = src->q; u += (u16)q; v += (u32)q >> 16; w += (u16)((u64)q >> 32); h += ((u64)q >> 32) >> 16; src++; } while (--cnt); dst->ampU = (u << 2) / cnt; dst->ampV = (v << 2) / cnt; dst->ampW = (w << 2) / cnt; dst->voltH = (h << 2) / cnt; } то и LDRD начинает использовать. Спойлер ... 457 do { 458 q = src->q; \ ??AdcAvgFastData_1: (+1) \ 00000010 0xE8FE 0x0102 LDRD R0,R1,[LR], #+8 459 u += (u16)q; 460 v += (u32)q >> 16; 461 w += (u16)((u64)q >> 32); 462 h += ((u64)q >> 32) >> 16; 463 src++; 464 } while (--cnt); \ 00000014 0x1E52 SUBS R2,R2,#+1 \ 00000016 0xFA16 0xF680 UXTAH R6,R6,R0 \ 0000001A 0xEB07 0x4710 ADD R7,R7,R0, LSR #+16 \ 0000001E 0xFA1C 0xFC81 UXTAH R12,R12,R1 \ 00000022 0xEB04 0x4411 ADD R4,R4,R1, LSR #+16 \ 00000026 0xD1F3 BNE.N ??AdcAvgFastData_1 ... Цикл суммирования уже получается почти таким же как в моём ассемблерном варианте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 10 часов назад, haker_fox сказал: Это классно - разобраться в ассемблере ARM'а. Сам я, к сожалению, его знаю не очень хорошо. Освоился в своё время только с ассемблером AVR и x86(старых). Но... не теряется ли переносимость кода? Занимаясь оптимизацией функций на низкоуровневом языке что будет, если завтра придётся переносить код на другую архитектуру? А Вы по факту как часто переносите код с одной платформу на другую? Каждый день? Если нет, то думаю переписать несколько строк не составит труда. А ещё можно оставить в проекте и си-код и асм. Или несколько асм для разных платформ. И включать необходимую асм-реализацию условной компиляцией для текущей платформы. Если же асм-варианта для данной платформы нет - условная компиляция должна подключать си-шный вариант. И всех делов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 1 hour ago, jcxz said: Цикл суммирования уже получается почти таким же как в моём ассемблерном варианте Ну вот, осталось только заставить деление заменить умножением на 1/n Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 2 часа назад, jcxz сказал: Цикл суммирования уже получается почти таким же как в моём ассемблерном варианте. Очень рад что получилось! :) Глаз правда режет одновременно и прагма и выравнивающие поля. От чего-то из них можно и нужно отказаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 18 минут назад, aaarrr сказал: Ну вот, осталось только заставить деление заменить умножением на 1/n А смысл такой оптимизации? Сперва написать на асме, а потом добиваться чтобы компиляция си давала такой же результат? Да ещё трястись при каждой пересборке и изменении версии компилятора - не порушится ли? Для переносимости? Но ведь не факт, что после перенесения оно останется оптимальным для новой платформы. Там придётся опять то же самое проделывать. 4 минуты назад, Kabdim сказал: Очень рад что получилось! :) Я это сделал просто из спортивного интереса. И для накопления опыта. Сама по себе такая оптимизация не имеет особого смысла. Проще просто на асме написать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 8 minutes ago, jcxz said: А смысл такой оптимизации? То была злая ирония. Надо теги ставить. 8 minutes ago, jcxz said: Сперва написать на асме, а потом добиваться чтобы компиляция си давала такой же результат? А что мешает сразу "напрячь мозг" и "использовать голову по назначению"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 13 минут назад, jcxz сказал: А смысл такой оптимизации? Сперва написать на асме, а потом добиваться чтобы компиляция си давала такой же результат? Да ещё трястись при каждой пересборке и изменении версии компилятора - не порушится ли? Для переносимости? Но ведь не факт, что после перенесения оно останется оптимальным для новой платформы. Там придётся опять то же самое проделывать. Я это сделал просто из спортивного интереса. И для накопления опыта. Сама по себе такая оптимизация не имеет особого смысла. Проще просто на асме написать. Оптимизации просто так не пропадают. На них пишутся юниттесты и если вдруг они перестают работать, то такие изменения как правило даже не попадают в develop. Так что 99,9% не порушатся. Т.к. компилятору дана вся необходимая информация то и на новой платформе она будет оптимизирована близко к оптимальному. Для х86, желательно что бы массив ваших данных был выравнен 128/256 бит и тогда оптимизатор будет использоваться sse автоматом. Имхо это круто один раз написать предельно корректно и на выходе получить хорошо оптимизированный код без необходимости ручной правки. И не будет необходимости писать что-то на асме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба 4 минуты назад, Kabdim сказал: Имхо это круто один раз написать предельно корректно и на выходе получить хорошо оптимизированный код без необходимости ручной правки. И не будет необходимости писать что-то на асме. Тогда можно посоветовать ТСу переписать его медленные исходники предельно корректно. Ну или хотя-бы заглянуть в листинги чтобы проверить это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 11 декабря, 2018 Опубликовано 11 декабря, 2018 · Жалоба ТСу если он решится нужно профилировать свои исходники и искать бутылочное горлышко. Переписывать все не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 29 января, 2019 Опубликовано 29 января, 2019 · Жалоба Теперь я ищу. Хочется узнать альтернативу STM32F429 + SDRAM. Производительности графики LTDC-контроллера в этом МК будет достаточно. Разработка будет в стиле "деньги считаем тоже". Поэтому интересны варианты процессор + ОЗУ по цене менее 1500р. Сейчас STM32F429 + IS42S16400J выходит примерно в 1000р. Интересны варианты еще дешевле. FSMC/16-битные интерфейсные LCD TFT модули с более дешевые STM32 не хочется, потому как на глаз уже видны тормоза экранов. LTDC рулит. А еще лучше было бы DSI, но тут другая проблема - дешманских дисплеев с DSI с алиэкспресса уже куда меньше по выбору. P.S. Дисплей у меня TFT 320x480, формат вывода будет RGB565. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 29 января, 2019 Опубликовано 29 января, 2019 · Жалоба 4 часа назад, Arlleex сказал: Хочется узнать альтернативу STM32F429 + SDRAM Где-то год назад здесь проскакивала инфа про пики с встроенной памятью в планарном корпусе, по цене не знаю, дешевле будет или нет.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 30 января, 2019 Опубликовано 30 января, 2019 (изменено) · Жалоба Renesas в планарном корпусе, например R7S721020VCFP#AA1 3M LFQFP176 0.5 mm pitch RZ/A1L R7S721030VCFP#AA0 3M LFQFP176 0.5 mm pitch RZ/A1LU (то же что выше, но с JPEG) Или совсем мелкий R7S721000VCFP#AA0 10M LFQFP256 0.4mm pitch RZ/A1H Может и 320*240 и 272*480 и 480*800 - дисплей не сильно тормозит процессор своим обменом. Если надо - схема например тут. Картинка. Процессоры везет чип-дип например... Изменено 31 января, 2019 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 4 часа назад, GenaSPB сказал: Renesas в планарном корпусе, например Я на первой странице темы еще о них говорил, но за ценой тогда я не гнался. Сейчас в терраэлектронике они по ~3200р, в элитане чуть дешевле и партиями, а в чипе ~1500р, и это получается дороже, чем текущая связка STM32F429 + внешняя SDRAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 2 часа назад, Arlleex сказал: элитане чуть дешевле и партиями, а в чипе ~1500р У таких производителей цены вряд-ли дешевле будут... Тогда запасайтесь попкорном терпением и раскуривайте Allwinner V3S - по цене он в районе 300р без доставки, но гемора с доками будет прилично... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться