orangepig

План спасения

Извините,  я не могу сдерживаться. Я вчера это чинил до четырёх утра, потому что в  семь утра это уже надо было везти и ставить. Не конкретно вот это,  разумеется, а вообще порядка двух тысяч строк кода, написанных вот так. Я  их с утра понедельника чиню.

***

Задача — услышать бикон  (стоит в подъезжающем авто), аутентифицировать, проверить по базе, что  этому можно въезжать, определить расстояние и направление движения, в  нужный момент дать команду на открывание ворот. Смысл — не просто  аутентификация транспондера, а чтобы авто проезжало через уже  открывшиеся ворота, не задерживаясь перед ними. И чтобы при этом ворота  не реагировали на те же транспондеры в машинах, например, стоящих на  стоянке в двадцати метрах за воротами.

Ну т.е.
1) слышим бикон
2) отвечаем ему ACK, в котором есть случайное число
 3) бикон отвечает пакетом с этим же числом, подписанным  криптографической подписью с ключом, известным только бикону и базе  (аутентифицировали)
4) база запускает процедуру измерения расстояния  — в ней всё уже формируется на уровне железа: база излучает специальный  пакет, бикон на него отвечает (ToF на LoRa в диапазоне 2,4 ГГц)
5) база повторяет измерение три раза с интервалом 1 секунда (определяем направление движения)

Теперь решение.

Как выдерживается секундный интервал между измерениями?

 Миганием светодида. Ну т.е. зовётся функция мигания светодиода, у  которой параметры — сколько раз, период 1, период 0. 5, 100, 100 — вот и  получилась секунда.

Collapse )
orangepig

(no subject)

Представитель инвестфонда словно взорвался.

— Высочайшее достижение финтеха! — провозгласил он. — цифровая объектная модель наподобие виртуальной реальности градуирует себя вдоль блокчейна и там, внутре, обращает материю экосистемы в спиритуальные инновационные вихри, из коих и возникает синекдоха переосмысления рынка...

***

(я хотел написать длинный пост о том, что апологеты инноваций, кажется, очень боятся объективной реальности, подменяя её длинными бессмысленными наборами слов, а у них в комментах пасутся желающие подобрать такой ответный набор слов, чтобы им дали денег за консультацию — но к концу первой пинты Kilkenny окончательно решил, что краткость — сестра таланта)

orangepig

Ловля призраков

Если при тестировании LoRaWAN в офисе вы обнаруживаете, что у вас на ровном месте теряются пакеты, отправленные с подтверждением, джойн проходит через два раза на третий, а заглянув в лог сервера сети, видите попытки джойна устройств на странных частотах — открутите от базовой станции антенну.

Это перегрузка входного тракта, при которой он не просто видит фантомные пакеты на соседних каналах либо со сдвигом на 1, 4 или 11 МГц, а ещё и принимает их вместо основного пакета. А так как при ответе сервер сети в качестве частоты RX1 выбирает ту, на которой устройство к нему постучалось — он отвечает на частоте фантомного пакета, которую устройство не слушает.

Выход — уменьшить силу сигнала, открутив антенну или программно ограничив выхлоп устройств в эфир (только при установке их на реальном объекте не забудьте фитилёк обратно выкрутить).

Collapse )
orangepig

(no subject)

Яндексоиды всё пишут хорошо и правильно (в основном потому, что пишут совершенно очевидные вещи — что аджайл в разработке железа заходит так себе, например), кроме одного: из текста прямо выпирает, как разработчик софта выбирал себе платформу пожирнее и покомфортнее с точки зрения железа.

Проблема в том, что в реальном устройстве, которое пойдёт в производство, почте всегда стоит какая-то не топовая платформа. Иногда настолько не топовая, что всё, сделанное на «четыре ядра, четыре гига» в лучшем случае приходится переписывать заново, а в худшем — проект вообще не удаётся.

Тупо потому, что программисты, работающие с прикладными системами верхнего уровня, не представляют себе ограничений нижнего. Если вы подойдёте к программисту, радостно обнимающему все имеющиеся у него многочисленные ядрышки NanoPi M4, и скажете, что в реальном проекте будет Cortex-A8 на 600 МГц с 256 МБ ОЗУ и 32 МБ флэша с файловой системой UBIFS, он сначала подумает, что вы так шутите.  В его мире такой процессор последний раз был в купленном на Али на распродаже китайском смартфоне. Лет восемь тому назад.

Более того, ещё меньшее число разработчиков не представляет этого не только с точки зрения мощности процессора, но вообще всех физических ограничений:

  • нет, LoRaWAN не позволит вам собирать данные с 300 устройств каждые 10 секунд
  • нет, GPS не даст вам точность ±2 метра в движении по реальной местности
  • нет, старший STM32F4 не сможет неделю непрерывно молотить нейросетку на потоке данных с гироакселерометра на одной зарядке аккумулятора на 500 мА*ч
  • нет, вы не сможете сделать точное позиционирование по RSSI BLE-маячков на металлургическом комбинате
  • нет, ставить в архиве на 900 полок на каждую полку по 3-ваттному RFID-считывателю с узконаправленной антенной — плохая идея

Это, кстати, всё из реальных проектов, и во всех пяти случаях у исполнителя были работающие прототипы. Правда, в них было устройств не триста, а пока только пять, GPS сутками лежал на подоконнике, гироакселеметр работал от павербанка Xiaomi, позиционирование было поднято в офисе с гипсокартонными стенами, а RFID-считыватель попробовали один на одной полке.

Поэтому, дети, если вы делаете железо, а особенно вот этот вот Интернет Вещей ваш, запомните две вещи:

  • у проекта должен быть архитектор (менеджер, оунер, как там у вас ещё принято), который реально понимает врождённые ограничения применяемых технологий, а не только делает красивые презентации руководству
  • идти в таких проектах можно только снизу вверх — как бы ни была прекрасна ваша нейросетка, она не сможет обработать данные, которых у вас нет, потому что вам их снять и доставить до нейросетки нечем

P.S. Реакция клиента с довольно безумным техзаданием, на которое мы написали длинный отзыв с объяснением, что из этого не будет работать, почему, а также как надо сделать, чтобы работало (а от чего вообще придётся отказаться): «Из всех, кто к нам пришёл по запросу, вы единственные, кто смог вообще что-то сказать». И перечень разных красивых имён крупных интеграторов.


orangepig

Рамдиск vs SSD

Сравнил чистку и сборку большого проекта в Windows 10 / WSL / Ubuntu 18.04 LTS на SSD и в рамдиске (tmpfs). По микроконтроллерным меркам — много-много исходников, ибо в проекте есть и ОСРВ,  и стек LoRaWAN, и стек BLE. Размер папочки после сборки — 587М, под рамдиск выделял один гиг.

time make {clean,all}



Ну, такое. Разница есть, но не такая, чтобы за неё убивать.

Ждём WSL2.

P.S. Сборка того же кода на CentOS 7. Процессор немного слабее, вместо интеловского SSD — RAID-6 на медленных ноутбучных HDD.

Ждём WSL2.

P.P.S. Снова Windows 10 — вынес на рамдиск ещё и .ccache:



P.P.P.S. Windows 10, на рамдиск вынесен только ccache:



Будем, наверное, считать это оптимальным вариантом, пока мы ждём WSL2: легко прозрачно автоматизировать, первая сборка после перезагрузки компа долгая, зато потом в полтора раза быстрее обычного. Память же нынче недорога, да и в принципе полгига на ccache в общем случае хватит по уши.

Итого, Ubuntu на Windows 10, ccache уже установлен и используется при сборке:

sudo mkdir /mnt/ramdisk
sudo nano /etc/ccache.conf


cache_dir = /mnt/ramdisk
max_size = 512M

sudo nano /etc/fstab.conf


tmpfs /mnt/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=512M 0 0

rm -rf ~/.ccache

orangepig

Подвисающий I2C

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

В результате совершенно в общем-то довольно понятные в продакшене вещи часто реализуются примерно никогда.

Сегодня, скажем, добавили в драйвер I2C в RIOT OS буквально пять строчек: при инициализации I2C пощупать уровень SDA, если он 0, то подёргать туда-обратно SCL, пока SDA не станет 1.

Зачем?

Да элементарно: если ваша плата почему-то перезагрузилась в момент опроса датчика на I2C, оный датчик запросто может оказаться в состоянии, в котором он притягивает SDA к нулю и смиренно ждёт продолжения SCL, чтобы отдать оставшиеся битики, которые у него успели попросить перед перезагрузкой. Ждать он готов вечно, а вот тот же nRF52 такое состояние шины определяет — и передавать по ней ничего не спешит.

Результат — RIOT'овский драйвер I2C, который просто в цикле while ждёт EVENTS_STOPPED или EVENTS_ERROR (и нет, таймаута там тоже нет), в этом случае тупо глухо виснет навсегда. Вотчдог не помогает, потому что после перезагрузки всё снова встаёт в ту же позу.

orangepig

Лимонное

Бурное цветение лавочек, штампующих SSD, с одной стороны, уронило на них ценник до неприличных величин, а с другой — подход к прошивкам становится всё более похожим на дешёвые смартфоны: we call it beta 'cause it's betta than nothing, а поддерживать это смысла не имеет, ибо через полгода та же модель с той же этикеткой будет уже на другом контроллере.

В результате имею на руках, скажем, A-Data SU650, который хватанул себе в SMART что-то, что он сам переварить не может. Теперь он в общем и целом работает как новенький, но только если SMART не включать. Любое обращение к SMART — мгновенное глухое зависание.

orangepig

Восстановление сыпящегося рейда

Короче, если у вас в софтовом RAID, который уже работает без резерва (например, после замены диска, но до окончания перестройки), начал сыпаться ещё один диск, в результате чего mdadm просто перевёл весь массив в состояние FAILED, то надо так:


  1. mdadm --stop /dev/md0

  2. dd if=/dev/старый_диск of=/dev/новый_диск bs=1M conv=noerror status=progress

  3. достать старый диск

  4. mdadm --assemble --run --update=force-no-bbl /dev/md0 /dev/sd[abcd]1

  5. fsck.ext4 -f -p /dev/md0

  6. добавить второй новый диск и дать массиву перестроиться уже в штатном порядке

Это в предположении, что на сыпящемся диске просто появились бэды, а не что он клина словил — но в принципе шансы на то, что у вас вот прямо два диска подряд клина словят, невысоки, а что в процессе перестройки массива на одном из старых дисков внезапно обнаружатся бэды, вполне реальны. Циферки и буковки подставите самостоятельно.

Опции force-no-bbl в man mdadm может не быть, но это не значит, что её нет на самом деле.

Доклад закончил.