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

    

uriy

Свой
  • Публикаций

    2 477
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о uriy

  • Звание
    Гуру
  • День рождения 27.09.1983

Информация

  • Город
    Ижевск

Посетители профиля

18 484 просмотра профиля
  1. ЛУТ

    А химический ЛУТ не пробовали? Ацетон+спирт
  2. ЛУТ

    я перестал делать ЛУТ. Заказываю на pcbway. Последние 4 заказа дошли за 14 дней. Причем EMS и HongKong post оба шли по 14 дней, но цена доставки отличается раза в 3.
  3. Имеется документация на китайскую плату. Плата сделана в Mentor pads с переходными 0.2/0.4 мм а пример готовых герберов уже имеет переходные 0.25/0.5мм При этом форма переходных уже далека от круга, для соблюдения зазоров. В чем такое можно сделать?
  4. Под наработками имелось ввиду другие проекты. Вокодер MELP2400 на блэкфине на 60 МГц и на STM32F446 на 180 МГц примерно одинаково нагружают процессор. Я согласен с вами, именно из-за отсутствия аппаратных циклов в ARM перенос кода теперь кажется бредовой идеей.
  5. #pragma optimize_for_speed //------------------------------------------------------------------------------------------ int32_t e1dft_l(int16_t sig_buf[], int16_t tone) { [FFA0C704] LINK 0x0 ; [FFA0C708] [ -- SP ] = ( R7:4 , P5:4 ) ; [FFA0C70A] R3.L = 0 ; [FFA0C716] P1 = R0 ; [FFA0C718] R2 = R1 + R3 ; [FFA0C71A] P2.L = 0x20cc ; [FFA0C71E] P2.H = 0xff80 ; uint16_t i, j; fract32 tmp_im, tmp_re, dft_sq, tmp_mult; fract16 r_im, r_re; tmp_im = 0; for (j = 0, i = 0; i < 128; i++, j+= tone) { tmp_im = L_mac(tmp_im, (fract16)sig_buf[i], (fract16)dft_sine[j % 128]); [FFA0C70E] R5 = 127 ( X ) ; [FFA0C712] R2 = R3 & R5 ; [FFA0C714] P0 = R2 ; [FFA0C722] R0 = R2 & R5 ; [FFA0C724] P4 = P2 + ( P0 << 1 ) ; [FFA0C726] P0 = R0 ; [FFA0C728] I0 = P1 ; [FFA0C72A] A0 = 0 || R0 = W [ P4 ] ( X ) || NOP ; [FFA0C732] R2.L = R1.L + R2.L ( NS ) || R3 = W [ P1 ++ ] ( X ) || NOP ; [FFA0C73A] P5 = 63 ; [FFA0C744] LSETUP ( __BEGIN__.P59L64L , 40 /*0xFFA0C76C*/ ) LC0 = P5 ; [FFA0C748] R3 = R2 & R5 ; [FFA0C74A] P5 = R3 ; [FFA0C74C] P0 = P2 + ( P0 << 1 ) ; [FFA0C74E] R2.L = R1.L + R2.L ( NS ) || R3 = W [ P0 ] ( X ) || NOP ; [FFA0C75E] R0 = R2 & R5 ; [FFA0C760] P0 = R0 ; [FFA0C762] P5 = P2 + ( P5 << 1 ) ; [FFA0C764] R2.L = R1.L + R2.L ( NS ) || R0 = W [ P5 ] ( X ) || NOP ; [FFA0C774] R3 = 32 ; [FFA0C77A] P0 = P2 + ( P0 << 1 ) ; [FFA0C77C] R6.L = R1.L + R3.L ( NS ) || R2 = W [ P0 ] ( X ) || R3.L = W [ I0 ++ ] ; } r_im = round(tmp_im); tmp_re = 0; for (j = 32,i = 0; i < 128; i++, j+= tone) { tmp_re = L_mac(tmp_re, (fract16)sig_buf[i], (fract16)dft_sine[j % 128]); [FFA0C776] R2 = R3 & R5 ; [FFA0C778] P1 = R2 ; [FFA0C784] R7 = R6 & R5 ; [FFA0C78A] P1 = P2 + ( P1 << 1 ) ; [FFA0C78C] P0 = R7 ; [FFA0C790] A0 = 0 || R2 = W [ P1 ] ( X ) || NOP ; [FFA0C798] P1 = 63 ; [FFA0C79A] R4.L = R1.L + R6.L ( NS ) || R6.L = W [ I0 ++ ] || NOP ; [FFA0C7AA] LSETUP ( __BEGIN__.P59L60L , 40 /*0xFFA0C7D2*/ ) LC0 = P1 ; [FFA0C7AE] R0 = R4 & R5 ; [FFA0C7B0] P1 = R0 ; [FFA0C7B2] P0 = P2 + ( P0 << 1 ) ; [FFA0C7B4] R2.L = R1.L + R4.L ( NS ) || R0 = W [ P0 ] ( X ) || NOP ; [FFA0C7C4] R0 = R2 & R5 ; [FFA0C7C6] P0 = R0 ; [FFA0C7C8] P1 = P2 + ( P1 << 1 ) ; [FFA0C7CA] R4.L = R1.L + R2.L ( NS ) || R0 = W [ P1 ] ( X ) || NOP ; [FFA0C7DA] P1 = P2 + ( P0 << 1 ) ; [FFA0C7DC] R1 = R1.H * R1.H || R0 = W [ P1 ] ( X ) || NOP ; } r_re = round(tmp_re); dft_sq = L_mult(r_im, r_im); dft_sq = L_mac(dft_sq, r_re, r_re); return (dft_sq); [FFA0C7F2] ( R7:4 , P5:4 ) = [ SP ++ ] ; [FFA0C7F8] UNLINK ; } Вот вся проблемная функция в режиме mixed А ниже рукописный ассемблерный аналог .section L1_code; .global _e1dft_l; .align 2; .extern _dft_sine; _e1dft_l: link 0; [--sp] = (r7:5, p5:5); [--sp] = lc0; [--sp] = lb0; [--sp] = lt0; // r0 - addres inpute buffer // r1 - number tone i0.l = lo(_dft_sine); i0.h = hi(_dft_sine); b0 = i0; p0 = r0; p5 = 256; // 256 = 128 * 2byte l0 = p5; p5 = 128; r1 <<= 1; m0 = r1; // m0 = r1 = STR_TON or STR_TON_PRM #if defined(__WORKAROUND_BF532_ANOMALY_050000245) NOP; NOP; #endif r1 = w[p0++] (z); // R1 has value of first element in buffer a0 = 0; nop; r5.l = w[i0]; // R5 addres of dft_sine table i0 +=m0; lsetup (start_sine_loop, finish_sine_loop) lc0 = p5; start_sine_loop: r6 = (a0 += r1.l * r5.l) || i0 +=m0 || r5.l = w[i0]; finish_sine_loop: r1 =w[p0++] (z); // read next item from buffer into R1 p0 = r0; // P0 is pointer to first buffer element p5 = 128; i0 = b0; // i0 is address of dft_sine table m1 = 64; i0 += m1; //(32*2); // ( 128 / 4 ) * 2 r5.l= w[i0]; // r5.l load first elemnt of dft_sine table in r5.l i0 +=m0; a1 = 0; r1 = w[p0++] (z); // load first buffer elemnt in r1 lsetup (start_cosine_loop, finish_cosine_loop) lc0 = p5; start_cosine_loop: r7 = (a1 += r1.l * r5.l) || i0 +=m0 || r5.l = w[i0]; finish_cosine_loop: r1 =w[p0++] (z); r1.l= r7(rnd); r5.l= r6 (rnd); a0 = r1.l * r1.l; r0 = (a0 += r5.l * r5.l); l0 = 0; lt0 = [sp++]; // modified lb0 = [sp++]; lc0 = [sp++]; (r7:5, p5:5) = [sp++]; p0 = [fp + 4]; unlink; jump (p0); ._e1dft_l.end: Мне уже кажется плохой идея перенести это на ARM
  6. L_mac это встроенная в vdsp функция умножения с насыщением. Истинная проблема оказалась не в этом. После разгона ядра до 180 МГц сишный код стал нормально работать в железке с реальным сигналом без насыщения. Ассемблерный работает на частоте 60 МГц.
  7. Есть рабочий проект для blackfin. Некоторые функции написаны на ассемблере. Хочу перенести код на ARM. Blackfin у нас работает на частоте 60 Мгц, по предварительным наработкам получается что ARM на частоте 180 МГц дает примерно такую же производительность. Для начала хочу в blackfin убрать ассемблерные функции, чтобы там все работало на си. В функции ниже в регистр R1 считывается элемент из входного массива. В регистр R5 считываются константы из таблицы синуса из 128 элементов. Цикл выполняется 128 раз. С моими тестовыми данными после десятка итараций R6 достигает насыщения 0x7FFF FFFF и затем перестает меняться. Даже если к A0 прибавляется отрицательный результат умножения R1*R5. Мне это кажется странным. Но это рабочий код. start_sine_loop: r6 = (a0 += r1.l * r5.l) || i0 +=m0 || r5.l = w[i0]; finish_sine_loop: r1 =w[p0++] (z); Код на си: Я рассчитываю получить в tmp_in тоже самое что в R6. Но результат совпадает только если отсчеты входного сигнала были с маленькой амплитудой. Почему-то сишный код не обеспечивает насыщение. Как на си записать эквивалент ассемблерного кода? for (j = 0, i = 0; i < 128; i++, j+= tone) { tmp_im = L_mac(tmp_im, sig_buf[i], dft_sine[j % 128]); }
  8. Откройте в блокноте да замените разделитель
  9. использую git+bitbucket
  10. Похоже SCA100T отличная штука! И легко доставаема даже у меня в городе
  11. Блок будет крепиться на металлическую конструкцию подвешенную наверху. Нижняя часть которой отклоняется человеком. Что-то навроде механического маятника. Нужно детектировать нахождение нижней части внутри телесного угла ±0,5 градуса. Кстати куда лучше крепить блок? Мне кажется как можно ближе к оси вращения. Т.е. наверху к точке подвеса этой металлоконструкции. Предположительно в начале рабочего дня будет задаваться исходное вертикальное положение. Нажатие кнопки, подача питания или как-то еще. Нет. 100 мсек это максимальное время между фактом выхода за пределы угла 0,5 градуса и его обнаружением после фильтраций. На само отклонение будут уходить единицы секунд, предположим до 10. Максимальный угол отклонения градусов 20. Мне кажется в течение рабочего дня показания даже с неподвижного блока уйдут далеко за эти 0,5 градуса. Оптические датчики исключили из-за загрязненной среды. Plain кажется отличная штука. Правда в три раза медленней чем мне нужно. Но может быть на это согласятся. И я не нашел ее рабочих температур. Мне надо от минус 40. И с наличием похоже проблемы.
  12. Можете что-то рекомендовать почитать по этому поводу? Акселерометр раньше применял, но мне было нужно всего лишь обнаружить наклон в 30 градусов. 0,5 градуса мне уже кажется серьезным
  13. Мне нужно детектировать наклон блока в 0,5 градуса. Детектирование требуется на протяжении нескольких часов. Время реакции не более 100 мсек. Как эти требования наложить на фильтр каллмана и данные даташита? Например, LSM6DS3H годится для этого? Или такой угол слишком мал и существующими датчиками не удастся его детектировать?
  14. Критерии совершенства в CubeMX?

    Я бы USB host ни за что не запустил без cubemx. А так получилось немного доработав исходники запустить host для hid и чистых bulk.
  15. У меня не работало на Win8 и Win10, ошибку не помню. Поставил для этого Win7 под виртуалкой. Там работает с тем же самым железом