Как стать автором
Обновить

Комментарии 17

Очень любопытно, особенно asm(«BKPT #0»); возьму на вооружение. Ваш код UART контрастирует с кодом UART из соседней статьи.
Так тот код студенты писали.

То преподавателей писал

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

Идея интересная, буду ждать продолжения!
Пара ремарок:


Spoiler header

Если вы пользуетесь HAL'ом, то вы автоматически пользуетесь и библиотекой CMSIS, которая дает следующие возможности:


  • вместо ассемблерной вставки можно использовать псевдоним __BKPT; аналогичные псевдонимы есть для большинства ассемблерных команд
  • адреса отладочных регистров можно не определять самостоятельно, к ним есть доступ через "структуру" CoreDebug — CoreDebug->DEMCR, например
Про псевдонимы был в курсе, просто не использую их,
а вот про определение CoreDebug не знал. Спасибо

А почему псевдонимы не используете?

Ассемблерная вставка — первое что пришло в голову, про макросы не всегда помню

Понятно, спасибо.

Жду продолжения. Хорошо бы рассмотреть, что вообще можно делать в прерывании DebugMon, а то бесконечная печать восклицательных знаков пока не сильно отличается от такой же печати в коде самой прошивки.
Как я понимаю, в прерывании можно реализовать свой протокол для общения с самопальным отладчиком на компьютере, включая просмотр содержимого памяти и регистров?

Чтение памяти и регистров можно реализовать даже без DebugMon.
Он нужен для возможности установки breakpointов
Находим адрес любой инструкции в цикле функции main средствами IDE и активируем точку останова:
FP->FP_COMP[0] = 0x080017CC | 1; // адрес середины бесконечного цикла = 0x080017CC


И так при каждой компиляции программы узнавать через отладку адреса всех нужных точек остановки? Не проще ли breakpoint поставить? Ну или можно как-то «автоматизировать» выдергивание адресов нужных инструкций?

P.S. DebugMon на самом деле идеально не для инструкций использовать, а для переменных, чьи адреса всегда известны. Жду продолжения.
Так это я для проверки и демонстрации работоспособности сделал
В следующей статье не будет ручного выдергивания адресов, только автоматическое

Ожидал статью про то, как прикрутить gdb агент...

Надеюсь, что в продолжении как раз будет полноценная библиотека-API. Чтобы можно было через openocd работать полноценно.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.