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

Ищу альтернативу платам с линуксом и толстым процессором.

25 минут назад, Kabdim сказал:

Не смогу, я из армии приверженцев гнутым компиляторам. :)

Вот чего удалось добиться:  :smile:

Спойлер

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 начинает использовать.  :smile:

Спойлер

...
    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
...

 

Цикл суммирования уже получается почти таким же как в моём ассемблерном варианте.  :smile:

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


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

10 часов назад, haker_fox сказал:

Это классно - разобраться в ассемблере ARM'а. Сам я, к сожалению, его знаю не очень хорошо. Освоился в своё время только с ассемблером AVR и x86(старых). Но... не теряется ли переносимость кода? Занимаясь оптимизацией функций на низкоуровневом языке что будет, если завтра придётся переносить код на другую архитектуру?

А Вы по факту как часто переносите код с одной платформу на другую? Каждый день?  :smile:

Если нет, то думаю переписать несколько строк не составит труда. А ещё можно оставить в проекте и си-код и асм. Или несколько асм для разных платформ. И включать необходимую асм-реализацию условной компиляцией для текущей платформы. Если же асм-варианта для данной платформы нет - условная компиляция должна подключать си-шный вариант.

И всех делов!

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


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

1 hour ago, jcxz said:

Цикл суммирования уже получается почти таким же как в моём ассемблерном варианте

Ну вот, осталось только заставить деление заменить умножением на 1/n

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


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

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

Цикл суммирования уже получается почти таким же как в моём ассемблерном варианте.  :smile:

Очень рад что получилось! :) Глаз правда режет одновременно и прагма и выравнивающие поля. От чего-то из них можно и нужно отказаться.

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


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

18 минут назад, aaarrr сказал:

Ну вот, осталось только заставить деление заменить умножением на 1/n

А смысл такой оптимизации? Сперва написать на асме, а потом добиваться чтобы компиляция си давала такой же результат? Да ещё трястись при каждой пересборке и изменении версии компилятора - не порушится ли?

Для переносимости? Но ведь не факт, что после перенесения оно останется оптимальным для новой платформы. Там придётся опять то же самое проделывать.

4 минуты назад, Kabdim сказал:

Очень рад что получилось! :)

Я это сделал просто из спортивного интереса. И для накопления опыта. Сама по себе такая оптимизация не имеет особого смысла. Проще просто на асме написать.

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


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

8 minutes ago, jcxz said:

А смысл такой оптимизации?

То была злая ирония. Надо теги ставить.

 

8 minutes ago, jcxz said:

Сперва написать на асме, а потом добиваться чтобы компиляция си давала такой же результат?

А что мешает сразу "напрячь мозг" и "использовать голову по назначению"?

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


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

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

А смысл такой оптимизации? Сперва написать на асме, а потом добиваться чтобы компиляция си давала такой же результат? Да ещё трястись при каждой пересборке и изменении версии компилятора - не порушится ли?

Для переносимости? Но ведь не факт, что после перенесения оно останется оптимальным для новой платформы. Там придётся опять то же самое проделывать.

Я это сделал просто из спортивного интереса. И для накопления опыта. Сама по себе такая оптимизация не имеет особого смысла. Проще просто на асме написать.

Оптимизации просто так не пропадают. На них пишутся юниттесты и если вдруг они перестают работать, то такие изменения как правило даже не попадают в develop. Так что 99,9% не порушатся.

Т.к. компилятору дана вся необходимая информация то и на новой платформе она будет оптимизирована близко к оптимальному. Для х86, желательно что бы массив ваших данных был выравнен 128/256 бит и тогда оптимизатор будет использоваться sse автоматом.

Имхо это круто один раз написать предельно корректно и на выходе получить хорошо оптимизированный код без необходимости ручной правки. И не будет необходимости писать что-то на асме.

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


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

4 минуты назад, Kabdim сказал:

Имхо это круто один раз написать предельно корректно и на выходе получить хорошо оптимизированный код без необходимости ручной правки. И не будет необходимости писать что-то на асме.

Тогда можно посоветовать ТСу переписать его медленные исходники предельно корректно. Ну или хотя-бы заглянуть в листинги чтобы проверить это.   :umnik2:

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


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

ТСу если он решится нужно профилировать свои исходники и искать бутылочное горлышко. Переписывать все не нужно.

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


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

Теперь я ищу.

Хочется узнать альтернативу STM32F429 + SDRAM. Производительности графики LTDC-контроллера в этом МК будет достаточно.

Разработка будет в стиле "деньги считаем тоже". Поэтому интересны варианты процессор + ОЗУ по цене менее 1500р.

Сейчас STM32F429 + IS42S16400J выходит примерно в 1000р. Интересны варианты еще дешевле.

FSMC/16-битные интерфейсные LCD TFT модули с более дешевые STM32 не хочется, потому как на глаз уже видны тормоза экранов. LTDC рулит. А еще лучше было бы DSI, но тут другая проблема - дешманских дисплеев с DSI с алиэкспресса уже куда меньше по выбору.

P.S. Дисплей у меня TFT 320x480, формат вывода будет RGB565.

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


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

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

Хочется узнать альтернативу STM32F429 + SDRAM

Где-то год назад здесь проскакивала инфа про пики с встроенной памятью в планарном корпусе, по цене не знаю, дешевле будет или нет..

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


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

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 - дисплей не сильно тормозит процессор своим обменом.

Если надо - схема например тут. Картинка.

 

Процессоры везет чип-дип например...

 

 

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

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


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

4 часа назад, GenaSPB сказал:

Renesas в планарном корпусе, например

Я на первой странице темы еще о них говорил, но за ценой тогда я не гнался. Сейчас  в терраэлектронике они по ~3200р, в элитане чуть дешевле и партиями, а в чипе ~1500р, и это получается дороже, чем текущая связка STM32F429 + внешняя SDRAM.

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


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

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

элитане чуть дешевле и партиями, а в чипе ~1500р

У таких производителей цены вряд-ли дешевле будут... Тогда запасайтесь попкорном терпением и раскуривайте Allwinner V3S - по цене он в районе 300р без доставки, но гемора с доками будет прилично...

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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