UniBomb 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Добрый день. Подскажите пожалуйста, как правильно сделать софтресет, а то возникла такая проблема: Есть прибор, который по усарту может получить команду сброса, после которой должен соответсвенно сбросится. Программа написана на асме, и когда я получаю эту команду, то просто jmpом прыгаю в самый первый байт кода. После этого у меня опять происходит инициализация устройства и программа как бы начинается заново. Всё было хорошо года два, пока сегодня не заметили странную штуку - после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо. Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor26 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT. Хм... А вот это мысль! Эх, как бы научится мыслить шире?... А после сброса по сторожевому таймеру сбросятся ли его настройки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mp41 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо :), но это уже аппаратная доработка. При старте не мешало бы оперативку чистить, в которой и стек находится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба МП41, аппаратно к сожалению уже ничего не сделать, так как прибор уже давно в серии. А вот насчёт чистки оперативки, в которой стек находится - как это правильно делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mp41 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Организовать цикл N-раз (по размеру SRAM-$60) в нём собственно стирание ячейки с постинкрементом. А перед этим не забыть записать в Y-регистр значение $60 (начало оперативки). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо :),И при определенных условиях получить чудеса, ибо вывод по сбросу станет входом и может не выполниться требование на минимальную длительность импульса на входе RESET.При старте не мешало бы оперативку чистить, в которой и стек находится.А вот это зачем? Неужели вменяемая программа полагается, что в ОЗУ после старта будут какие-то конкретные значения? Как можно что-то прочитать со стека, предварительно не положив на него это что-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mp41 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 (изменено) · Жалоба Естественно процедурой очистку оформлять не надо и делать при запрещённых перываниях. Речь идёт о том, что ресет делается из работающей программы, у которой уже в памяти что-то валяется. Программа сама фузы не меняет, поэтому вывод сброса входом не станет, да и с диодом отпадает вариант. Изменено 12 ноября, 2008 пользователем МП41 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба стек в данном случае ни при чем. переход на начало кода не равносилен сбросу ни в коей мере! при сбросе происходит переинициализация всей периферии, в частности, аппаратно сбрасываются многие регистры. ваши проблемы наверняка в том, что при этом остаются разрешенными прерывания, и само собой в процессе всяких "инициализаций" они вызываются и... и каюк :) мне кажется, использование бесконечного цикла с целью ожидания срабатывания WDT - самый правильный софт-ресет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mp41 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Так перед переходом в начало программы следует прерывания запретить и , возможно, остановить некоторую периферию. WDT, похоже, изнутри ресет дёргает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad219i 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба jmpом прыгаю в самый первый байт кода. А первый байт - команда cli или ... ? В инициализации что-то не продумано, лично мне так кааацца. хочу спросить - как сбросить стек? "В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Всем спасибо, сделал через WDT - вроде пока работает)))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mp41 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба "В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется). Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо. Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации? А при чем здесь стек? Просто запретить индикацию и уйти на сброс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad219i 0 12 ноября, 2008 Опубликовано 12 ноября, 2008 · Жалоба Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д. Первым делом запрещаются прерывания - я как раз об этом. :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться