Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Перезагрузка контроллера в случайное время в одном месте

Непрочитано 02.06.2011, 15:42  
Sadin
Частый гость
 
Регистрация: 21.05.2010
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Sadin на пути к лучшему
Злость Перезагрузка контроллера в случайное время в одном месте

Всем привет!
Вознила у меня проблема. Исходные данные:
- контроллер Renesas H8S/2166 (16-ти битный)
- проект с большим количеством исходников (память 512КБ забита почти полностью)
- внешняя ОЗУ (данных)
- компилится всё это дело при помощи KPIT GNU Tools...
- схематически код выглядит так:

void funcA(int a){
...
debug_putch('A');
funcB(a);
// вот сюда уже может не вернуться!
// enable_interrupt();
debug_putch('a');
...
}

void funcB(int a){
debug_putch('B');
...
funcC(a);
...
debug_putch('b');
// disable_interrupt();
}


На отладочном порте (выводится в терминал по СОМ) вывод:
ABbaABbaABbaABbaABbaABb(перезагрузка)ABbaABba...

Что проверялось:
- стек пойнтер
- адрес возврата
- отключал прерывания
- регистры (те, которые необходимо сохранять/восстанавливать при входе/выходе фунции)
С упроством пьяного контроллер перезагружается в случайное время (т.е. может проходить через этот кусок кода хоть раз 100, а может пройтись парочку и на третьем ребутнуться) в одном и том же месте - все, что внутри funcB() выполняется на ура, а после вызова funcB() внутри funcА() - ничего.
Еще парочка пояснений: фунции в разных файлах (объектниках значица тоже), размер стека - большой (точно хватает, особенно учитывая тот факт, что адрес возврата проверяю во время выполнения - совпадает).
Реклама:

Последний раз редактировалось Sadin; 02.06.2011 в 16:02.
Sadin вне форума  
Непрочитано 02.06.2011, 15:49  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

У меня было такое с одним пиком. Камень был поджареный. Замена помогла.
Easyrider83 вне форума  
Непрочитано 02.06.2011, 15:53  
Sadin
Частый гость
 
Регистрация: 21.05.2010
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Sadin на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

Easyrider83, все бы ничего, но это на всех камнях, которые есть в наличае...
Sadin вне форума  
Непрочитано 02.06.2011, 15:55  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

А перезагрузку по переполнению стека отключить можно?
Easyrider83 вне форума  
Непрочитано 02.06.2011, 16:00  
Sadin
Частый гость
 
Регистрация: 21.05.2010
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Sadin на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

А почему Вы решили, что стек переполняется?
Я сначала тоже думал, что переполняется - проверка показала, что с этим все в порядке (остаётся еще 30% стека после 2х суток тестирования, а перегрузиться может через 15 секунд, а может через час).
Думал, что кто-то записывает в эту область стека что-то своё - нифига, адрес возврата лежит себе спокойно.
Сравнивал указатели на стек в funcB при входе и выходе - одинаковые...
Sadin вне форума  
Непрочитано 02.06.2011, 16:15  
XoDoK11
Гражданин KAZUS.RUN
 
Аватар для XoDoK11
 
Регистрация: 17.08.2008
Сообщений: 770
Сказал спасибо: 52
Сказали Спасибо 450 раз(а) в 202 сообщении(ях)
XoDoK11 на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

// enable_interrupt();
...
// disable_interrupt();
А планируется как, тоже в разных функциях?
Лучше написать 1 функцию (А+В+С)
enable_interrupt();
...
что-то очень важное
disable_interrupt();
XoDoK11 вне форума  
Непрочитано 02.06.2011, 16:39  
Sadin
Частый гость
 
Регистрация: 21.05.2010
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Sadin на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

Сообщение от XoDoK11 Посмотреть сообщение
// enable_interrupt();
...
// disable_interrupt();
А планируется как, тоже в разных функциях?
нет, я потому и коменты поставил... изначально такого не планировалось и все критические места обрабатываются так, как вы написали
Sadin вне форума  
Непрочитано 02.06.2011, 16:55  
kittec
Гражданин KAZUS.RUN
 
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
kittec на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

А Вы, Sadin, уверены что проблема в программе, а не в БП или переходнике МК-СОМ.
kittec вне форума  
Непрочитано 02.06.2011, 17:09  
Sadin
Частый гость
 
Регистрация: 21.05.2010
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Sadin на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте.

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

для пояснения напишу - фунции debug_putch() в исходнике также (как и enable_interrupt() и disable_interrupt()) отсутствуют!
Sadin вне форума  
Непрочитано 02.06.2011, 19:18  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Перезагрузка контроллера в случайное время в одном месте

Сообщение от Sadin Посмотреть сообщение
void funcB(int a){
debug_putch('B');
...
funcC(a);
...
debug_putch('b');
// disable_interrupt();
}
Все просто, ошибка может быть в
Цитата:
funcC(a);
По крайней мере пока ее код не покажете.
CodeNameHawk вне форума  
 

Метки
reboot renesas h8s 2166
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 18:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.