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

adnega

Свой
  • Постов

    3 603
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные adnega


  1. Такая, что бумага для факсов есть в ближайших канцтоварах. Фоторезист же придётся ждать минимум месяц.

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

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

    3. Про бумагу для факсов лично для меня открытие, всегда выискивали "правильный" журнал для этих целей))

  2. Оптимизацию на размер просили?

    С вызовом библиотечной функции код этого куска стал меньше?

    Так какой же это баг?

     

    Ключа «оптимизация на размер, но догадываться, где будет обида на упавшую скорость» пока нет.

    Дык, реализация библиотечного корня судя по листингу два экрана строк.

    Может это проблема библиотеки?

    Но зачем компилятор использует функцию, а не инструкцию.

    По поводу размера: он уменьшился лишь в комплексе, конкретный кусок при этом стал больше.

  3. Костылями накройте: #define sqrtf vsqrt

    Не-не-не.

    Это какая-такая религия запрещает компилятору использовать инструкцию, которая входит в реализацию fpv4-sp-d16.

    Можно подумать, что в отличии от "обычных" арифметических действий, которые всегда дадут результат (даже при делении на ноль), извлечение квадратного корня несколько расширяет диапазон результата (особенно для отрицательных аргументов), поэтому должно быть функцией. Или ход мыслей неверный?

  4. нивапрос... уже разжовывал ввыше по тексту зачем и почему:

    далее вызывайте вместо sqrtf() vsqrt(), fabs можно не трогать - как нистранно компиллер его превращает в vabs.f32.

    Так не пойдет. Это все равно, что на асме писать; vsqrt ведь не библиотечная функция.

    Не понятно почему при оптимизации Os вызывается библиотечная функция, а при O2 подставляется инструкция FPU.

     

  5. CFLAGS += -Wdouble-promotion

    чтобы компилятор поругался на даблы там где их не должно быть...

    Отличнейшая опция!

     

    Странно, при -Os итерация порядка 1700 тактов и листинг:

       dist = 2.0f * asinf(sqrtf(sdlat * sdlat + cosf(clat) * cosf(lat) * sdlon * sdlon)) * 6367444.6571225f;
    80015c4: ed9d 0a07   vldr  s0, [sp, #28]
    80015c8: f000 f856   bl  8001678 <cosf>
    80015cc: eef0 aa40   vmov.f32  s21, s0
    80015d0: ed9d 0a06   vldr  s0, [sp, #24]
    80015d4: f000 f850   bl  8001678 <cosf>
    80015d8: ee2a 0a80   vmul.f32  s0, s21, s0
    80015dc: ee20 0a09   vmul.f32  s0, s0, s18
    80015e0: ee20 0a09   vmul.f32  s0, s0, s18
    80015e4: eea8 0aa8   vfma.f32  s0, s17, s17
    80015e8: f000 f920   bl  800182c <sqrtf>
    80015ec: f000 f8c6   bl  800177c <asinf>

     

    А при -O2 итерация 1048 тактов и задействуется vsqrt

       dist = 2.0f * asinf(sqrtf(sdlat * sdlat + cosf(clat) * cosf(lat) * sdlon * sdlon)) * 6367444.6571225f;
    8001bae: ed9d 0a07   vldr  s0, [sp, #28]
    8001bb2: f000 f85f   bl  8001c74 <cosf>
    8001bb6: eeb0 aa40   vmov.f32  s20, s0
    8001bba: ed9d 0a06   vldr  s0, [sp, #24]
    8001bbe: f000 f859   bl  8001c74 <cosf>
    8001bc2: ee2a 0a00   vmul.f32  s0, s20, s0
    8001bc6: ee60 7a28   vmul.f32  s15, s0, s17
    8001bca: ee67 7aa8   vmul.f32  s15, s15, s17
    8001bce: eee8 7a08   vfma.f32  s15, s16, s16
    8001bd2: eeb1 0ae7   vsqrt.f32 s0, s15
    8001bd6: eeb4 0a40   vcmp.f32  s0, s0
    8001bda: eef1 fa10   vmrs  APSR_nzcv, fpscr
    8001bde: d13f        bne.n 8001c60 <main+0x1cc>
    8001be0: f000 f8ca   bl  8001d78 <asinf>

     

    При этом размер кода отличается всего на 32 байта, а производительность более чем на 38%

  6. Падажжите. -mfloat-abi=hard пристутствует?

    Конечно.

     

    Вроде все заработало.

    Указал все типы float, все константы с суффксом f (кроме M_PI).

    Код теперь генерится красивый (с vmul, vadd).

    Скорость возросла в долгожданные 11 раз.

    Но может чуть-чуть волнует вызов "80015b8: f000 f916 bl 80017e8 <sqrtf>" при живом "VSQRT{cond}.F32 Sd, Sm"

  7. а так?

    clat += 0.000001f;

     

    Вообще для координат действительно нужен дабл или фиксед-поинт, иначе точности не хватит...

     

    Нихт арбайтн:

    clat += 0.000001f;
    8001150:    a313          add    r3, pc, #76; (adr r3, 80011a0 <main+0xc8>)
    8001152:    e9d3 2300     ldrd    r2, r3, [r3]
    8001156:    4620          mov    r0, r4
    8001158:    4629          mov    r1, r5
    800115a:    f7ff fdbb     bl    8000cd4 <__adddf3>

  8. Если в Вашей задаче не требуется double, то просто поменяйте тип на float у всех операндов. Также надо вызывать float версии мат функций из math.h cos(x) -> cosf(x) и тд.

    Поменял эффекта ноль. Стало еще хуже))

    float lat, clat, lon, clon;
    clat += 0.000001;
    
    8001154:    ee18 0a10     vmov    r0, s16
    8001158:    f7ff ff1a     bl    8000f90 <__aeabi_f2d>
    800115c:    a314          add    r3, pc, #80; (adr r3, 80011b0 <main+0xd8>)
    800115e:    e9d3 2300     ldrd    r2, r3, [r3]
    8001162:    f7ff fdb7     bl    8000cd4 <__adddf3>
    8001166:    f7ff ff67     bl    8001038 <__aeabi_d2f>

     

    Видимо, корень зла в том, что fpv4-sp-d16 не поддерживает vadd.f64 :laughing:

    Там только пересылки 64 битные бывают, остальное fp32

    Тут согласен.

     

  9. воткните комиллеру опции -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard

    будет генерится код для fpu, в сборке под cortex-m4f все протянуто (libgcc,libc,libm)

     

    с нетерпением жду результов

     

    следующий свежак будет 'мои релизом', поэтому хочется его оотестить в хвос и в гриву. будет особыс спросбом собраны libgcc и libc(newlib) чтоб гарантировать чоб в бинарь неприлазило вско гадость.

    Помогите расставить плавающие точки на i))

     

    Собираю тестовый проект с плавающей точкой, и вроде все работает, но жутко медленно.

    Фактически не используются инструкции FPU, кроме vmov, vldr, vstr.

    Сложение двух переменных типа double выливается в код с вызовом __adddf3 (эмуляция плавучки?)

     8001a0a:    ed9f 1b21     vldr    d1, [pc, #132]; 8001a90 <main+0x210>
    8001a0e:    ed9d 0b06     vldr    d0, [sp, #24]
    8001a12:    f7ff fac1     bl    8000f98 <__adddf3>
    8001a16:    ed8d 0b06     vstr    d0, [sp, #24]

    Писать ручками vadd.f64 d0, d1 не дает, ибо "Error: selected FPU does not support instruction".

    При использовании "простенькой" арифметики из math.h код разрастается на 10КБ.

     

    Тестю на этом: gcc version 4.8.0 20121121 (experimental) (Klen's GNU package (KGP) for ARM/elf platform)

    В последней сборке под linux_64 результат тот же.

     

    Кто виноват и что делать?

  10. Правда у "троек" сильно периферия отличается (RCC, USART) и вроде пропал bit-band, что особенно огорчает((

    Тут и я переврал: bit-band есть в Cortex-M4, просто распространяется не на всю память, а на два отдельных региона (ОЗУ и периферия).

    В STM32F3 модули GPIO (и вроде только они) как раз ни в один этот регион не входят.

    По сути 6КБ адресного пространства зачем-то "выкинули" - глубинный смысл пытаюсь осознать (может какой-нить механизм маскирования для GPIO появился, как например в LPC11xx).

  11. Для начала даже на ламинаторе у меня не получается ровно нанести пленочный резист. Остаются мелкие пузырьки.

    Далее оно после экспонирования либо не смывается, либо смывается все.

    В общем, за год, наверное, можно руку набить, но зачем? На лазерном утюге получаются дорожки 0.2 мм.

    Наношу пленку на мокрую плату, чтоб не было пузырей.

    Экспонирование "черным светом" с 30 см через пластик от CD-диска около 8 минут.

    Смываю в холодной воде с одной чайной ложкой кальцинированной соды на глубокую тарелку.

    После проявки очень хорошо промываю плату пока она не перестанет быть скользкой.

    Все - после этого травлю в хлорном железе с подогревом и перемешиванием.

     

    По поводу ЛУТ не спорю - более того привести аргументы против сложно.

    Однако один "фанат ЛУТа" на днях признался, что будет переходить на пленочный фоторезист.

    Ему нужно макетить двухсторонние платы с металлизацией переходных отверстий, а там в технологии отверстия нужно перед травлением закрывать, что у ЛУТа по умолчанию не выполнено (ибо тонер не ляжет на дырку).

  12. Элементарная практика. Из 10 попыток с фоторезистом результат 0.

    У многих так было...

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

    Мелкие платы получаются всегда и быстро (правда, пользуюсь ламинатором, который кстати хорошо заменяет и "утюг").

  13. Спасибо.

    (повадившийся хуже обнаглевшего): а тройки шьются ? :)

     

    vsprog.exe -cstm32f1_md -ms -W0 -I test_f3.bin@0,0x08000000 -oe -owf
    ...
    Info:   Chip-id read is 0x432.
    Warning:Chip-id unmatch, read=0x432, want=0x410
    Info:   erasing flash
    erasing flash ========================================%100| 0.03s used
    Info:   flash erased
    Info:   SWDID = 0x2BA01477
    Info:   AHB-AP_ID = 0x24770011
    Info:   ROM_ADDRESS = 0xE00FF003
    Info:   CFG = 0x00000000, Little-endian
    Info:   CORTEX-M4 r0p1 processor detected
    Info:   CPUID = 0x410FC241
    Info:   FLASH_OBR = 0xFFFFFF00
    Info:   FLASH_WRPR = 0xFFFFFFFF
    Info:   programming flash
    writing flash ========%20   ========%40   ========%60   ========%80   ========%100| 0.13s used
    Info:   flash programmed for 5120bytes(39.06KB/s)
    Info:   erasing fuse
    erasing fuse ========================================%100| 0.03s used
    Info:   fuse erased
    Info:   programming fuse
    writing fuse ========================================%100| 0.00s used
    Info:   fuse programmed for 8bytes(3.91KB/s)

     

    И даже работает))

    Правда у "троек" сильно периферия отличается (RCC, USART) и вроде пропал bit-band, что особенно огорчает((

  14. Судя по даташитам к микрухам, CAN и RS-485 предполагают наличие общего проводника или наличие изолятора интерфейса с изолированным источником питания.

    Кстати никто не запрещает НЕ смотреть "на даташиты к микрухам CAN", а придумать свою "физику".

    В этом плане CAN довольно демократичен, важно соблюсти два простых правила:

    1. При наличии в шине хотя бы одного доминантного состояния при любом количестве рецессивных считаться должно доминантное.

    2. В любой точке шины состояние должно быть одно и то же в один момент времени.

     

     

  15. В даташите сказано о максимальной погрешности 1,5%, как понимаю, во всем диапазоне температур, а на практике может оказаться что датчик более точный.

    Если сигнал датчика подать сразу на 10-битный АЦП, то получится минимальный шаг отсчета 0,1 кПа, как-то маловато, устроил бы шаг отсчета 0,05 кПа.

    Обсуждаемый датчик на самом деле имеет плохую точность. Если нужно точнее, то у ST есть MEMS датчик давления. В разы дешевле и на порядки точнее))

     

    ... Да, и не стоит путать точность и разрешающую способность. При давлении 750 мм.рт.ст получать 738.936 мм.рт.ст (с точностью до третьего знака после запятой) согласитесь не имеет смысла.

  16. Две разные процедуры подсчета выдают одно и тоже значение вкупе с онлайн-калькулятором

    Причем если датчик "погреть" пальцами, то CRC начинает сходится...

     

    Я же правильно считаю:

    1. Принимаю scratchpad в буфер - 9 байт.

    2. Подсчитываю CRC8 для 8 байт буфера.

    3. Сравниваю эту КС с 9-м байтом буфера.

     

    Уже шарики за ролики заходят)

    А еще бывает, что тайминги "плывут" взависимости от температуры.

  17. Для управления сетью использую lwip_v1.3.2. Наблюдается следующая ситуация, изначально АЦП работает исправно, однако после того, как контроллер получает ARP пакет, содержащий MAC адрес собеседника, и начинает передавать ему данные, DMA АЦП тут же вылетает с ошибкой FIFO ERROR: FEIF0. Возникает ощущение, что DMA Ethernet отнимает доступ к шине у DMA ADC, в результате чего, тот не успевает вовремя забрать данные с приёмного буфера ADC. С другой стороны, скорость обновления небольшая, и у DMA ADC достаточно времени, чтобы забрать данные. Если, у кого-нибудь есть какие-либо соображения о причине неполадки, или же он уже встречался с такой проблемой, прошу высказаться. Спасибо.

    Использую SPI и DMA для аппаратной динамической индикации. При работе Ethernet наблюдаю моргания. "Возникает ощущение..."

    В ближайшее время планирую разобраться.

    PS. стек самописный. Общение по UDP с аппаратным рассчетом сумм заголовков.

  18. При попытке компиляции началась ругань на невозможность найти хедер в соседней директории: /STM32_USB-FS-Device_Driver/src/usb_core.c:30:21: fatal error: usb_lib.h: No such file or directory

     

    При этом usb_lib.h лежит в /STM32_USB-FS-Device_Driver/inc/.

     

    Подскажите, пожалуйста как убедить eclpce искать исходники по всему дереву проекта, дабы не разводить помойку. В Properies->C/C++ General->Paths and Symbols->Locations пути добавлял - без успеха.

    Пути к заголовочным файлам нужно сообщать не только Eclipse, но и компилятору (ключ -I {dir}).

     

  19. Привет всем. Подскажите как с помощью таймера в stm32 менять состояние вывода микроконтроллера на противоположное с достаточно высокой частотой(порядка 10 МГц)???

    Работает, но выходная частота не поднимается выше 428,5кГц(???), даже если задаю 1мегагерц, например. А если задаю более низкую частоту(например, 200кГц), то частота на выходе в 4 раза меньше(50кГц). В чем причина?

    Использовать аппаратный ШИМ.

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