Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2739
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Продвинутые методы отладки

681

24.1.2.5.Разрешение дополнительных обработчиков отказов

Отказы Memory Fault, Bus Fault and Usage Fault по умолчанию запрещены. Ни HAL_NVIC_EnableIRQ(), ни NVIC_EnableIRQ() не могут разрешить те исключения, которые разрешаются установкой битов 16, 17 и 18 регистра SCB->SHCSR. Чтобы разрешить исключение отказа Memory Fault, мы используем следующую инструкцию:

SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; // Установка бита 16

Чтобы разрешить исключение отказа Bus Fault, мы используем следующую инструкцию:

SCB->SHCSR |= SCB_SHCSR_BUSFAULTENA_Msk; // Установка бита 17

Чтобы разрешить исключение Usage Fault, мы используем следующую инструкцию:

SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk; // Установка бита 18

Когда одно из этих исключений разрешено, мы можем сконфигурировать его приоритет с помощью HAL_NVIC_SetPriority(), как и любое другое конфигурируемое исключение.

24.1.2.6.Анализ отказов в процессорах на базе Cortex-M0/0+

Ядра Cortex-M0/0+ не предоставляют исключения отказов Memory Fault, Bus Fault и Usage Fault. Более того, соответствующие регистры состояния недоступны. Это означает, что в них у нас нет тех диагностических функций, которые предоставляются ядрами

Cortex-M3/4/7.

Анализ загруженных в стек регистров является единственным подходящим методом, который мы можем использовать для диагностики причин отказов. Этот ответ9 Джозефа Ю на официальном форуме ARM дает дополнительные полезные сведения. Другие методы, такие как заполнение SRAM значением «часового» для обнаружения переполнения стека, могут помочь вам найти источник отказа в вашем коде.

24.2. Продвинутые возможности отладки в

Eclipse

В Главе 5 мы начали анализ функциональных возможностей отладки, предлагаемых Eclipse CDT и плагинами GNU MCU Eclipse. Мы ознакомились с основными возможностями, такими как вставка точек останова и пошаговая отладка. Теперь самое время увидеть другие возможности отладки, интегрированные в инструментарий GNU MCU Eclipse.

Все функции, показанные здесь, доступны в перспективе Debug.

24.2.1. Представление Expressions

Представление Expressions («Отладочные выражения») – это мощная функция, которая позволяет получить доступ к содержимому адресов памяти, переменных и других

9 https://community.arm.com/thread/5414#17345

Продвинутые методы отладки

682

структур данных во время отладки. Кроме того, оно также может выполнять вызовы функций, чтобы вы могли оценить результат данной процедуры. Представление Expressions должно быть явно включено, перейдя в Window → Show View → Expressions.

Рисунок 7: Представление Expressions в перспективе отладки Debug

На рисунке 7 показано несколько примеров выражений. msg – это массив символов, содержащий строку “Hello World!”. pMsg – это символьный указатель на строку msg. Как видно из рисунка 7, просто записав имя переменной в представлении Expressions, мы можем получить доступ к ее содержимому, где бы оно ни было определено в коде. Мы также можем показать указатель Си в виде массива, используя выражение (variable@len), где variable – это имя указателя, а len – количество данных, хранящихся в массиве.

На рисунке 7 также показано, что можно вызвать функцию (в нашем случае strlen()) и получить ее результат10. Выражение также может содержать арифметические операции. Наконец, представление Expression также может получить доступ к содержимому отдельных ячеек памяти и преобразовать их содержимое в заданный тип данных (щелкнув правой кнопкой мыши по строке выражения, можно преобразовать переменную в другой тип данных).

Представление Expressions в последних выпусках Eclipse CDT поддерживает расширенные выражения (enhanced expressions). Расширенное выражение – это способ легкого написания шаблона выражения, который автоматически расширится до большего подмножества дочерних выражений. Можно использовать четыре типа расширенных выражений:

Соответствующие шаблону локальные переменные

Соответствующие шаблону регистры

Соответствующие шаблону элементы массива

Группы выражений

Например, шаблон «=*» позволяет отображать все локальные переменные в текущем кадре стека, а шаблон «=$*» показывает регистры ядра. Для получения дополнительной информации о расширенных выражениях см. документацию Eclipse CDT11.

10Очевидно, что эта функция должна быть включена в бинарный образ, то есть она должна быть функцией, используемой в коде микропрограммы.

11https://wiki.eclipse.org/CDT/User/FAQ#What_are_Enhanced_Expressions.3F

Продвинутые методы отладки

683

24.2.1.1. Мониторы памяти

Eclipse CDT позволяет получить доступ к содержимому всего 4 ГБ адресного пространства. Вы можете получить доступ к содержимому ячейки памяти с помощью представления Memory Monitors («Мониторы памяти»). Чтобы показать представление, перейдите в Window → Show View → Memory.

Рисунок 8: Представление Memory Monitors

После того, как представление покажется на экране, вы можете добавить новую ячейку памяти в представление Monitors, щелкнув зеленый крестик, показанный на рисунке 8. Следующим шагом будет выбор «средства визуализации (renderer)», то есть способа показа содержимого ячейки памяти. Вы можете выбирать между:

Вещественным (Floating Point)

Традиционным (Traditional)

Шестнадцатеричным (Hexadecimal)

Символьным (ASCII)

Знаковым и беззнаковым целым (Signed/unsigned integer)

Вы также можете добавить больше средств визуализации (рендереров) для той же ячейки памяти. Интересная особенность «традиционного» рендерера заключается в том, что также одновременно отображается содержимое регистров ядра, как показано на рисунке 9. В конечном счете, вы можете настроить несколько параметров представления Memory (размер ячейки, порядок следования байт, формат памяти и т. д.), щелкнув правой кнопкой мыши по ячейке памяти.

Рисунок 9: Ячейка памяти, показанная в шестнадцатеричном и традиционном рендерерах

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

Каждый процессор на базе Cortex-M предоставляет определенное количество точек останова и точек наблюдения (см. таблицу 7). В то время как точки останова используются для прерывания выполнения на заданной инструкции, точки наблюдения используются для прерывания выполнения при обращении к области данных. Любые данные или адрес периферийного устройства могут быть помечены как наблюдаемая переменная, и обращение по этому адресу вызывает генерацию события отладки, которое

Продвинутые методы отладки

684

останавливает выполнение программы. Точка наблюдения также может быть использована для приостановки выполнения только при совпадении заданного выражения.

Таблица 7: Доступные точки останова/точки наблюдения в ядрах Cortex-M

Cortex-M

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

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

 

 

 

M0/0+

4

2

M3/4/7

6

4

Существует несколько способов добавить точку наблюдения в инструментарии Eclipse CDT. Например, вы можете щелкнуть правой кнопкой мыши по переменной в представлении Variables («Переменные») и выбрать пункт Add Watchpoint(C/C++). То же самое можно выполнить в представлении Expressions и в представлении Memory monitors, щелкнув правой кнопкой мыши по ячейке памяти.

Рисунок 10: Окно конфигурации точки наблюдения

После нажатия на Add Watchpoint(C/C++) открывается окно конфигурации точки наблюдения, как показано на рисунке 10. Здесь мы можем настроить область наблюдаемой памяти, начиная с первого слова (поле Range). Более того, мы можем указать, хотим ли мы приостановить выполнение при обращении к этой области памяти в режиме чтения (Read) или записи (Write). Поле Enable позволяет включать/отключать точку наблюдения. Наконец, поле Condition позволяет задать условие. Точки наблюдения перечислены в представлении Breakpoints.

24.2.3. Режим Instruction Stepping Mode

Режим пошагового выполнения инструкций Instruction Stepping Mode – это режим отладки, позволяющий выполнять пошаговую отладку инструкций ассемблера ARM, «составляющих» текущую команду Си.

Рисунок 11: Значок Instruction Stepping Mode на панели инструментов Eclipse

Режим Instruction Stepping Mode включается нажатием на соответствующий значок на главной панели инструментов Eclipse, как показано на рисунке 11. После его включения появляется представление дизассемблера Disassembly, как показано на рисунке 12. Eclipse автоматически отображает инструкции ассемблера ARM, соответствующие текущей команде Си.