|
|
  |
Как понять, где виснет STM32F103? |
|
|
|
Feb 24 2014, 15:46
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, работаю с STM32F103 и KEIL в режиме отладки. Очень много вложенных циклов, ветвлений. Делаю менюшки и окошки. Глюков не избежать, иногда выйти из какого-то окошка не получалось - из за ошибок программа крутится в цикле, не получая команды выхода из него. Искал такие ошибки просто- шерстил вложенные циклы брейкпоинтами и находил тот цикл, в котором программа крутится. А недавно программа стала зависать в одном и том же месте, но нерегулярно, в зависимости от положения звезд и фазы луны. Ни один цикл брейкпоинтом не ловится, ощущение, что программу кинуло куда-то не туда и контроллер просто встал.
Как KEILом вычислить этот участок кода?
|
|
|
|
|
Feb 24 2014, 16:47
|
Частый гость
 
Группа: Guests
Сообщений: 122
Регистрация: 9-10-13
Из: Дубна
Пользователь №: 78 671

|
Цитата(zheka @ Feb 24 2014, 19:46)  А недавно программа стала зависать в одном и том же месте, но нерегулярно, в зависимости от положения звезд и фазы луны. Ни один цикл брейкпоинтом не ловится, ощущение, что программу кинуло куда-то не туда и контроллер просто встал. Как KEILом вычислить этот участок кода? Если брейкпойнтом не ловится, значит перепахивает память. Такое отловить сложно, надо организовать контроль памяти и писать туда строго по проверенным адресам. Еще вариант вычислить саму подпрограмму которая это творит, если ставить по очереди пустышки вместо подпрограмм, с фиктивными фиксированными данными на выходе, если есть данные. Короче ищите кто валит память, виновников может быть много и механизм "перепахивания" может быть любой. Конкретно советовать трудно.
|
|
|
|
|
Feb 25 2014, 00:53
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Во первых, брейкпойнт на хардфолт хэндлер. Во вторых, заведите пару переменных и периодически их инициализировать: Код const char *func; uint16_t line;
void f1 () { func = __func__; line = __LINE__; ... line = __LINE__; ... line = __LINE__; }
void f2() { func = __func__; ... } и проверять, какую последнюю функцию программа посетила. Ну и линию..
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|