Про CORDIC
Попросил "болвана" сгенерировать функции для сравнительного теста функций из libm и CORDIC. Но честно: по одной функции "за присест". Получились такие результаты (в среднем на одну функцию):
Заранее готовится массив аргументов (1000 штук), затем в цикле для каждого члена массива вычисляется заданная функция.
У libm от вызова к вызову более-менее различалась скорость вычисления, у CORDIC почти стабильно стояла.
Видно, что никакого смысла использовать это ускорение для единичных вычислений нет. Только если у вас массив данных, вы подключаете DMA → вуаля!
Почему так долго? Потому что "ускоритель" работает с дурным форматом (числа [-1, 1] "размазаны" на весь диапазон int32_t), так что приходится еще и для каждого аргумента тратить время на преобразование "туда" и "обратно". Потом еще ждать окончания вычислений...
С DMA лень продумывать тест, но даже если реально будет значительно быстрей, где те задачи, чтобы нужно было "за один присест" насчитать сотню-другую синусов-косинусов? Те же БПЛА, контроллер монтировки телескопа, "векторный" контроллер двигателя и т.п. требуют вычислений не более двух аргументов за один раз.
UPD: до жирафа таки дошло! Ведь огромное количество синусов-косинусов - это БПФ или ДКП. Остается "всего лишь" придумать, как его с помощью CORDIC реализовать... При том, что оперативки не так уж и много. Надо будет интереса ради попробовать натравить DMA на тысячу синусов-косинусов. Если будет выигрыш хотя бы в 10 раз - смысл от CORDIC есть. Иначе — это просто какое-то недоразумение.
Кстати, "болван" мне сгенерировал тесты, используя в качестве вычислителя TIM2. Я так понял, у "легких" G431 такого таймера нет. Однако, "нечто" что-то там считало с бешеной скоростью. Я даже в отладке попробовал вручную позапускать этот таймер, задав максимальный прескалер (т.е. около 2.5кГц). И за одну-две секунды получал не несколько тысяч отсчетов, а какие-то бешеные цифры.
(off: о, у моих stm32samples уже 200 "звезд" и 49 форков! Почему репы на гитхабе не считаются так же, как публикации? ☺)
| Функция | Время libm (мкс) | Время CORDIC (мкс) |
|---|---|---|
| sin | 1 | 1.44 |
| cos | 1 | 1.44 |
| atan | 0.955 | 0.413 |
| sqrt | 0.448 | 1.535 |
| ln | 1.02 | 1.565 |
Заранее готовится массив аргументов (1000 штук), затем в цикле для каждого члена массива вычисляется заданная функция.
У libm от вызова к вызову более-менее различалась скорость вычисления, у CORDIC почти стабильно стояла.
Видно, что никакого смысла использовать это ускорение для единичных вычислений нет. Только если у вас массив данных, вы подключаете DMA → вуаля!
Почему так долго? Потому что "ускоритель" работает с дурным форматом (числа [-1, 1] "размазаны" на весь диапазон int32_t), так что приходится еще и для каждого аргумента тратить время на преобразование "туда" и "обратно". Потом еще ждать окончания вычислений...
С DMA лень продумывать тест, но даже если реально будет значительно быстрей, где те задачи, чтобы нужно было "за один присест" насчитать сотню-другую синусов-косинусов? Те же БПЛА, контроллер монтировки телескопа, "векторный" контроллер двигателя и т.п. требуют вычислений не более двух аргументов за один раз.
UPD: до жирафа таки дошло! Ведь огромное количество синусов-косинусов - это БПФ или ДКП. Остается "всего лишь" придумать, как его с помощью CORDIC реализовать... При том, что оперативки не так уж и много. Надо будет интереса ради попробовать натравить DMA на тысячу синусов-косинусов. Если будет выигрыш хотя бы в 10 раз - смысл от CORDIC есть. Иначе — это просто какое-то недоразумение.
Кстати, "болван" мне сгенерировал тесты, используя в качестве вычислителя TIM2. Я так понял, у "легких" G431 такого таймера нет. Однако, "нечто" что-то там считало с бешеной скоростью. Я даже в отладке попробовал вручную позапускать этот таймер, задав максимальный прескалер (т.е. около 2.5кГц). И за одну-две секунды получал не несколько тысяч отсчетов, а какие-то бешеные цифры.
(off: о, у моих stm32samples уже 200 "звезд" и 49 форков! Почему репы на гитхабе не считаются так же, как публикации? ☺)
Про "туристов"
В кавычках — потому что вменяемые туристы (коих от силы полпроцента от этой толпы быдла) так себя не ведут.
Сегодня со знакомым в очередной раз обсуждали, как же эти сволочи всех достали. Как их ненавидят все местные жители. Да, кому-то они приносят доход (в т.ч. и мне: на экскурсиях, но это лишь мелкая толика той толпы, что проезжает за сутки по дороге в Архыз). Но убытков от них значительно больше. Начиная от экологии: со строительства "романтика" и водохранилища под Даусузом количество ясных ночей в САО стало заметно меньше; из Зеленчука я 25 лет назад спокойно пил воду, а сейчас мне в этой клоаке даже купаться боязно; все горы, куда доходит нога "туриста", засраты в буквальном смысле слова (и черт бы с дерьмом, но ведь и неразлагаемыми солфетками, фантиками, бутылками и т.п.)…
Местные банды (и не только: сейчас начальником "романтика" является бандит внешний) постоянно делят сферы влияния. Каждый свободный клочок земли, где можно было раньше остановиться с палаткой, теперь - "частная собственность". В общем, пиздец, товарищи!
Вот до чего довел планету этот фигляр ПэЖо! ©
// и это я молчу еще о том, что нонче за 14-15 минут до центра Зеленчука от дома вообще доехать невозможно! Иной раз минут сорок едешь, как на волах…
Сегодня со знакомым в очередной раз обсуждали, как же эти сволочи всех достали. Как их ненавидят все местные жители. Да, кому-то они приносят доход (в т.ч. и мне: на экскурсиях, но это лишь мелкая толика той толпы, что проезжает за сутки по дороге в Архыз). Но убытков от них значительно больше. Начиная от экологии: со строительства "романтика" и водохранилища под Даусузом количество ясных ночей в САО стало заметно меньше; из Зеленчука я 25 лет назад спокойно пил воду, а сейчас мне в этой клоаке даже купаться боязно; все горы, куда доходит нога "туриста", засраты в буквальном смысле слова (и черт бы с дерьмом, но ведь и неразлагаемыми солфетками, фантиками, бутылками и т.п.)…
Местные банды (и не только: сейчас начальником "романтика" является бандит внешний) постоянно делят сферы влияния. Каждый свободный клочок земли, где можно было раньше остановиться с палаткой, теперь - "частная собственность". В общем, пиздец, товарищи!
Вот до чего довел планету этот фигляр ПэЖо! ©
// и это я молчу еще о том, что нонче за 14-15 минут до центра Зеленчука от дома вообще доехать невозможно! Иной раз минут сорок едешь, как на волах…
Засада…
Кое-как со статейкой я вчера справился (опять лучи ненависти к тем, кто вместо латеха "ворд" использует), но вот для презенташки, как оказалось, у меня сильно не хватает фотографий. Да и красивых картинок с температурными картами с "ИК-олская". И если второму виной погода (уже которые сутки невозможно нормального ночного неба дождаться с облачностью процентов в 30-50 — не иначе, пиндосня с экологическим оружием балуется), то как я умудрился не сфотографировать изделие в процессе сборки и установки — непонятно.
Благо, до конференции больше месяца, можно будет найти время, чтобы подняться на гору (я сейчас принципиально не езжу на гору на своей машине, т.к. жечь 92-й бензин по 130р — жирновато будет), да сфотографировать. Ну и, авось, "муссонные дожди" таки закончатся, и можно будет наклепать нормальных массивов данных.
Благо, до конференции больше месяца, можно будет найти время, чтобы подняться на гору (я сейчас принципиально не езжу на гору на своей машине, т.к. жечь 92-й бензин по 130р — жирновато будет), да сфотографировать. Ну и, авось, "муссонные дожди" таки закончатся, и можно будет наклепать нормальных массивов данных.
Сервики…
Решил опять немного побаловаться с сервиками. Так как управляющая частота - всего 50Гц, как-то грех всякие прерывания и DMA использовать. В последней вариации вообще просто флаги TIM_SR_CCxIF проверяю — чтобы удостовериться, что импульс отработан, и можно новый задавать (а буферизация обеспечивает изменение значения лишь в следующем периоде).
Наткнулся на то, что при попытке заставить двигаться с минимальной скоростью (на каждый период по 1мкс изменяю длительность импульса), мой MG90S движется как-то дерганно. Дипсик указал мне, что у него же dead time целых 5мкс! Правда, сдается мне, что здесь чуть ли не 20мкс, т.к. дрожание в 10Гц я бы вряд ли заметил.
А вообще, даже с 5мкс получается, что на 180° у него приходится аж 400 "шагов", что в 4 раза больше, чем у обычного шаговика. Да, шаговик можно заставить ехать на микрошаге, но надо таки проверить, мне кажется, что должен дергаться под почти предельной нагрузкой, т.к. в промежуточных положениях у него сильно спадает момент, поэтому на низких скоростях это будет равноценно останову с удержанием в промежуточном положении (чего добиться невозможно — физику не обманешь; да и греться он, зараза, будет изрядно).
( Collapse )
Наткнулся на то, что при попытке заставить двигаться с минимальной скоростью (на каждый период по 1мкс изменяю длительность импульса), мой MG90S движется как-то дерганно. Дипсик указал мне, что у него же dead time целых 5мкс! Правда, сдается мне, что здесь чуть ли не 20мкс, т.к. дрожание в 10Гц я бы вряд ли заметил.
А вообще, даже с 5мкс получается, что на 180° у него приходится аж 400 "шагов", что в 4 раза больше, чем у обычного шаговика. Да, шаговик можно заставить ехать на микрошаге, но надо таки проверить, мне кажется, что должен дергаться под почти предельной нагрузкой, т.к. в промежуточных положениях у него сильно спадает момент, поэтому на низких скоростях это будет равноценно останову с удержанием в промежуточном положении (чего добиться невозможно — физику не обманешь; да и греться он, зараза, будет изрядно).
( Collapse )
Если "электронный болван" не способен помочь?..
Уже неделю занимаюсь рефакторингом ccd_capture. Задачу сохранения изображения перенес на клиента, т.о. сервер теперь вообще о шапке FITS не должен ничего знать. Немного подрихтовал код (чтобы меньше было дублирующихся частей, хотя, все равно их достаточно много осталось).
В итоге опять: то сегфолт, то косяк. Сейчас при передаче данных через SHM у меня где-то нарушается синхронизация, и отображаемое изображение иногда "портится" (причем, даже размер изменяется немного). А при передаче данных по сети то сегфолт, то в последнем куске читается -1 и errno=14.
Пытаюсь выпытать у дипсика, что же там не так. А он пока ничего дельного предложить не может.
А эту самую ccd_capture я хочу использовать как базис для нового "астровидеогида", т.к. добавлять в старый очередные камеры все сложней и сложней (там все больше "deprecated" кусков и зависимостей от старых версий моих библиотек)...
В итоге опять: то сегфолт, то косяк. Сейчас при передаче данных через SHM у меня где-то нарушается синхронизация, и отображаемое изображение иногда "портится" (причем, даже размер изменяется немного). А при передаче данных по сети то сегфолт, то в последнем куске читается -1 и errno=14.
Пытаюсь выпытать у дипсика, что же там не так. А он пока ничего дельного предложить не может.
А эту самую ccd_capture я хочу использовать как базис для нового "астровидеогида", т.к. добавлять в старый очередные камеры все сложней и сложней (там все больше "deprecated" кусков и зависимостей от старых версий моих библиотек)...
Дичь с "-flto"
Переделал сниппет USB-CDC под STM32G431 (код на гитхабе). В DEBUG-режиме отлично работает: и в терминале USB, и в терминале USART1 пишет правильное "эхо". А вот как только я в RELEASE собираю — фигвам! Дублирует четные буквы и рисует мусор в конце строки (при этом в терминале USART1 выводится правильно).
Вообще не понимаю, где "собака порылась"! Этот же код работает с -flto на девятом gcc, а на 15 почему-то возникли проблемы. А мне хочется "bool" использовать ☺ ...
UPD. Вот такая строчка
в Makefile "верхнего уровня" исправляет ситуацию. ХЗ, что там 15-й gcc мутит, но у него даже объем флеша получается больше, чем у gcc-9.
P.S. Непонятно, чем руководствуются в ST, выбирая ядро USB: вроде, не такой и древний камушек этот G431, но USB больше похож на F0, чем на G0… Правда, с STM32F303 они вообще адово поступили: в "простых" камнях там один тип, а в "крутых" — другой. И приходится в Makefile определять USB1_16 (т.е. в одно 32-битное слово входит лишь одно 16-битное полуслово данных → реальный размер буфера в 2 раза меньше) или USB2_16 (здесь все ОК, но все равно обращаться надо как к 16-битным полусловам, memcpy не канает). А у G0B1 вообще 32-битная адресация… Ну неужто к более свежим моделям сложно определиться и зафиксировать какое-то одно ядро USB? Вменяемое, желательно.
Вообще не понимаю, где "собака порылась"! Этот же код работает с -flto на девятом gcc, а на 15 почему-то возникли проблемы. А мне хочется "bool" использовать ☺ ...
UPD. Вот такая строчка
$(OBJDIR)/usb_dev.o: CFLAGS := $(filter-out -flto,$(CFLAGS)) -fno-lto
в Makefile "верхнего уровня" исправляет ситуацию. ХЗ, что там 15-й gcc мутит, но у него даже объем флеша получается больше, чем у gcc-9.
P.S. Непонятно, чем руководствуются в ST, выбирая ядро USB: вроде, не такой и древний камушек этот G431, но USB больше похож на F0, чем на G0… Правда, с STM32F303 они вообще адово поступили: в "простых" камнях там один тип, а в "крутых" — другой. И приходится в Makefile определять USB1_16 (т.е. в одно 32-битное слово входит лишь одно 16-битное полуслово данных → реальный размер буфера в 2 раза меньше) или USB2_16 (здесь все ОК, но все равно обращаться надо как к 16-битным полусловам, memcpy не канает). А у G0B1 вообще 32-битная адресация… Ну неужто к более свежим моделям сложно определиться и зафиксировать какое-то одно ядро USB? Вменяемое, желательно.
А дела-то с бензином улучшаются (надеюсь)!
Позавчера (уже) был в Зелике. До этого почти 2 недели никуда на машине не ездил (т.к. в баке было почти сухо, а из запасов в гараже — всего-то 20л канистра 95-го). Удивился, что почти все "частные" заправки стабильно работали. И, самое главное — там вообще не было очередей! На "лукойле" стояла очередь где-то метров 300-400. В общем, решил, что раз уж такое счастье, и есть бензин, то надо до полного бака залить. По 130 рублей налил на "частной" колонке 15 литров 92-го. Заодно и "бодяжный" 95-й разбавил, от которого у меня свечи горели (до этого 12 лет не менял свечи, а с конца прошлого года поменял уже два раза!).
Есть, правда, подозрения, что катализатор уже забился. Надо бы таки найти нормального "мастера", который мне вырежет эту ненужную приблуду и перепрошьет ЭБУ. Эх, были бы исходники прошивок, сам бы сделал… Вообще, пора бы уже запрещать установку катализаторов на выхлопной тракт: ничего хорошего от них однозначно нет! Да и двигатели нужно бы разрабатывать такие, которые смогут 100-200 "лошадей" выдавать на старом добром 76-м бензине.
Есть, правда, подозрения, что катализатор уже забился. Надо бы таки найти нормального "мастера", который мне вырежет эту ненужную приблуду и перепрошьет ЭБУ. Эх, были бы исходники прошивок, сам бы сделал… Вообще, пора бы уже запрещать установку катализаторов на выхлопной тракт: ничего хорошего от них однозначно нет! Да и двигатели нужно бы разрабатывать такие, которые смогут 100-200 "лошадей" выдавать на старом добром 76-м бензине.
"Race conditions" на микроконтроллере
Когда-то я при разработке под F303 натыкался на то, что после включения тактирования периферии нужно чуть-чуть подождать, прежде чем настраивать ее. Вот, и под G431 (который на дико шустрой частоте — аж 170МГц — работает) на это наткнулся. Пишу USART+DMA (полностью DMA: и на прием, и на передачу; в прерывании USART1 по символу '\n' выставляется флаг форсирования чтения строки, а так просто в поллинге проверяется буфер DMA и понемножку заполняется кольцевой буфер).
Раньше я "для надежности" на несколько микросекунд делал паузу при помощи цикла с nop'ами, но "болван" подсказал, что и простой инструкции DSB (ждать, пока не прекратятся операции с памятью) достаточно.
Добавил строчку, и светодиодик опять стал мигать.
Вот так и пиши под МК "как под ПК": хренушки! Нужно учитывать скорость некоторых процессов.
Раньше я "для надежности" на несколько микросекунд делал паузу при помощи цикла с nop'ами, но "болван" подсказал, что и простой инструкции DSB (ждать, пока не прекратятся операции с памятью) достаточно.
Добавил строчку, и светодиодик опять стал мигать.
Вот так и пиши под МК "как под ПК": хренушки! Нужно учитывать скорость некоторых процессов.
Про "2FA"
Я уж не знаю, что за мудак эту дрянь придумал, но получается, что как только твой смартфон "превращается в тыкву" (сперли, потерял или же гугол в России блокируют и т.п.) — вуаля, ты не сможешь зайти на данный сайт. Лучи ненависти в сторону гитхаба. Конченые мудаки. Ну, в принципе, от мелкомягких иного ожидать и не приходится.
Намедни еще и битбакет отсох: требует ключа для каждого репозитория. Как сгенерировать "общий ключ", подходящий для аутентификации при работе со всеми репами, я не нашел. Ну и хрен с ним: закомментил в .git/config. Чую, скоро вообще останется лишь отечественный гитфлик (если там тоже не прийдет в ебанутую башку идиотская идея "2FA"), да локальные репозитории...
Уроды, блин! Просто конченые твари.
Намедни еще и битбакет отсох: требует ключа для каждого репозитория. Как сгенерировать "общий ключ", подходящий для аутентификации при работе со всеми репами, я не нашел. Ну и хрен с ним: закомментил в .git/config. Чую, скоро вообще останется лишь отечественный гитфлик (если там тоже не прийдет в ебанутую башку идиотская идея "2FA"), да локальные репозитории...
Уроды, блин! Просто конченые твари.