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

 
 
> 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
Ответов
_artem_
сообщение Apr 18 2007, 19:26
Сообщение #2


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Цитата(defunct @ Apr 18 2007, 14:40) *
2. Заметил, что некая long переменная K, которую обновляю в основном цикле программы:
K = X; (где X long переменная равная xxxx, и X = (volatile long)Y; ) иногда принимает значение: 0xA5A5xxxx, когда ожидается 0x0000xxxx. (переменные X и Y - имеют правильные значения)


Это может показывать что значение stack pointer каким то образом портится. Почему? Наверно переменная которая портится, располагается в стеке. Если значение SP каким то образом сместилось , при обрашении к стеку , переменные (изза того что они адресуются относительно SP) могут быть прочитаны из другой ячейки .


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 18 2007, 19:30
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(_artem_ @ Apr 18 2007, 20:26) *
Это может показывать что значение stack pointer каким то образом портится. Почему? Наверно переменная которая портится, располагается в стеке. Если значение SP каким то образом сместилось , при обрашении к стеку , переменные (изза того что они адресуются относительно SP) могут быть прочитаны из другой ячейки .


Нет, в GCC нет адесации относительно указателя стека.

Анатолий.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Apr 18 2007, 19:39
Сообщение #4


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Цитата(aesok @ Apr 18 2007, 19:30) *
Нет, в GCC нет адесации относительно указателя стека.

Анатолий.


Тогда как же в gcc адресуются временные переменные живущие на время выполнения функции и обитаюшие в стеке?

Допустим из одной функции вызывается вторая. Временные переменные что первой функции обитают в стеке. Если стек во время выполнения вложенной функции запишется неправильное значение , то по возврату из вложенной функции когда основная функция будет считывать переменные - адрес памяти будет другим , может быть и то место , заполненное шахматным кодом для дебага.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 18 2007, 19:42
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(_artem_ @ Apr 18 2007, 20:39) *
Тогда как же в gcc адресуются временные переменные живущие на время выполнения функции и обитаюшие в стеке?

Это называется Frame Pointer, и он живет в регистре Y.

Анатолий.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Apr 18 2007, 19:45
Сообщение #6


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Цитата(aesok @ Apr 18 2007, 19:42) *
Это называется Frame Pointer, и он живет в регистре Y.

Анатолий.


Эт в смысле хард и софт тек в иар ? Не знал. Ну тогда по всей видимости портится этот регистр.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 18 2007, 19:59
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(_artem_ @ Apr 18 2007, 20:45) *
Эт в смысле хард и софт тек в иар ?


В avr-gcc один общий стек. Но для доступа к локальным переменным используеться регистр Y (FP).

Анатолий.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 18 2007, 20:19
Сообщение #8


кекс
******

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



Уточню еще один момент. 0xA5A5xxxx проявляется не при первом обновлении переменной "K"... При первом - все в порядке.. Обращений к "K" в других местах программы - нет.

Конкретную проблему с этой переменной я устранил другим путем - поменял условие события, т.о. надобность в U32 переменной отпала. Ребуты продолжаются..
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 18 2007, 20:53
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(defunct @ Apr 18 2007, 21:19) *
Конкретную проблему с этой переменной я устранил другим путем - поменял условие события, т.о. надобность в U32 переменной отпала. Ребуты продолжаются..


На 99% ошибка в вашей программе. Только не подумайте что я заявляю что GCC совершенно безглючный.

Чем отлаживаете? Поробуйте поставить брейк на переменной К, вернув ей тип long. Проверте работу с указателями, самая частая ошибка. Возможно гдето пропустили ILock()/ IUnlock(). Поодключайте в программе разные блоки.

Ищите!

Анатолий.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 18 2007, 22:54
Сообщение #10


кекс
******

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



Цитата(aesok @ Apr 18 2007, 19:53) *
На 99% ошибка в вашей программе. Только не подумайте что я заявляю что GCC совершенно безглючный.

Это хорошо! А то компилятор менять совсем не хотелось.

Цитата
Чем отлаживаете? Поробуйте поставить брейк на переменной К, вернув ей тип long. Проверте работу с указателями, самая частая ошибка.

Dragon'ом

Цитата
Возможно гдето пропустили ILock()/ IUnlock(). Поодключайте в программе разные блоки.

Да да, я присмотрелся к коду представленному выше, и похоже там промах с ILock (не в том месте стоит).

Код
if (slot[i] != NULL)
{
   U8 iStatus = ILock()
   __func *temp = __slot[i];
   __slot[i] = NULL;
   IUnlock( iStatus );
   temp();
}


между проверкой на NULL и запретом прерываний slot мог обнулиться..
Написал так:

Код
U8 iStatus = ILock()
__func *temp = __slot[i];
__slot[i] = NULL;
IUnlock(iStatus);
if (temp != NULL)
    temp();


Оставлю на ночь с этим изменением, завтра отпишу рез-тат.
Большое спасибо за помощь cheers.gif


Цитата(singlskv @ Apr 18 2007, 19:52) *
А по-моему зря Вы убрали U32 переменную.
Как Вы теперь узнаете что прога близка к перезагрузке ?

Дык и раньше эти два события были мало взаимосвязаны. Т.е. программа могла продолжать работать с неверным K, а это для меня гораздо хуже чем перезагрузка..
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
|- - singlskv   Цитата(defunct @ Apr 18 2007, 21:19) Уточ...   Apr 18 2007, 20:52
|- - singlskv   Цитата(defunct @ Apr 18 2007, 23:54) Дык ...   Apr 19 2007, 21:40
- - defunct   Да, проблема-таки была связана с ILock! С изме...   Apr 19 2007, 22:40
|- - singlskv   Цитата(defunct @ Apr 19 2007, 23:40) Да, ...   Apr 19 2007, 22:54
|- - defunct   Цитата(singlskv @ Apr 19 2007, 21:54) А с...   Apr 19 2007, 23:25
|- - singlskv   Цитата(defunct @ Apr 20 2007, 00:25) Стек...   Apr 19 2007, 23:58
|- - 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 Текстовая версия Сейчас: 22nd July 2025 - 22:51
Рейтинг@Mail.ru


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