Отладка программ

Введение в использование дебаггера и STM32CubeMonitor

Разберем (поверхностно) способы отладки программ на примере проекта из пердыдущего раздела (светодиод с ШИМ).

Дебагер CubeIDE

Дебагер, в первом приближении, умеет делать три полезные вещи:

  1. Ставить программу на паузу в точках остановки и показывать состояние локальных переменных

  2. Идти по программе по шагам (также с информацией о всех локальных переменных)

  3. Следить за значениями глобальных переменных

Точки остановки (breakpoints)

Добавим точку остановки на строке HAL_Delay(0.05); Для этого, можно нажать на свободное место справа от номера строки или нажать правой кнопкой на строку -> Toggle Breakpoint.

Пошаговый дебаггинг

Теперь попробуем из этого же места посмотреть, что делает наша программа по шагам. Для этого у нас есть три кнопки.

Тут нам понадобится только Step Over. Несколько раз нажав на нее, мы можем дойти до конца цикла while, и увидеть, что значение x стало 0.002.

В такой простой программе как это большой пользы такой метод не принесет, но при отладке сложных алгоритмов он крайне полезен.

Глобальные переменные

Уберем точку остановки (также, как и ставили), и будем следить за изменением x без остановки программы. Для этого, рассмотрим второй по популярности раздел панели дебагера - Live Ex. Откроем его, нажмем "Add new expression", впишем просто x, и тут же увидим "Failed to evaluate expression". Дело в том, что следить мы можем только за глобальными переменными. Ось X можно также для синусоиды назвать осью времени, поэтому заведем глобальную переменную double time; и в цикле сразу перед if(...) добавим time = x;. Конечно, тут это пример крайне натянутый, но поможет понять как пользоваться этим инструментом.

STM32CubeMonitor

Предполагается, что программу CubeMonitor вы уже установили (ссылка)

Открым программу, нас встретит вот такое окно:

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

Probe_Out / Probe_In

myVariables

Тут нам надо выбрать проект и переменные в нем, за которыми будем следить.

Допустим, нам хотелось бы увидеть синусоиду, по которой меняется яркость светодиода. Но следить мы можем только за значениями глобальных перменных. Поэтому заведем еще одну глобальную переменную double y;, в которую будем в нашем цикле записывать текущее значение регистра CCR: y = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);

Откроем опять myVariables и нажмем на "карандаш" рядом с названием нашего файла. В открывшемся окне есть списко всех глобальных переменных - ставим галочки рядом с time и y. Жмем "Обновить".

Last updated