Точка останова
Отладчик ставит точку останова одним щелчком, но внутри это либо компаратор адреса в отладочном блоке ядра, либо специальная команда, вписанная в программу. Компараторов мало, а команду во флеш-памяти приходится перезаписывать — отсюда сообщения отладчика о том, что точек слишком много, и медленный шаг по 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).
Источники
- Arm. Cortex-M3 Processor Technical Reference Manual, r2p1, ARM 100165_0201_02_en — разд. 7.1: базовая отладка — останов ядра, шаг, доступ к регистрам, Vector Catch, неограниченное число программных точек останова; блок точек останова — два литеральных и шесть командных компараторов либо только два командных; блок точек наблюдения — одна или четыре; разд. 7.3: FPB — компараторы адреса выборки команды из области Code, общий и индивидуальные биты разрешения; разд. 8: DWT — до четырёх компараторов, настраиваемых как аппаратная точка наблюдения
- 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
- 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 на время останова ядра
- Atmel (Microchip). Atmel-ICE User Guide, Atmel-42330C (10/2016) — разд. 4.1: аппаратная точка останова — компаратор счётчика команд в модуле OCD, их число зависит от реализации, обычно один отладчик резервирует для себя; программная точка останова — команда BREAK в памяти программ; разд. 4.4.13: у AVR XMEGA четыре аппаратных компаратора — два адресных и два компаратора значения; разд. 4.4.15: у debugWIRE нет пользовательских компараторов, отладчик вписывает BREAK во флеш-память и хранит исходную команду, каждое добавление и снятие точки требует перезаписи страницы флеш-памяти
Нашли ошибку?
Смотрите также
- SWDSerial Wire Debug: отладка и прошивка Cortex-M по двум проводам
- JTAGПоследовательный интерфейс тестирования и отладки по IEEE 1149.1: TCK, TMS, TDI, TDO
- debugWIREОднопроводная отладка AVR через вывод RESET
- Счётчик тактов CYCCNT32-битный счётчик тактов ядра в блоке DWT для замера времени выполнения кода
- Cortex-M3Регистры, карта памяти, bit-banding, NVIC, SysTick, MPU, старт, пример
- STM32CubeIDEСреда ST для STM32: проект, сборка, отладка ST-LINK, SWV и ошибки
- SemihostingМеханизм Arm для ввода-вывода прошивки через подключённый отладчик