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

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

## Дебагер CubeIDE

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

1. Ставить программу на паузу в точках остановки и показывать состояние локальных переменных
2. Идти по программе по шагам (также с информацией о всех локальных переменных)
3. Следить за значениями глобальных переменных

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

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

Далее, надо нажать на кнопку ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FILuu7JD7lrfUQiz1XfwQ%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=699078b4-04b4-40dc-a5c3-70f407eab421). Это пересоберет программу, зальет ее, и подключитя дебаггером. После этого, программа **встанет на паузу**. Нажмем ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FsYLuqtobVMOrX06VK3Cn%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=4d4a3d34-a744-45c8-8d9b-90ce3d45e6b2) - это скажет программе выполняться до точки остановки, после чего опять встать на паузу.

Программа должна была остановиться тут - ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2Fghzj5KdlP4KrB7GvJHZT%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=a4e5e194-445a-4f43-b6f7-00feb245d58e) . Теперь, справа есть меню дебагера. Первая вкладка в нем (`variables`) показывает локальные переменные в данной точке программы. На данный момент, это только `x`.

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2F3FtWw3kZK7EAVgS8hKeG%2F%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-13%20%D0%B2%2016.51.15.png?alt=media&#x26;token=4f70a22f-8b96-4bcb-a394-e08875b3353d" alt=""><figcaption><p>Обзор переменных</p></figcaption></figure>

Еще раз нажмем  ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FsYLuqtobVMOrX06VK3Cn%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=4d4a3d34-a744-45c8-8d9b-90ce3d45e6b2) - так как точка остановки находится в бесконечном цикле, мы попадем на эту же строку на следующей итерации. Теперь, значение переменной `x` должно быть `0.001`.

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

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

1. Step Into (![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2F7fS3y8tw7E5m2pQlsMj3%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=64ed8fb8-bbb1-4df2-89f4-94c8df966a9e)) - если на строке, на которой находится в данный момент дебаггер, вызывается какая либо функция, эта кнопка позволит нам "провалиться" внутрь, и посмотреть что конкретно происходит при вызове
2. Step Over (![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FEJaTSMq5KzLuJaYEWne5%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=d2592f33-4338-4293-81e4-4a8a0df8f22b)) - *самая часть используемая*. Переход к следующей инструкции.
3. Step Return (![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FHsrlwf1Ia1gsz5m6h8A9%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=4f1bff03-2321-49cc-bfba-3952bcf3975a)) - если до этого вы делали "Step Into", нажатие на эту кнопку выполнит текущую функию до конца и "вытолкнет" вас наверх, к следующей после нажатия "Step Into" инструкции

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

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

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

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

Теперь, вместо `х` впишем `time`. Тут мы сразу видим правильно значение. Теперь, так как мы убрали точку остановки, если нажать ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FsYLuqtobVMOrX06VK3Cn%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=4d4a3d34-a744-45c8-8d9b-90ce3d45e6b2), то программа просто будет работать, а изменение `time` мы будем видеть в реальном времени.

## STM32CubeMonitor

{% hint style="info" %}
Предполагается, что программу CubeMonitor вы уже установили ([ссылка](https://www.st.com/en/development-tools/stm32cubemonitor.html))
{% endhint %}

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

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FgbVxnKxb4YYmnG67pUKw%2F%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-13%20%D0%B2%2017.12.31.png?alt=media&#x26;token=b8b88a3a-28d2-4366-93b1-b0eaae608964" alt=""><figcaption></figcaption></figure>

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

#### Probe\_Out / Probe\_In

Нажмем на ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FvCjCF79enA7jauRLrDpk%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=76538686-4501-45c2-b770-1d94a330c6f5)

В открывшемся менем выберем **Probe Config -> Добавить новый probe ->** ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FYv3zGjup1RsXTEgJj0tx%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=2f799c21-9a62-4be7-a197-2cd462877c4c). Тут: **Probe name ->select a probe -> ST-Link ... -> Добавить**. Таким образом, мы добавили настройки для программатора.

Открыв ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FVSl9CagTrpztxY1LFZ3P%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=ee4931c4-9e41-4a6f-8cc1-49c56f90af7b), в **Probe Config** надо просто выбрать настроенный только что ST-Link.

#### myVariables

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

Нажмем ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2F2VH8XhyAHCboBm96kk5J%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=baeed5e5-7fe4-4c37-ad72-ee58fc5fe9e3). **Executable -> добавить новый exe-config ->** ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FYv3zGjup1RsXTEgJj0tx%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=2f799c21-9a62-4be7-a197-2cd462877c4c). **Folder** - папка вашего проекта *и в ней папка с названием билда* (обычно Debug). **File -> Select a File -> \*.elf**. Далее назначаем ему любое имя и нажимаем "**Добавить**".

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

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

Все что осталось - нажать ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FfSumyKtn1jQYrFd9doAi%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=dbfe00c3-9d2c-4e36-b4b8-972ce0ba3327)(в случае каких либо проблем на этом ээтапе помогает вынуть-вставить программатор). Теперь - ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FKpvjv3LqgIsKKxoNbBH4%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=fb1c9f7d-b0ec-4d33-8e9a-11dcab9015b0).

Думаю, название кнопок в открывшемся окне говорит само за себя. Жмем **Start Acquisition** и если программа на микроконтроллере работает и все прошло успешно, наблюдаем за красивой синусоидой. Если поставить галочку у ![](https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FBO0AKINCLVl5GCz6NW7m%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=da3ad2ed-2dfe-4a0f-87b7-723c49d99963), то наведясь мышкой на график можно видеть значения всех переменных в выбранный момент времени:

<figure><img src="https://3551773033-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBjLyfPc4FcQUfXFi5fQr%2Fuploads%2FgsH2NSsSgzeAy3wWFawa%2F%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202023-10-13%20%D0%B2%2017.58.46.png?alt=media&#x26;token=a34a79dc-f8a7-4788-ae0c-a867bd9ccced" alt=""><figcaption><p>Графики переменных</p></figcaption></figure>
