|
|
  |
"Правильный" софт ресет, который почти как хард ресет |
|
|
|
Nov 12 2008, 13:57
|
Частый гость
 
Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416

|
Добрый день. Подскажите пожалуйста, как правильно сделать софтресет, а то возникла такая проблема:
Есть прибор, который по усарту может получить команду сброса, после которой должен соответсвенно сбросится. Программа написана на асме, и когда я получаю эту команду, то просто jmpом прыгаю в самый первый байт кода. После этого у меня опять происходит инициализация устройства и программа как бы начинается заново. Всё было хорошо года два, пока сегодня не заметили странную штуку - после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо.
Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?
|
|
|
|
|
Nov 12 2008, 14:09
|
Частый гость
 
Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416

|
Цитата(Igor26 @ Nov 12 2008, 17:02)  А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT. Хм... А вот это мысль! Эх, как бы научится мыслить шире?...А после сброса по сторожевому таймеру сбросятся ли его настройки?
|
|
|
|
|
Nov 12 2008, 14:32
|

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

|
Цитата(МП41 @ Nov 12 2008, 17:15)  Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо  , И при определенных условиях получить чудеса, ибо вывод по сбросу станет входом и может не выполниться требование на минимальную длительность импульса на входе RESET. Цитата(МП41 @ Nov 12 2008, 17:15)  При старте не мешало бы оперативку чистить, в которой и стек находится. А вот это зачем? Неужели вменяемая программа полагается, что в ОЗУ после старта будут какие-то конкретные значения? Как можно что-то прочитать со стека, предварительно не положив на него это что-то?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 12 2008, 15:00
|

Участник

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204

|
Цитата(UniBomb @ Nov 12 2008, 17:57)  jmpом прыгаю в самый первый байт кода. А первый байт - команда cli или ... ? В инициализации что-то не продумано, лично мне так кааацца. Цитата(UniBomb @ Nov 12 2008, 17:57)  хочу спросить - как сбросить стек? "В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется).
|
|
|
|
|
Nov 12 2008, 15:37
|

Участник

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204

|
Цитата(МП41 @ Nov 12 2008, 19:04)  Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д. Первым делом запрещаются прерывания - я как раз об этом. :-)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|