Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как понять, где виснет STM32F103?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zheka
Господа, работаю с STM32F103 и KEIL в режиме отладки.
Очень много вложенных циклов, ветвлений. Делаю менюшки и окошки. Глюков не избежать, иногда выйти из какого-то окошка не получалось - из за ошибок программа крутится в цикле, не получая команды выхода из него. Искал такие ошибки просто- шерстил вложенные циклы брейкпоинтами и находил тот цикл, в котором программа крутится.
А недавно программа стала зависать в одном и том же месте, но нерегулярно, в зависимости от положения звезд и фазы луны. Ни один цикл брейкпоинтом не ловится, ощущение, что программу кинуло куда-то не туда и контроллер просто встал.

Как KEILом вычислить этот участок кода?
AndyBig
А если просто остановить выполнение программы и посмотреть в каком месте остановилось?
octobus
Цитата(zheka @ Feb 24 2014, 19:46) *
А недавно программа стала зависать в одном и том же месте, но нерегулярно, в зависимости от положения звезд и фазы луны. Ни один цикл брейкпоинтом не ловится, ощущение, что программу кинуло куда-то не туда и контроллер просто встал.
Как KEILом вычислить этот участок кода?


Если брейкпойнтом не ловится, значит перепахивает память. Такое отловить сложно, надо организовать контроль памяти и писать туда строго по проверенным адресам. Еще вариант вычислить саму подпрограмму которая это творит, если ставить по очереди пустышки вместо подпрограмм, с фиктивными фиксированными данными на выходе, если есть данные.
Короче ищите кто валит память, виновников может быть много и механизм "перепахивания" может быть любой. Конкретно советовать трудно.
Golikov A.
да вставляйте вход - выход текстом на тестовый порт.
и локализуйте место где есть вход, нет выхода

В целом такое решается правильной архитектурой приложения, разбивкой действий на функции, и выводом отладочной информации на порт.
kovigor
Цитата(zheka @ Feb 24 2014, 19:46) *
Как KEILом вычислить этот участок кода?

Да, похоже, память что-то портит, например, у вас имеется непроинициализированный указатель.
Как отловить ? Светодиод или светодиодный индикатор, если есть возможность его подключить. Или вывод диагностической информации по UART. Например, в начале и в интересующих вас точках каждой функции выводить в порт по заранее определенному символу (своему для каждой тестовой "точки"). В случае проявления сбоя анализировать эти символы и их последовательности и принимать решение. Довольно эффективный метод, многократно проверенный на практике ...
x893
Стэк точно не переполняется ?
A. Fig Lee
Во первых, брейкпойнт на хардфолт хэндлер.
Во вторых, заведите пару переменных и периодически
их инициализировать:
Код
const char *func;
uint16_t line;

void f1 ()
{
  func = __func__;
line = __LINE__;
...
line = __LINE__;
...
line = __LINE__;
}

void f2()
{
  func = __func__;
...
}

и проверять, какую последнюю функцию программа посетила.
Ну и линию..
ar__systems
Менюшки и окошки надо на PC отлаживать, а не на чипе
demiurg_spb
Цитата(ar__systems @ Feb 25 2014, 04:05) *
Менюшки и окошки надо на PC отлаживать, а не на чипе
+1
megajohn
если операционка используется то по переключению задач контролировать стек выключающейся задачи
если mail-loop то общий стек и бряк поставить на изменение байтов по концу стека ( и соответсвенно по началу куска памяти )
если есть malloc то после заполнения полезно делать malloc_test и тоже самое по free

zheka
Разобрался. Виной всему оказалась кривая китайская графическая библиотека
Golikov A.
а программист применивший ее без проверки?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.