|
WinAVR 200701.., Не могу понять где глюк |
|
|
|
Apr 18 2007, 14:40
|

кекс
     
Группа: Свой
Сообщений: 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, которые бы могли это объяснить?
|
|
|
|
|
 |
Ответов
|
Apr 18 2007, 19:26
|

учащийся
    
Группа: Свой
Сообщений: 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) могут быть прочитаны из другой ячейки .
--------------------
Зачем лаять на караван , когда на него можно плюнуть?
|
|
|
|
|
Apr 18 2007, 19:30
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(_artem_ @ Apr 18 2007, 20:26)  Это может показывать что значение stack pointer каким то образом портится. Почему? Наверно переменная которая портится, располагается в стеке. Если значение SP каким то образом сместилось , при обрашении к стеку , переменные (изза того что они адресуются относительно SP) могут быть прочитаны из другой ячейки . Нет, в GCC нет адесации относительно указателя стека. Анатолий.
|
|
|
|
|
Apr 18 2007, 19:42
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(_artem_ @ Apr 18 2007, 20:39)  Тогда как же в gcc адресуются временные переменные живущие на время выполнения функции и обитаюшие в стеке? Это называется Frame Pointer, и он живет в регистре Y. Анатолий.
|
|
|
|
|
Apr 18 2007, 19:59
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(_artem_ @ Apr 18 2007, 20:45)  Эт в смысле хард и софт тек в иар ? В avr-gcc один общий стек. Но для доступа к локальным переменным используеться регистр Y (FP). Анатолий.
|
|
|
|
|
Apr 18 2007, 20:53
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(defunct @ Apr 18 2007, 21:19)  Конкретную проблему с этой переменной я устранил другим путем - поменял условие события, т.о. надобность в U32 переменной отпала. Ребуты продолжаются.. На 99% ошибка в вашей программе. Только не подумайте что я заявляю что GCC совершенно безглючный. Чем отлаживаете? Поробуйте поставить брейк на переменной К, вернув ей тип long. Проверте работу с указателями, самая частая ошибка. Возможно гдето пропустили ILock()/ IUnlock(). Поодключайте в программе разные блоки. Ищите! Анатолий.
|
|
|
|
|
Apr 18 2007, 22:54
|

кекс
     
Группа: Свой
Сообщений: 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(); Оставлю на ночь с этим изменением, завтра отпишу рез-тат. Большое спасибо за помощь  Цитата(singlskv @ Apr 18 2007, 19:52)  А по-моему зря Вы убрали U32 переменную. Как Вы теперь узнаете что прога близка к перезагрузке ? Дык и раньше эти два события были мало взаимосвязаны. Т.е. программа могла продолжать работать с неверным K, а это для меня гораздо хуже чем перезагрузка..
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|