
В этой статье расскажем, как научиться отлаживать и полюбить маленькую черную плату Black Magic Probe V2.1. Но для начала немного о том, что это такое и зачем она нужна.
Плата Black Magic Probe Mini V2.1 (BMPM2) разработана 1BitSquared в сотрудничестве с Black Sphere Technologies, является адаптером JTAG и SWD, предназначена для программирования и отладки микроконтроллеров ARM Cortex-M и ARM Cortex-A. Можно добавить поддержку других процессоров. Описание процесса добавления можно найти по ссылке. Стоит также отметить, что любой процессор с поддержкой ADIv5 (ARM Debug Interface v5) будет определяться платой.
На рисунках приведены процессоры семейств ARM Cortex-M и ARM Cortex-A, поддерживаемые платой Black Magic Probe Mini V2.1.


В процессе тестирования Black Magic Probe было выявлено, что поддерживаемые процессоры не ограничиваются списком, предоставленным производителем. Официально не поддерживаемые процессоры с ARM Debug Interface v5 определяются, например, как "Cortex-M0" или “Cortex-A7”. При этом, не гарантируется полная функциональность, но все же произвести минимальные действия по отладке получится.
Что можно делать с использованием платы Black Magic Probe:
- прерывать процесс исполнения программы;
- наблюдать за изменениями регистров и переменных;
- устанавливать точки останова (можно установить точку останова в коде, которая заставит программу остановиться, как только эта точка будет достигнута);
- просматривать стек вызовов (список функций и их параметров, которые привели нас к текущей точке и состоянию программы);
- дизассемблирование (возможность просмотреть машинный код и узнать, что именно делает программа);
- дамп памяти (сохранение ОЗУ и/или флэш-контента в файл).
Функции Black Magic Probe, которые могут быть полезны при исследовании информационной безопасности устройств:
- разработка встроенного программного обеспечения и устройств для проведения атак;
- реверс-инжиниринг IoT;
- поиск уязвимостей;
- динамический анализ с помощью IDA и других инструментов, совместимых с серверами gdb.
BMPM2 обладает двумя основными особенностями. Первая заключается в том, что на самом устройстве запускается gdbсервер, открывающий виртуальный порт, к которому можно напрямую подключиться через клиент gdb на своем хост-компьютере (рекомендуется набор инструментов gcc-arm-embedded), поэтому не нужно настраивать конфигурации OpenOCD или STLink. Сравнение схем подключения отладочного интерфейса при помощи OpenOCD/STLink и BMPM2 можно увидеть ниже. Как видно, вариант с подключением через BMPM2 проще.

Второй является возможность скомпилировать прошивку под другие платы, при этом необходимость в BMPM2 отпадает. Совместимые платы представлены тут.
Для изучения возможностей работы были взяты четыре платы: TM32F103C8, STM32vldiscovery, STM32F429I-disc1 и предлагаемая разработчиками 1Bitsy V1.0.
Более подробно будет рассмотрена работа с 1Bitsy и STM32F429I-disc1. Первая была выбрана по рекомендации самих разработчиков, а у второй есть сенсорный экран, что делает процесс исследования более наглядным.
Познаем мир отладки с Black Magic Probe
Изучение работы Black Magic Probe V2.1 удобно начать с отладки 1Bitsy. Эта плата была создана специально для работы с BMPM2, поэтому не должно возникнуть никаких затруднений.
Соединим Black Magic Probe и 1Bitsy между собой кабелем JTAG и подключим их к компьютеру.
Ниже будет описана работа в среде GNU/Linux, руководство по работе в ОС Windows и MacOS легко найти по ссылке.
После подключения BMPM2 к ПК и к разъему JTAG, на 1Bitsy выполним три команды в gdb для начала отладки. Важно, чтобы пользователь был добавлен в группу dialout командой "sudo adduser $USER dialout", иначе ничего не заработает. Первой командой “target extended-remote /dev/ttyACMx” подключаемся к BMPM2, где x — номер серийного порта, далее сканируем все подключенные к Black Magic Probe устройства с помощью команды “monitor jtag_scan”. Если все хорошо, то будет выведен список найденных устройств и командой “attach 1” мы подключимся к 1Bitsy.
(gdb) target extended-remote /dev/ttyACM0
Remote debugging using /dev/ttyACM0
(gdb) monitor jtag_scan
Target voltage: 3.3V
Available Targets:
No. Att Driver
 1      STM32F4xx
(gdb) attach 1
Attaching to Remote target
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x0800026c in ?? ()
(gdb)Все, теперь мы можем выполнить отладку прошивки, загруженной в 1Bitsy. С 1Bitsy, и правда, не возникло никаких проблем с подключением, все просто и достаточно удобно. Сохранится ли простота и удобство при работе с другой платой?
В наличии была плата на основе микроконтроллера STM32 — STM32F429I-disc1, ей и воспользуемся, заодно зальем на нее какую-нибудь интересную прошивку. Главным отличием в работе с этой платой от работы с 1Bitsy является соединение по интерфейсу SWD, а не JTAG.
Перед началом работы соединяем платы через JTAG/SWD адаптер по следующей схеме:
на интерфейсе SWD (если считать с крайнего сверху выхода):
- SWCLK
- GND
- SWDIO
- 3V — tVref.

Для демонстрации работоспособности процесса отладки была использована прошивка, содержащая несколько программных модулей. Один из них — игра Reversi, её будет отлаживать интереснее всего.
Заливаем прошивку на плату и в gdb вводим почти те же команды, что и для 1Bitsy, с той лишь разницей, что плата подключена по SWD, поэтому потребуется использовать команду swdp_scan.
(gdb) target extended-remote /dev/ttyACM0
Remote debugging using /dev/ttyACM0
(gdb) monitor swdp_scan
Target voltage: 3.3V
Available Targets:
No. Att Driver
 1      STM32F4xx
(gdb) attach 1
Attaching to Remote target
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x0800026c in ?? ()
(gdb)К огромной печали, нам ни разу не удалось выиграть, поэтому захотелось что-нибудь в ней поломать. Для начала, мы посмотрели исходники. В них была найдена переменная Board, предположительно, обозначающая адрес первой ячейки доски. Рядом есть строки "Reversi — Player 1" и "Reversi — Player 2".
static void _SetPlayer(int Player) {
  int Score, ValidMoves, PossibleMoves;
  char ac[256];
  _Board.ActPlayer = Player;
  if (Player == 1) {
    FRAMEWIN_SetText(_hFrame, "Reversi - Player 1");
  } else {
    FRAMEWIN_SetText(_hFrame, "Reversi - Player 2");
  }
  FRAMEWIN_SetBarColor(_hFrame, 1, (Player == 1) ? GUI_RED : GUI_BLUE);
  PossibleMoves = _CalcValidMoves(&_Board);
  GUI_Exec();
if (!PossibleMoves) {
    GUI_Exec();
    _Board.ActPlayer = 3 - Player;По этим строкам мы осуществили поиск в дизассемблере IDA. Выяснили, что из псевдокода можно узнать адрес, который является начальным адресом ячеек доски.
  v1 = a1;
  v2002CB74 = a1;
  if ( a1 == 1 )
  {
    sub_D8B3C(v2002CB80, "Reversi - Player 1");
    v2 = 255;
  }
  else
  {
    sub_D8B3C(v2002CB80, "Reversi - Player 2");
    v2 = 16711680;
  }
  sub_E06A8(v2002CB80, 1, v2);
  v3 = sub_DEDF8(0x2002CAF4);
  result = ((int (*)(void))sub_C91B4)();
  if ( v3 )
    return result;
  sub_C91B4(result);
  v2002CB74 = 3 - v1;
  v5 = sub_DEDF8(0x2002CAF4);
Далее, решили воспользоваться gdb для того, чтобы посмотреть, что находится по этому адресу.


Все верно. Если внимательно изучить данную таблицу и расположение фишек в начале игры, то можно заметить, что 001 означает красную фишку, а 002 — синюю. Можно попробовать изменить значение одной из ячеек. Для этого мы воспользовались командой:
set *(char *) 0x2002CAF4 = 1
Результат:


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


Скрипт успешно отработал, нам удалось победить в игре, а это значит, что с помощью платы Black Magic Probe Mini V2.1 через gdb можно успешно отлаживать и "ломать" прошивки.
А теперь немного скучных примеров с моргающими лампочками.
STM32F103C8
Плату STM32F103C8 подсоединим к Black Magic Probe V2.1 через интерфейс JTAG.

Исходники для прошивки платы можно взять тут.
В исходном коде можно попробовать изменять скорость моргания лампочки, уменьшая или увеличивая интервалы времени, когда она горит и когда гаснет.
STM32vldiscovery
Плату STM32vldiscovery подсоединим к Black Magic Probe V2.1 через интерфейс SWD, а именно:
- 3V3 — tVref
- PA13 — SWDIO
- PA14 — SWCLK
- GND — GND
Исходники для прошивки платы можно взять тут.
Здесь все аналогично предыдущей плате, также меняем интервалы времени в исходниках и смотрим на лампочку.
Выводы
Плата Black Magic Probe Mini V2.1 — простая в использовании и имеет набор инструментов и библиотек с открытым исходным кодом, это является ее основными плюсами.
Минусом платы является отсутствие поддержки архитектуры процессоров arm64 и процессоров Texas Instruments.
http://1bitsy.org/overview/introduction/
https://1bitsquared.com/products/black-magic-probe
https://github.com/esden/1bitsy-bmpm-exercises/blob/master/embedded_programming_with_black_magic_and_lights_on-workshop_guide.pdf
https://github.com/blacksphere/blackmagic/wiki
Авторы
- Евгений Рассказов Jokiv
- Валерия Губарева veneramuholovka
 
           
 
Phyzic
Недавно на Гиктаймс была еще одна статья о BlackMagicProbe, после которой я собрал свой экземпляр. Да, устройство работает, но его интеграция с IDE может представлять проблему. Например, я использую для разработки под МК QtCreator с плагином BareMetal, и, к сожалению, не могу использовать BMP, так как он использует extended-gdb протокол. В Eclipse, с другой стороны, вроде бы такой проблемы нет.