Отладка программ
Введение в использование дебаггера и STM32CubeMonitor
Last updated
Введение в использование дебаггера и STM32CubeMonitor
Last updated
Разберем (поверхностно) способы отладки программ на примере проекта из пердыдущего раздела (светодиод с ШИМ).
Дебагер, в первом приближении, умеет делать три полезные вещи:
Ставить программу на паузу в точках остановки и показывать состояние локальных переменных
Идти по программе по шагам (также с информацией о всех локальных переменных)
Следить за значениями глобальных переменных
Добавим точку остановки на строке HAL_Delay(0.05);
Для этого, можно нажать на свободное место справа от номера строки или нажать правой кнопкой на строку -> Toggle Breakpoint
.
Далее, надо нажать на кнопку . Это пересоберет программу, зальет ее, и подключитя дебаггером. После этого, программа встанет на паузу. Нажмем - это скажет программе выполняться до точки остановки, после чего опять встать на паузу.
Программа должна была остановиться тут - . Теперь, справа есть меню дебагера. Первая вкладка в нем (variables
) показывает локальные переменные в данной точке программы. На данный момент, это только x
.
Теперь попробуем из этого же места посмотреть, что делает наша программа по шагам. Для этого у нас есть три кнопки.
Тут нам понадобится только Step Over. Несколько раз нажав на нее, мы можем дойти до конца цикла while
, и увидеть, что значение x
стало 0.002
.
В такой простой программе как это большой пользы такой метод не принесет, но при отладке сложных алгоритмов он крайне полезен.
Уберем точку остановки (также, как и ставили), и будем следить за изменением x
без остановки программы. Для этого, рассмотрим второй по популярности раздел панели дебагера - Live Ex
. Откроем его, нажмем "Add new expression", впишем просто x
, и тут же увидим "Failed to evaluate expression". Дело в том, что следить мы можем только за глобальными переменными. Ось X можно также для синусоиды назвать осью времени, поэтому заведем глобальную переменную double time;
и в цикле сразу перед if(...)
добавим time = x;
. Конечно, тут это пример крайне натянутый, но поможет понять как пользоваться этим инструментом.
Предполагается, что программу CubeMonitor вы уже установили (ссылка)
Открым программу, нас встретит вот такое окно:
Это диаграмма процесса сбора данных с контроллера, и в большинстве случаев, такого простого варианта вполне достаточно. Рассмотрим, как настроить его для нашего проекта.
Тут нам надо выбрать проект и переменные в нем, за которыми будем следить.
Допустим, нам хотелось бы увидеть синусоиду, по которой меняется яркость светодиода. Но следить мы можем только за значениями глобальных перменных. Поэтому заведем еще одну глобальную переменную double y;
, в которую будем в нашем цикле записывать текущее значение регистра CCR: y = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);
Откроем опять myVariables и нажмем на "карандаш" рядом с названием нашего файла. В открывшемся окне есть списко всех глобальных переменных - ставим галочки рядом с time
и y
. Жмем "Обновить".
Еще раз нажмем - так как точка остановки находится в бесконечном цикле, мы попадем на эту же строку на следующей итерации. Теперь, значение переменной x
должно быть 0.001
.
Step Into () - если на строке, на которой находится в данный момент дебаггер, вызывается какая либо функция, эта кнопка позволит нам "провалиться" внутрь, и посмотреть что конкретно происходит при вызове
Step Over () - самая часть используемая. Переход к следующей инструкции.
Step Return () - если до этого вы делали "Step Into", нажатие на эту кнопку выполнит текущую функию до конца и "вытолкнет" вас наверх, к следующей после нажатия "Step Into" инструкции
Теперь, вместо х
впишем time
. Тут мы сразу видим правильно значение. Теперь, так как мы убрали точку остановки, если нажать , то программа просто будет работать, а изменение time
мы будем видеть в реальном времени.
Нажмем на
В открывшемся менем выберем Probe Config -> Добавить новый probe -> . Тут: Probe name ->select a probe -> ST-Link ... -> Добавить. Таким образом, мы добавили настройки для программатора.
Открыв , в Probe Config надо просто выбрать настроенный только что ST-Link.
Нажмем . Executable -> добавить новый exe-config -> . Folder - папка вашего проекта и в ней папка с названием билда (обычно Debug). File -> Select a File -> *.elf. Далее назначаем ему любое имя и нажимаем "Добавить".
Все что осталось - нажать (в случае каких либо проблем на этом ээтапе помогает вынуть-вставить программатор). Теперь - .
Думаю, название кнопок в открывшемся окне говорит само за себя. Жмем Start Acquisition и если программа на микроконтроллере работает и все прошло успешно, наблюдаем за красивой синусоидой. Если поставить галочку у , то наведясь мышкой на график можно видеть значения всех переменных в выбранный момент времени: