Простая настройка IPv6 на OpenWRT

Тут как-то спрашивали в комментариях в моем унылом бложике про мою настройку OpenWRT для раздачи IPv6 на локальную сеть. Не прошло и пары месяцев, как я все же сподобился набросать статейку про это. Итак, поехали. Спойлер: На самом деле все намного проще, чем кажется.

(далее…)

Самодельный музыкальный центр с веб-интерфейсом

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

(далее…)

Пытаемся сдружить симуляторы Verilog и ctest

Если Вы программист, которому по долгу службы пришлось испачкать руки Verilog/SystemVerilog – первое что приходит на ум – заюзать какую-нибудь штатную запускалку тестов. Если бы разработка велась на myhdl то можно было бы использовать все то добро, что сделано для unit-тестирования кода на python.

Но если мы используем самые что ни есть классические инструменты, проект достаточно большой, с кучей разных библиотек и IP ядер из разных концов света, велик шанс, что простых скриптов на bash/csh для запустка тестов маловато. Да и не хочется тратить драгоценные минуты жизни на переизобретение велосипеда, когда можно использовать что-то готовое.

В этой заметке я расскажу, как интегрировать verilog симуляторы со стандартными запускалками тестов, на примере ctest (Из комплекта cmake) и какие грабли нас ждут при этом.

(далее…)

Грабли препроцессора Verilog HDL

Небольшая заметка о том, как работают include и define в Verilog HDL.   Вопреки ожиданиям, они работают совершенно иначе, чем в большинства языков программирования. В маленьком проекте с этим можно не столкнуться, но в более или менее большом проекте, где есть лицензированные/скаченные с OpenCores блоки от этого поведения можно очень больно огрести. (Я долго искал подходящую картинку, но лучше этой не нашел)

TL;DR: Определенные однажды макросы глобальны, и передаются из одного файла в другой в том порядке, в котором файлы передаются компилятору/синтезатору.

(далее…)

тяжелая наркомания: Сборка VPI расширения и запуск Verilog тестов при помощи cmake/ctest

Недавно потребовалось для нужд кровавой отладки сделать свое VPI расширение для verilog HDL и встал вопрос как интегрировать это добро с какой-нибудь нормальной системой сборки. К сожалению, в плане инструментов для сборки, отладки и тестирование люди проектирующие СБИС живут если не в каменном веке, то в своем особом мирке, со своей особой атмосферой. Опенсурсный iverilog в этом плане ничуть не лучше коммерческих тулов, которые кладут огромный болт на многие общепринятые в мире linux практики.
Ну да хрен с ними. Надо решать как с этим жить. В этой заметке я постараюсь пройтись по основным нюансам написания CMakeLists.txt для сборки vpi расширения и его unit-тестирования.

(далее…)

SkyForge: Создаем корневую ФС Debian на основе конфигурации в стиле Dockerfile

Для кучи проектов, как для работы, так и для дома я использую Debian. Однако, когда работаешь со встраиваемыми системами (напр. ARM СнК) под рукой нет установочного диста debian… Да и вообще привода для чтения дисков. Корневая ФС формируется вручную, отдельно собирается вручную ядро. Впрочем, как обычно.

Процесс не особенно быстрый, если следовать официальной документации на debootstrap и multistrap, а новичкам просто взрывает мозг. (К сожалению, я уже тут не нуб зеленый, старею)
Самое неприятное, что мало просто сформировать корневую ФС, надо ее еще настроить более или менее вменяемым способом, напр. выставить пароль по умолчанию, сгенерировать ssh ключи, прописать fstab… В общем, обычный набор действий.

В большом Ынтерпрайзе ™ существуют такие инструменты, как vagrant который создает базовую виртуальную машину заданной конфигурации и chef или puppet, которые собственно ее настраивают. Хотя нам никто не запрещает использовать chef или chef-solo на armhf плате (а почему бы и нет?) нам все равно нужен какой-то базовый образ, который мы будем в дальнейшем настраивать, так?

(далее…)

CMake + atom + .clang_complete

С некоторый пор я переехал с emacs’а на atom, который выглядел как более современная замена. Что для меня было важным – у него очень хорошая работа с CMake и автодополнение для оного. Вскоре ко всему этому делу я прикрутил lint и autocomplete через clang. И то и другое мне понравилось, но хотело актуального .clang_autocomplete в корне проекта. Однако, если проект получает от системы сборки кучу дефайнов, то управлять этим файликом руками становится больно и неприятно. Выход – генерить его на лету. Вот мой костыль для CMake:

message(STATUS "Generarating ${CMAKE_SOURCE_DIR}/.clang_complete")
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
file(WRITE ${CMAKE_SOURCE_DIR}/.clang_complete "")
foreach(dir ${dirs})
  file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "-I${dir}\n")
endforeach()
string(REPLACE "'" "" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS})
string(REPLACE " " ";" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS_SPLIT})
foreach(flag ${CMAKE_C_FLAGS_SPLIT})
  file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "${flag}\n")
endforeach()

Очевидно, если мы используем C++ в проекте, то и обрабатывать схожим образом надо переменную CMAKE_CXX_FLAGS. У этого кода есть очевидное ограничение: Если мы передаем через -D дефайны с несколькими словами – нас ждет облом (напр. -DRELEASE_CODENAME=”Black Burned Cookies”)

Jenkins + armhf + deb

Эта заметка о том, как я разворачивал CI для около-железячных софтовых проектов и каких проблем я огреб с этим безобразием, пока добился рабочего (хоть и при помощи лома и мата) решения. Возможно даже первая из серии.

Начнем с проблемы. Совсем просто, на случай если это читают дети. У нас есть несколько software проектов. Нам надо периодически делать следующие рутинные действия:

  • Собрать проект и проверить, что он вообще собирается где-то, кроме ноутбука разработчика
  • Прогнать unit-test’ы (Ведь мы же не ленимся писать unit-test’ы, не так ли?)
  • Собрать deb-пакеты, и загрузить куда-нибудь, чтобы пользователи были счастливы

Казалось бы, все давно отлажено, есть OpenSuse Build Service / Open Build Service, Travis, Jenkins. Есть такие страшные штуки как sbuild, schroot и целый выводок утилит от debian-разрабов и просто классных людей, какие могут проблемы? Как всегда, дьявол в деталях. Сразу предупреждаю – текста будет много.

IMG_20151123_010048

(далее…)

Doxygen && gh-pages

У гитхаба есть классная возможность прикреплять к репозиториям html странички. И если конструктор сайтов в стиле yandex.narod’а времен начала нулевых интересует мало кого, то вот постить туда html сгенеренный doxygen’ом – милое дело.
Другое дело, что хранить историю в ветке gh-pages нельзя, иначе она будет распухать c каждым коммитом в основную репу. Да и не нужно ее фиксировать. Потому правильным тут будет:

  • Создавать чистый бранч, куда коммитить сгенеренные доки
  • Делать push с –force, чтобы при этом выкидывать прошлую историю для бранча gh-pages
  • Хочется делать это прямо из дерева исходников, не переключаясь на бранч с документацией
  • Потенциально интегрировать это с CI/Jenkins: Прошел билд, юнит-тесты и статический анализ – бампаем документацию

Делается проще, чем звучит. Ниже, чтобы не забыть, мой сниплет для этого безобразия:

doxygen: 
	-rm -Rfv doxygen/
	( cat Doxyfile ; echo "PROJECT_NUMBER=0.1" ) | doxygen 
	cd doxygen/html;\
	rm -Rfv .git;\
	git init .; git checkout --orphan gh-pages;\
	git add *;\
	git commit -m "documentation-for-gh-pages";\
	git remote add origin git@github.com:MY_GITHUB_USERNAME/MY_GITHUB_PROJECT.git;\
	git push -u -f origin gh-pages

ESP8266: Привет, Франкенштейн

Так как я наконец-то запилил самодельные отладочные платки , самое время начать веселье.
Заправившись под завязку кофеином я занырнул в SDK на esp8266 на этих выходных. Внутри как всегда треш и угар в тяжелой форме. Отвечая на вопросы страждущих – нет, я не буду править код референсной прошивки с AT командами. Это прошивка дерьмо. Точка. Насколько первосортное, что даже как пример ее использовать сложно. Так что нам нужна… замена.

Вот эту-то замену я за эти дни и запилил, и теперь она находится в ранней альфа-версии.

Приветствуйте Frankenstein Firmware для ESP8266.

(далее…)