реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как понять, где виснет STM32F103?
zheka
сообщение Feb 24 2014, 15:46
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа, работаю с STM32F103 и KEIL в режиме отладки.
Очень много вложенных циклов, ветвлений. Делаю менюшки и окошки. Глюков не избежать, иногда выйти из какого-то окошка не получалось - из за ошибок программа крутится в цикле, не получая команды выхода из него. Искал такие ошибки просто- шерстил вложенные циклы брейкпоинтами и находил тот цикл, в котором программа крутится.
А недавно программа стала зависать в одном и том же месте, но нерегулярно, в зависимости от положения звезд и фазы луны. Ни один цикл брейкпоинтом не ловится, ощущение, что программу кинуло куда-то не туда и контроллер просто встал.

Как KEILом вычислить этот участок кода?
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Feb 24 2014, 15:56
Сообщение #2


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



А если просто остановить выполнение программы и посмотреть в каком месте остановилось?
Go to the top of the page
 
+Quote Post
octobus
сообщение Feb 24 2014, 16:47
Сообщение #3


Частый гость
**

Группа: Guests
Сообщений: 122
Регистрация: 9-10-13
Из: Дубна
Пользователь №: 78 671



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


Если брейкпойнтом не ловится, значит перепахивает память. Такое отловить сложно, надо организовать контроль памяти и писать туда строго по проверенным адресам. Еще вариант вычислить саму подпрограмму которая это творит, если ставить по очереди пустышки вместо подпрограмм, с фиктивными фиксированными данными на выходе, если есть данные.
Короче ищите кто валит память, виновников может быть много и механизм "перепахивания" может быть любой. Конкретно советовать трудно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 24 2014, 17:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



да вставляйте вход - выход текстом на тестовый порт.
и локализуйте место где есть вход, нет выхода

В целом такое решается правильной архитектурой приложения, разбивкой действий на функции, и выводом отладочной информации на порт.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Feb 24 2014, 17:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(zheka @ Feb 24 2014, 19:46) *
Как KEILом вычислить этот участок кода?

Да, похоже, память что-то портит, например, у вас имеется непроинициализированный указатель.
Как отловить ? Светодиод или светодиодный индикатор, если есть возможность его подключить. Или вывод диагностической информации по UART. Например, в начале и в интересующих вас точках каждой функции выводить в порт по заранее определенному символу (своему для каждой тестовой "точки"). В случае проявления сбоя анализировать эти символы и их последовательности и принимать решение. Довольно эффективный метод, многократно проверенный на практике ...
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 24 2014, 21:22
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Стэк точно не переполняется ?
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 25 2014, 00:53
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 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__;
...
}

и проверять, какую последнюю функцию программа посетила.
Ну и линию..


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Feb 25 2014, 01:05
Сообщение #8


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Менюшки и окошки надо на PC отлаживать, а не на чипе
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 25 2014, 05:34
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ar__systems @ Feb 25 2014, 04:05) *
Менюшки и окошки надо на PC отлаживать, а не на чипе
+1


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
megajohn
сообщение Feb 25 2014, 06:21
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



если операционка используется то по переключению задач контролировать стек выключающейся задачи
если mail-loop то общий стек и бряк поставить на изменение байтов по концу стека ( и соответсвенно по началу куска памяти )
если есть malloc то после заполнения полезно делать malloc_test и тоже самое по free



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
zheka
сообщение Feb 26 2014, 01:36
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Разобрался. Виной всему оказалась кривая китайская графическая библиотека
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 26 2014, 04:36
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а программист применивший ее без проверки?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016