Перейти к содержанию
    

"Правильный" софт ресет

Добрый день. Подскажите пожалуйста, как правильно сделать софтресет, а то возникла такая проблема:

 

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

 

Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT.

 

Хм... А вот это мысль! Эх, как бы научится мыслить шире?...

 

А после сброса по сторожевому таймеру сбросятся ли его настройки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо :), но это уже аппаратная доработка. При старте не мешало бы оперативку чистить, в которой и стек находится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

МП41, аппаратно к сожалению уже ничего не сделать, так как прибор уже давно в серии. А вот насчёт чистки оперативки, в которой стек находится - как это правильно делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Организовать цикл N-раз (по размеру SRAM-$60) в нём собственно стирание ячейки с постинкрементом. А перед этим не забыть записать в Y-регистр значение $60 (начало оперативки).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо :),
И при определенных условиях получить чудеса, ибо вывод по сбросу станет входом и может не выполниться требование на минимальную длительность импульса на входе RESET.
При старте не мешало бы оперативку чистить, в которой и стек находится.
А вот это зачем? Неужели вменяемая программа полагается, что в ОЗУ после старта будут какие-то конкретные значения? Как можно что-то прочитать со стека, предварительно не положив на него это что-то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем МП41

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

стек в данном случае ни при чем. переход на начало кода не равносилен сбросу ни в коей мере! при сбросе происходит переинициализация всей периферии, в частности, аппаратно сбрасываются многие регистры. ваши проблемы наверняка в том, что при этом остаются разрешенными прерывания, и само собой в процессе всяких "инициализаций" они вызываются и... и каюк :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так перед переходом в начало программы следует прерывания запретить и , возможно, остановить некоторую периферию.

 

WDT, похоже, изнутри ресет дёргает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

jmpом прыгаю в самый первый байт кода.

 

А первый байт - команда cli или ... ?

В инициализации что-то не продумано, лично мне так кааацца.

 

хочу спросить - как сбросить стек?

 

"В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется).

Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо.

 

Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?

А при чем здесь стек?

 

Просто запретить индикацию и уйти на сброс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д.

 

Первым делом запрещаются прерывания - я как раз об этом. :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...