Перейти к содержанию

Точка останова

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

Обновлено Редакция GAW

Точка останова (breakpoint) — адрес в программе, на котором отладчик останавливает ядро, чтобы посмотреть регистры и память. Реализуют её двумя способами: аппаратно — компаратором адреса в отладочном блоке ядра — или программно — специальной командой останова, вписанной в код вместо исходной.

Аппаратные и программные

АппаратнаяПрограммная
Как работаеткомпаратор сравнивает адрес выборки командыкоманда BKPT (Arm) или BREAK (AVR) в коде
Сколькостолько, сколько компараторовсколько угодно
Код во флеш-памятидатолько перезаписью флеш-памяти
Код в ОЗУдада

У Cortex-M3 аппаратные точки останова обслуживает блок FPB (flash patch and breakpoint): в полной конфигурации у него шесть командных и два литеральных компаратора, в урезанной — только два командных (Cortex-M3 TRM, разд. 7.1). Отладчик работает с ядром через SWD или JTAG. Программных точек — команд BKPT в ОЗУ — может быть сколько угодно.

AVR и debugWIRE

У AVR компараторы счётчика команд стоят в модуле внутрисхемной отладки (OCD), и один из них отладчик обычно оставляет себе (Atmel-ICE User Guide, разд. 4.1). У debugWIRE пользовательских компараторов нет вовсе: отладчик вписывает во флеш-память команду BREAK, а исходную команду хранит у себя и выполняет при шаге. Каждая установка и снятие точки — перезапись страницы флеш-памяти, поэтому отладка на низкой тактовой частоте ощутимо тормозит, а флеш-память расходует ресурс записи.

Точки наблюдения

Кроме останова на команде, отладочные блоки умеют останавливаться на обращении к данным — это точки наблюдения (watchpoints). В Cortex-M3 их даёт блок DWT: одна или четыре, в зависимости от конфигурации. Тот же блок содержит счётчик тактов CYCCNT для замера времени.

Что важно помнить

  • Пока ядро стоит на точке останова, периферия может продолжать работать: таймеры считают, UART дошлёт байт. У STM32 часть блоков останавливают битами регистра DBGMCU.
  • Перед выпуском прошивки из неё убирают команды BKPT: без подключённого отладчика такая команда приводит к отказу.

Подробнее об отладочных блоках FPB, DWT и ITM — в статье о ядре Cortex-M3, о работе с точками останова в среде — в статье STM32CubeIDE.

Частые вопросы

Сколько аппаратных точек останова у STM32F103?

У ядра Cortex-M3 блок FPB имеет шесть командных компараторов (вариант конфигурации с двумя литеральными и шестью командными, Cortex-M3 TRM, разд. 7.1), их и использует отладчик для кода во флеш-памяти. Когда точек больше, отладчик сообщает, что не может их установить, или ставит программные: без перепрограммирования флеш-памяти — только в ОЗУ, а некоторые отладчики умеют вписывать команду останова и во флеш-память, перезаписывая её страницы.

Изнашивает ли отладка по debugWIRE флеш-память?

Может. У debugWIRE нет пользовательских аппаратных компараторов, поэтому каждая точка останова — команда BREAK, вписанная во флеш-память, а её установка и снятие требуют перезаписи страницы (Atmel-ICE User Guide, разд. 4.4.15). Microchip советует реже добавлять и снимать точки и отлаживать на высокой тактовой частоте.

Чем точка наблюдения отличается от точки останова?

Точка останова срабатывает на выборке команды по адресу, точка наблюдения (watchpoint) — на обращении к данным: чтении или записи переменной. В Cortex-M3 их обслуживает блок DWT, у которого одна или четыре точки наблюдения в зависимости от конфигурации (TRM, разд. 7.1).

Источники

  1. Arm. Cortex-M3 Processor Technical Reference Manual, r2p1, ARM 100165_0201_02_en — разд. 7.1: базовая отладка — останов ядра, шаг, доступ к регистрам, Vector Catch, неограниченное число программных точек останова; блок точек останова — два литеральных и шесть командных компараторов либо только два командных; блок точек наблюдения — одна или четыре; разд. 7.3: FPB — компараторы адреса выборки команды из области Code, общий и индивидуальные биты разрешения; разд. 8: DWT — до четырёх компараторов, настраиваемых как аппаратная точка наблюдения
  2. Arm. Armv7-M Architecture Reference Manual, ARM DDI 0403E.e (ID021621) — разд. A4.9: команда BKPT служит программной точкой останова, вызывает исключение DebugMonitor или останов в зависимости от настройки отладки; разд. B1.5, «HardFault on breakpoint (BKPT) escalation»: если отладка с остановом выключена, а DebugMonitor выключен или его приоритет недостаточен, BKPT эскалируется в HardFault, бит HFSR.DEBUGEVT
  3. STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439, Rev 21 — разд. 38.12: FPB — аппаратные точки останова; разд. 38.16.4, 38.16.5: регистры DBGMCU_APB1_FZ и DBGMCU_APB2_FZ останавливают таймеры, сторожевые таймеры и тайм-ауты I²C на время останова ядра
  4. Atmel (Microchip). Atmel-ICE User Guide, Atmel-42330C (10/2016) — разд. 4.1: аппаратная точка останова — компаратор счётчика команд в модуле OCD, их число зависит от реализации, обычно один отладчик резервирует для себя; программная точка останова — команда BREAK в памяти программ; разд. 4.4.13: у AVR XMEGA четыре аппаратных компаратора — два адресных и два компаратора значения; разд. 4.4.15: у debugWIRE нет пользовательских компараторов, отладчик вписывает BREAK во флеш-память и хранит исходную команду, каждое добавление и снятие точки требует перезаписи страницы флеш-памяти

Нашли ошибку?