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

 
 
> Зависание ATMega328P
Ioann_II
сообщение Mar 12 2017, 03:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Здравствуйте, Уважаемые коллеги.

Столкнулся со странным зависанием упомянутой микросхемы.
Основной цикл перестаёт выполняться, но вот прерывание продолжает работать.
Не программное, т.к. каждый раз останаливается в разном месте.
Конденсаторы по питанию, на кварце стоят.

Кто сталкивался?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aiwa
сообщение Mar 14 2017, 08:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(adnega @ Mar 14 2017, 07:07) *
Видимо, в сравнении с ASM, где каждая строчка самовыстраданная)

Ну для AVR можно и на СИ каждую строку самовыстрадать.
Да и вполне разумно: код небольшой, в дальнейшем дешевле выйдет.
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 14 2017, 11:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Вот сейчас вывел на LCD содержимое SP. Жду. Пока что светится 2301=0x8fd. При старте программы SP=0x8ff. Вход в main по CALL, так что пока что вроде норм... По наблюдениям отпишусь.
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 14 2017, 23:44
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Спустя 6 часов работы зависло. SP=2301.
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 15 2017, 23:39
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Снова, спустя 11 часов...
Прерывание на приём символа от UART работает - в обработчик вставил код для подсвечивания светодиода на время обработки прерывания.
Средняя загрузка ЦП обработчиком 0,22%, пиковая - 14%.
Передача не происходит в режиме ожидания.
От таймера прерывание тоже происходит (оно генерирует смещение на LCD, без него LCD потухнет).

zombi, насчёт "чужих косяков" - согласен. Уже были "чудеса"
в этой программе, пока не избавился от применения библиотечной ф-ции sprintf.
Пока она применялась в одном только месте - всё работало... как ещё в одно поставил - начались "чудеса".
Избавился от sprintf - и "чудеса" пропали...

сейчас склоняюсь к полному переписыванию библиотечных функций....

Genadi Zawidowski, Код выкладывать смысла нет - слишком большой. Atmega занята на 72%. Всё равно столько смотреть не станете...

Ещё вот с WatchDog проблема... может подскажете...вот тема:
https://electronix.ru/forum/index.php?showtopic=140918


Сообщение отредактировал Ioann_II - Mar 15 2017, 23:41
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 16 2017, 06:58
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Ioann_II @ Mar 16 2017, 01:39) *
Пока она применялась в одном только месте - всё работало... как ещё в одно поставил - начались "чудеса".
Избавился от sprintf - и "чудеса" пропали...
"Еще одно место" - прерывание? Какой компилятор используете? Это я к тому, что IAR использует два стека (один для возвратов и второй для данных), gcc использует один. sprintf() очень охочая до стека функция. Если используете gcc, то стек вам увеличивать уже некуда, возможно стоит пересмотреть алгоритм чтобы уменьшить занимаемую глобальными переменными память или хотя бы посмотреть, не затирается ли память сразу после глобальных переменных - это будет говорить о налезании стека на данные и разрушении содержимого стека. Если используете ИАР - можно попробовать увеличить один из стеков за счет другого.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ioann_II
сообщение Mar 16 2017, 12:40
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 7-06-05
Пользователь №: 5 797



Цитата(Сергей Борщ @ Mar 16 2017, 09:58) *
"Еще одно место" - прерывание? Какой компилятор используете? Это я к тому, что IAR использует два стека (один для возвратов и второй для данных), gcc использует один. sprintf() очень охочая до стека функция. Если используете gcc, то стек вам увеличивать уже некуда, возможно стоит пересмотреть алгоритм чтобы уменьшить занимаемую глобальными переменными память или хотя бы посмотреть, не затирается ли память сразу после глобальных переменных - это будет говорить о налезании стека на данные и разрушении содержимого стека. Если используете ИАР - можно попробовать увеличить один из стеков за счет другого.

Конечно-же, в прерывании вообще никаких функций не вызывается. Оба места - 2 разных автомата состояний в основном цикле.
Компилятор ImageCraft.
По памяти:
data 258. bytes (rel,con,ram)
bss 1731. bytes (rel,con,ram)
ИТОГО 1989байт, остатся 59 байт... для стека.
ram_end = 0x8ff
hwstk_size = 0x28

Цитата(aiwa @ Mar 16 2017, 13:10) *
Это совершенно бесполезная информация. Зависание произошло после вывода на LCD, и если оно стало результатом порчи стека Вы этого не увидите.
Для проверки целостности лучше заливать стек паттерном и проверять его содержимое.
Как залить - тема тут была ранее.
Если используете WatchDog, посмотрите как часто Вы его передергиваете. Я бы порекомендовал его временно вообще отключить.


SP покажет только если стек "не уравновешен", поэтому не стал сразу его выводить...
Эта тема?
https://electronix.ru/forum/index.php?showt...%E5%F0%ED%EE%EC

С WatchDog проблема.... я писал ссылку на тему.
https://electronix.ru/forum/index.php?showtopic=140918
Не получается его задействовать, как надо - если в режиме прерывания, то работает, а если в режиме СБРОС - то проц просто завешивается. Это в тестовом проекте пробовал.

И самое забавное - что как "зависнет", точно так-же само и "отвисает".... хотя, может, не всегда...
Ещё момент - UART подключен через коммутатор, т.е. есть несколько (3 источника данных). Переключение асинхронное по отношению к данным.
Сейчас думаю попробовать при переключении коммутатора, чистить регистры приёмника. Хотя, раз прерывание по приёму продолжает работать, то, навряд-ли что-то изменится.

Сообщение отредактировал Ioann_II - Mar 16 2017, 12:41
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ioann_II   Зависание ATMega328P   Mar 12 2017, 03:25
- - Палыч   Ну, почему же "не программное"? Как вари...   Mar 12 2017, 13:14
|- - Ioann_II   Обработчики прерываний на месте и в порядке. Остан...   Mar 12 2017, 14:23
|- - zombi   Цитата(Ioann_II @ Mar 12 2017, 17:23) Ост...   Mar 14 2017, 00:38
- - pavel-pervomaysk   Код покажите. Если прерывание постоянно куда-то ув...   Mar 13 2017, 06:33
- - aiwa   Цитата(zombi @ Mar 14 2017, 02:38) А если...   Mar 14 2017, 03:08
|- - adnega   Цитата(aiwa @ Mar 14 2017, 06:08) Чем же ...   Mar 14 2017, 05:07
- - Genadi Zawidowski   Код в студию, весь.   Mar 15 2017, 00:11
- - Genadi Zawidowski   По содержанию сообщений было не понятно, что речь ...   Mar 16 2017, 06:32
- - aiwa   Цитата(Ioann_II @ Mar 15 2017, 01:44) Спу...   Mar 16 2017, 10:10
- - aiwa   Цитата(Ioann_II @ Mar 16 2017, 14:21) Ком...   Mar 16 2017, 12:42
|- - Ioann_II   Цитата(aiwa @ Mar 16 2017, 15:42) Значит ...   Mar 16 2017, 14:06
- - aiwa   Цитата(Ioann_II @ Mar 16 2017, 16:06) Не ...   Mar 16 2017, 15:45
- - Ioann_II   Цитата(aiwa @ Mar 16 2017, 18:45) Некотор...   Mar 17 2017, 12:35
- - Ioann_II   Ну, пока что сутки отработало без зависаний... По...   Mar 18 2017, 13:00
- - Ioann_II   Зависать перестало. Причина была в использовании п...   Mar 19 2017, 21:34
- - demiurg_spb   ImageCraft - не самый лучший выбор. Хуже разве что...   Mar 20 2017, 14:39
- - zombi   Цитата(demiurg_spb @ Mar 20 2017, 18:39) ...   Mar 20 2017, 18:40


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

 


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


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