Заметка - часть полёта мысли по написанию кода для MicroBlaze в среде Qt Creator и, возможно, Clion.
Сразу, чем не подошёл родной GDB - в нём нет поддержки Python. Для QtC это критично, поэтому нужно пересобрать, но с поддержкой оного.
Рецепт сборки ниже. Без подробностей, но там всё и так ясно.
Для начала необходимые зависимости. Их не нужно качать отдельно - всё находится в пакете исходников binutils
. Порядок отстройки важен. Установку (make install
) делать не нужно.
# bfd:
./configure --enable-targets=all && make -j8
# opcodes:
./configure --enable-targets=all && make -j8
# libiberty:
./configure && make -j8
# note: gdb-11.2+, иначе sim не соберётся
# gnulib
chmod +x ./configure && ./configure && make -j8
# sim:
./configure --target=microblaze-xilinx-elf && make -j8
# libdecnumber:
./configure && make -j8
Там где указан --target
- это важно. Там где указано --enable-targets=all
, вместо all
можно указать нужный для MicroBlaze. Но я не вдавался в подробности, тем более, что собирается достаточно быстро. Если не указывать ничего - потом будут проблемы на линковке. А если ещё намешать, сначала собрать opcodes, потом bfd с разным набором целей, то ещё и в рантайме будет эпичный креш ;-)
Ну и собираем сам GDB:
./configure --host=x86_64-pc-linux-gnu --target=microblaze-xilinx-elf --prefix=${HOME}/bin/mb-gdb-python --disable-gdbserver --with-python=/usr/bin/python3 --with-system-readline --with-system-zlib
make -j8
make install
Устанавливаю в домашний каталог пользователя. Если нужно в системный - лучше опакетить или ставить в /opt/
. Python можно, теоретически, указать и третий. Потом проверю.
- UPD: На момент “Февраль 2022” нужно указывать Python 3.
При сборке у себя, проверьте, что использовать в качестве аргумента --host=
. Для этого достаточно посмотреть, какой префикс у вашего системного компилятора:
$ gcc -dumpmachine
x86_64-pc-linux-gnu
значит хост - x86_64-pc-linux-gnu
.
Кстати,
gdbproxy
оказывается не совсем дружит с новыми GDB. Судя по всему причина схожая с
этим. Пока вылечил при помощи небольшого хака. Кроме того, эмпирически выяснил, что, похоже, для thread-id
используется int32_t
, т.е. знаковый 32-битный тип. Просто сейчас базовые адреса оказались за пределами первой половины 32 битного пространства и, внезапно, появились знаки минуса в ID потоков =-)
Какое-то время назад я писал код прошивки для грабберов
Epiphan линейки AV.io:
-
AV.io HD - наш пилот, на котором многое было отлажено и сформирована архитектура
-
AV.io SDI - закрепляем позиции
-
AV.io 4K - уже новое железо и новые подходы, теперь запускаемся практически мгновенно
-
KVM2USB 3.0 - глубокое переосмысление
AV.io HD. По сути, благодаря заложенному потенциалу для модернизации в базовую модель, практически без модификации железа, чисто софтом смогли сделать новый продукт.
Там был задействован
Cypress FX3, а
SDK был построен поверх ThreadX. В качестве JTAG отладчика можно использовать Olimex ARM-USB-OCD-H в связке с
OpenOCD. К сожалению, OpenOCD ничего не знает про треды в RTOS и, хотя, базовая поддержка присутствует в коде, конкретно для нашего процессора использовалась схема стекинга регистров, которая отличалась от того, что было уже реализовано. Пришлось
разбираться и дорабатывать. Профиты от использования JTAG для разработки трудно переоценить, как минимум в случае
распределённой работы.
Итак, время идёт. Теперь очередь за FPGA от Xilinx и его софтовым процессором MicroBlaze, где можно запустить портированый FreeRTOS версии 10.x. Но проблема ровно такая же: поддержки тредов в отладчике нет!
В силу определённых причин пришлось перемещаться с платформы, где базировался блог. Пораскинув мозгами, решил, что статического сайта будет достаточно.
Выбирал между GitHub Pages и GitLab Pages. Вторые из коробки предлагают больше места и больше возможностей по использования и кастомизации генераторов сайта. Первые - более удобное использование Let’s Encrypt, сводящееся к “поставить налочку использовать TLS/SSL”.
Но больший объём артифактов и возможность выбора генератора (хочу иметь, на крайний случай, возможность зайти в репозиторий и добавить/отредактировать статью со всеми смежными изменениями) склонил к GitLab Pages. В качестве генератора был выбран Hugo, написанный на Golang.
Для миграции с DokuWiki был использован, с доработками для себя,
dokuwiki-to-hugo. После чего была череда причёсываний наколенными скриптами (в частности, были восстановлены теги из BlogTNG). Тема пока оставлена неизменённая hugo-octopress. Много косяков в вёрстке, не все картинки лежат в правильных местах и могут не отображаться. Комментарии смигрировал тоже, поэтому, если находите где-то косяк - сообщайте.
Немного про лимиты. Размер репозитория на GitLab - 10G. Но сайт деплоится как артифакт CI, а для него лимит - 1G. Т.е. максимальный размер сайта - 1G.
Лаптоп рапортует, что батарея есть, заряд 54%, но… она не заряжается, ни разражается.
Выхлоп acpi -i
:
Battery 0: Unknown, 53%
Battery 0: design capacity 8147 mAh, last full capacity 7264 mAh = 89%
Unknown
- это статус заряда-разряда.
Вынимаю батарейку при включенном питании и вставляю обратно:
Battery 0: Charging, 56%, 00:58:42 until charged
Battery 0: design capacity 7770 mAh, last full capacity 6928 mAh = 89%
рукалицо.
PS если кто не знает, то батарейки в лаптопах содержат контроллер, с которым хост общается по SMBus (3v3 версия протокола I2C с официальной частотой до 100 kHz).
Возможно и на всех Android 8.x, в случае, если вас как и меня они крайне раздражают:
- включить режим разработчика и отладку по USB
- на хосте поставить
android-tools
(например pacman -S android-tools
)
- подключить USB кабелем и выполнить команду:```bash
adb shell settings put global heads_up_notifications_enabled 0
Пока только
английский вариант.
Буквально на днях потребовалось:
Наткнулся на блог камрада @kirich. Очень интересно, коротко и по делу. В частности, искал, как правильно заземлить паяльную станцию, жало и корпус.
Итак:
- Общее
- Цикл про устройство импульсных БП
Обновил свою “рародную” станция для жал T12 на STC контроллере и LED индикаторах до контроллера на STM32 и OLED дисплеем. Версия железа 2.1S.
Для обновки брал:
- сам котроллер
- акриловую переднюю панель
- и заодно новую ручку с более глубокой посадкой жал
Немного материалов в тему
- Мануалы
- Тут же обсуждения
Осталось только сделать заземление, как описано тут:
В продолжении темы
Подготовка фотографии для перевода на фольгу, вот как может выглядеть результат:
Чуть более подробно:
https://photos.app.goo.gl/MgGtReMN9zmAvXsx9
Потребовалось посмотреть консистентность общения c устройством по шине I2C. Вспомнил, что в закромах Родины валяется демоплата за 120 рубликов (сейчас в пределах 200-300 рублей) на FX2LP. Покупалась для реализации SMBus-USB адаптера, что бы перепрошить батарейку ноутбука. До перепрошивки не дошло, но всплыло где-то в голове, что эта плата фигурировала как анализатор сигналов.
Короткое исследование недавней проблемы.
Пока на моём
корявом английском (или кликаем кнопочку перевода)
Открыл для себя утилиту fold
:
$ echo "Я помню чудное мгновенье, передо мной явилась ты, как мимолётное видение, как гений чистой красоты" | fold -s -w80
Я помню чудное мгновенье, передо мной
явилась ты, как мимолётное видение, как
гений чистой красоты
-s
- делить по пробельным символам, -wXXX
- ширина вывода. За подробностями в man 1 fold
.
Давеча обновил QtC из транка и словил:
terminate called after throwing an instance of 'Sqlite::StatementHasError'
ConnectionServer error: "QLocalSocket: Remote closed" "/tmp/QtCreator-NVcPQb/ClangBackEnd-15319"
Аварийный останов (стек памяти сброшен на диск)
Ключевое: Sqlite::StatementHasError
Не стал глубоко разбираться, чуточку gdb
и strace
и просто удалил старую базу индексации clang-плагина:
rm -f $HOME/.config/QtProject/qtcreator/symbol-experimental-v1.db
Или, в более новых версиях QtC:
rm -f $HOME/.cache/QtProject/QtCreator/symbol-experimental-v1.db
Судя по всему поменялась схема, а процедуры её изменения в автоматическом режиме ещё не реализовали.
UPD 2019-08-13: актуально делать время от времени — повторилось снова.
Это прекрасно:
png.c: In function ‘png_get_libpng_ver’:
png.c:700:17: warning: the comparison will always evaluate as ‘true’ for the address of ‘png_ptr’ will never be NULL [-Waddress]
if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */
^
“Хочешь забыть эту боль?..” (c) Майор Пейн