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

 
 
> WinAVR 200701.., Не могу понять где глюк
defunct
сообщение Apr 18 2007, 14:40
Сообщение #1


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Чип M168, компилирую с опцией -Os, с O0 использовать не могу т.к. hex получается больше 16k..
Девайс периодически перезагружается, MCUSR показывает Reset Source - 0 (прыжек на адрес 0), через ~1-8 часов работы..

В main при инициализации заполнил область стека тестовым паттерном 0xA5 после этого:
1. девайс начал иногда вместо ребута подвисать (через те же 1-8 часов работы), прерывания продолжают работать.. (WatchDog пока не включаю чтоб не мешал)
2. Заметил, что некая long переменная K, которую обновляю в основном цикле программы:
K = X; (где X long переменная равная xxxx, и X = (volatile long)Y; ) иногда принимает значение: 0xA5A5xxxx, когда ожидается 0x0000xxxx. (переменные X и Y - имеют правильные значения)

Промониторил стек после очередного ребута - за границу 256 байт - не выходит и не пересекается с другими структурами данных.
float, sprintf, printf в программе не применяю.

Собсно вопрос, может есть известные баги WinAVR 200701xx, которые бы могли это объяснить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Apr 19 2007, 22:40
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Да, проблема-таки была связана с ILock! С изменением приведенным выше девайс уже проработал 24 часа без ребутов.

Причина банальна - дребезг... Счетчик секунд который чуть-чуть опережал показание RTC это подтвердил.
Прерывание, которое должно происходить строго раз в секунду - иногда (очень редко) происходило едва ли не сразу после предыдущего. Если в момент запуска callback'а происходило повторное прерывание с повторной установкой этого же callback'a, то старый еще не запущенный но уже проверенный на NULL удалялся из очереди (у меня не допускается держать в очереди дубликаты событий) - ну а потом уже NULL() - и ребут....

Подправил расположение ILock и сместил время выполнения события на 20ms.
SetCallback( ..., 20, ...);
Теперь работает все как надо.

Еще раз спасибо всем кто принимал участие в обсуждении! cheers.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 19 2007, 22:54
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Apr 19 2007, 23:40) *
Да, проблема-таки была связана с ILock! С изменением приведенным выше девайс уже проработал 24 часа без ребутов.

Причина банальна - дребезг... Счетчик секунд который чуть-чуть опережал показание RTC это подтвердил.
Прерывание, которое должно происходить строго раз в секунду - иногда (очень редко) происходило едва ли не сразу после предыдущего. Если в момент запуска callback'а происходило повторное прерывание с повторной установкой этого же callback'a, то старый еще не запущенный но уже проверенный на NULL удалялся из очереди (у меня не допускается держать в очереди дубликаты событий) - ну а потом уже NULL() - и ребут....

Подправил расположение ILock и сместил время выполнения события на 20ms.
SetCallback( ..., 20, ...);
Теперь работает все как надо.

Еще раз спасибо всем кто принимал участие в обсуждении! cheers.gif

А стек при этом таки переполнялся или нет ?
прошу прощения за навязчивость, просто вопрос возникновения таких
ошибок меня сейчас очень интересует, точнее интересуют способы борьбы с такими ошибками...
вобщем вопрос в том как можно програмно конролировать выполнение собственной программы

типа статистику собираю, а Ваш случай интересный...
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 19 2007, 23:25
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Apr 19 2007, 21:54) *
А стек при этом таки переполнялся или нет ?

Стек не переполнялся это 100%, и объяснить появление 0xA5A5xxxx я не могу, кроме как предположить, что GCC при оптимизации держит константу 0, где-то в памяти, а при моем вмешательстве с заполнием стека паттерном "заполнило" и ее. (у меня там была довольно существенная прослойка "гуляющей" памяти - байт в 200 между стеком и переменными).

Сейчас я затрудняюсь сказать память портилась до перезагрузки или после.. Скорее всего после - тогда это многое объясняет, т.к инициализация проходила при разрешенных прерываниях.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 19 2007, 23:58
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Apr 20 2007, 00:25) *
Стек не переполнялся это 100%, и объяснить появление 0xA5A5xxxx я не могу, кроме как предположить, что GCC при оптимизации держит константу 0, где-то в памяти, а при моем вмешательстве с заполнием стека паттерном "заполнило" и ее. (у меня там была довольно существенная прослойка "гуляющей" памяти - байт в 200 между стеком и переменными).

Сейчас я затрудняюсь сказать память портилась до перезагрузки или после.. Скорее всего после - тогда это многое объясняет, т.к инициализация проходила при разрешенных прерываниях.

GCC держит константу 0 в регистре R1 кажись,
вроде бы были сообщения от userов что при определенных условиях там может оказатся не 0.
но это бабушка на двое сказала...

Вобщем если Вы пнете в меня своим hexом хотябы то мне будет очень интересно посмотреть
чего там протсходит, а если елфом то тады ваще очень интересно,
обесчаю перед прочтением Вашего кода его съесть...smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- defunct   WinAVR 200701..   Apr 18 2007, 14:40
- - aesok   Цитата(defunct @ Apr 18 2007, 15:40) 2. З...   Apr 18 2007, 15:02
- - defunct   Кодvolatile U32 rtc_time; struct { U32 sys_...   Apr 18 2007, 15:47
|- - aesok   Цитата(defunct @ Apr 18 2007, 16:47) RTC_...   Apr 18 2007, 17:15
|- - defunct   Цитата(aesok @ Apr 18 2007, 16:15) А очер...   Apr 18 2007, 18:02
|- - aesok   Цитата(defunct @ Apr 18 2007, 19:02) что ...   Apr 18 2007, 18:16
- - _artem_   Цитата(defunct @ Apr 18 2007, 14:40) 2. З...   Apr 18 2007, 19:26
|- - aesok   Цитата(_artem_ @ Apr 18 2007, 20:26) Это ...   Apr 18 2007, 19:30
|- - _artem_   Цитата(aesok @ Apr 18 2007, 19:30) Нет, в...   Apr 18 2007, 19:39
|- - aesok   Цитата(_artem_ @ Apr 18 2007, 20:39) Тогд...   Apr 18 2007, 19:42
|- - _artem_   Цитата(aesok @ Apr 18 2007, 19:42) Это на...   Apr 18 2007, 19:45
|- - aesok   Цитата(_artem_ @ Apr 18 2007, 20:45) Эт в...   Apr 18 2007, 19:59
|- - defunct   Уточню еще один момент. 0xA5A5xxxx проявляется не ...   Apr 18 2007, 20:19
|- - singlskv   Цитата(defunct @ Apr 18 2007, 21:19) Уточ...   Apr 18 2007, 20:52
|- - aesok   Цитата(defunct @ Apr 18 2007, 21:19) Конк...   Apr 18 2007, 20:53
|- - defunct   Цитата(aesok @ Apr 18 2007, 19:53) На 99%...   Apr 18 2007, 22:54
|- - singlskv   Цитата(defunct @ Apr 18 2007, 23:54) Дык ...   Apr 19 2007, 21:40
|- - defunct   Цитата(singlskv @ Apr 19 2007, 22:58) GCC...   Apr 20 2007, 00:03
|- - singlskv   Цитата(defunct @ Apr 20 2007, 01:03) При ...   Apr 20 2007, 00:13
- - _artem_   Я бы блокировал прерывания прежде чем проверять оч...   Apr 20 2007, 01:32
|- - defunct   Цитата(_artem_ @ Apr 20 2007, 00:32) Я бы...   Apr 20 2007, 02:34
- - Serjio   Еще можно добавить, что переменные, которые модифи...   Apr 21 2007, 20:16


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

 


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


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