Полная версия этой страницы:
"Правильный" софт ресет
UniBomb
Nov 12 2008, 13:57
Добрый день. Подскажите пожалуйста, как правильно сделать софтресет, а то возникла такая проблема:
Есть прибор, который по усарту может получить команду сброса, после которой должен соответсвенно сбросится. Программа написана на асме, и когда я получаю эту команду, то просто jmpом прыгаю в самый первый байт кода. После этого у меня опять происходит инициализация устройства и программа как бы начинается заново. Всё было хорошо года два, пока сегодня не заметили странную штуку - после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо.
Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?
Igor26
Nov 12 2008, 14:02
А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT.
UniBomb
Nov 12 2008, 14:09
Цитата(Igor26 @ Nov 12 2008, 17:02)

А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT.
Хм... А вот это мысль!
Эх, как бы научится мыслить шире?...А после сброса по сторожевому таймеру сбросятся ли его настройки?
Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо

, но это уже аппаратная доработка. При старте не мешало бы оперативку чистить, в которой и стек находится.
UniBomb
Nov 12 2008, 14:20
МП41, аппаратно к сожалению уже ничего не сделать, так как прибор уже давно в серии. А вот насчёт чистки оперативки, в которой стек находится - как это правильно делать?
Организовать цикл N-раз (по размеру SRAM-$60) в нём собственно стирание ячейки с постинкрементом. А перед этим не забыть записать в Y-регистр значение $60 (начало оперативки).
Сергей Борщ
Nov 12 2008, 14:32
Цитата(МП41 @ Nov 12 2008, 17:15)

Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо

,
И при определенных условиях получить чудеса, ибо вывод по сбросу станет входом и может не выполниться требование на минимальную длительность импульса на входе RESET.
Цитата(МП41 @ Nov 12 2008, 17:15)

При старте не мешало бы оперативку чистить, в которой и стек находится.
А вот это зачем? Неужели вменяемая программа полагается, что в ОЗУ после старта будут какие-то конкретные значения? Как можно что-то прочитать со стека, предварительно не положив на него это что-то?
Естественно процедурой очистку оформлять не надо и делать при запрещённых перываниях. Речь идёт о том, что ресет делается из работающей программы, у которой уже в памяти что-то валяется. Программа сама фузы не меняет, поэтому вывод сброса входом не станет, да и с диодом отпадает вариант.
стек в данном случае ни при чем. переход на начало кода не равносилен сбросу ни в коей мере! при сбросе происходит переинициализация всей периферии, в частности, аппаратно сбрасываются многие регистры. ваши проблемы наверняка в том, что при этом остаются разрешенными прерывания, и само собой в процессе всяких "инициализаций" они вызываются и... и каюк

мне кажется, использование бесконечного цикла с целью ожидания срабатывания WDT - самый правильный софт-ресет.
Так перед переходом в начало программы следует прерывания запретить и , возможно, остановить некоторую периферию.
WDT, похоже, изнутри ресет дёргает.
Vlad219i
Nov 12 2008, 15:00
Цитата(UniBomb @ Nov 12 2008, 17:57)

jmpом прыгаю в самый первый байт кода.
А первый байт - команда cli или ... ?
В инициализации что-то не продумано, лично мне так кааацца.
Цитата(UniBomb @ Nov 12 2008, 17:57)

хочу спросить - как сбросить стек?
"В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется).
UniBomb
Nov 12 2008, 15:03
Всем спасибо, сделал через WDT - вроде пока работает))))
Цитата(Vlad219i @ Nov 12 2008, 18:00)

"В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется).
Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д.
domowoj
Nov 12 2008, 15:32
Цитата(UniBomb @ Nov 12 2008, 20:57)

после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо.
Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?
А при чем здесь стек?
Просто запретить индикацию и уйти на сброс.
Vlad219i
Nov 12 2008, 15:37
Цитата(МП41 @ Nov 12 2008, 19:04)

Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д.
Первым делом
запрещаются прерывания - я как раз об этом. :-)
Сергей Борщ
Nov 12 2008, 17:34
Цитата(МП41 @ Nov 12 2008, 17:37)

Речь идёт о том, что ресет делается из работающей программы, у которой уже в памяти что-то валяется.
Ну и что? И во время первого запуска после аппаратного ресета в памяти что-то валяется. Программа же не использует мусор, она сначала инициализирует переменные, а потом уже ими пользуется. И в стек она сначала кладет, потом вынимает. Зачем делать еще какую-то дополнительную "очистку оперативки"?
Цитата(МП41 @ Nov 12 2008, 17:37)

Программа сама фузы не меняет, поэтому вывод сброса входом не станет,
Зато станет входом тот вывод, которым вы хотели дергать ногу ресета.
Цитата(Сергей Борщ @ Nov 12 2008, 21:34)

Зато станет входом тот вывод, которым вы хотели дергать ногу ресета.
Должно все работать ведь если он стал входом значит ресет уже сработал
А вообще мне кажется проблема только в неправильной начальной инициализации стека,портов и перифирии. Возможно первая инициализация (по включению питания) происходит нормально т.к. после аппаратного сброса все регистры инициализируются начальным значением, чего нет при JMP.
Нужно по шагам проверить программу инициализации предполагая что в регистрах и портах не стартовые значения, ну и конечно CLI и инициализация стека в начале обязательно.
Сброс по WDT оч. прикольно, думаю должен решить проблему.
Сергей Борщ
Nov 12 2008, 19:42
Цитата(zombi @ Nov 12 2008, 20:55)

ну и конечно CLI и инициализация стека в начале обязательно.
Снова спрошу - зачем это
шаманство с дополнительной инициализацией стека в начале? Программа и так его где надо проинициализирует. Раз она работает после аппаратного ресета, значит стек инициализируется где нужно. Даже(!) если будут разрешены прерывания, то их контекст будет сохраняться в ОЗУ, там, где остался указатель стека от предыдущего запуска программы.
Запрещать прерывания перед инициализацией (в случае перезапука методом jmp) конечно нужно.
Цитата(zombi @ Nov 12 2008, 20:55)

Должно все работать ведь если он стал входом значит ресет уже сработал
У вас есть уверенность, что перевод портов в третье состояние - заключительная стадия процесса ресета?
singlskv
Nov 12 2008, 20:46
Обсуждалось уже очень много раз.
ИМХО:
- если нужен гарантированный сброс всего и временные рамки не давят, WDT лучший вариант
- если нужно быстро и без проблем, запрещаем прерывания и на
каждую функцию InitSomeHardware(...) заводим функцию StopSomeHardware(...) которая
останавливает ВСЕ что касается этой хардвари,
ВСЕ - это значит не только вырубить функцию, но и в некоторых случаях дождаться завершения
текущего действия...
Очищать стеки это что-то очень веселое...
Artem_Petrik
Nov 12 2008, 21:39
С остановом периферии могут быть сюрпризы. Както раз мне приспичило остановить UART в 88-й меге, чтобы можно было той лапой, на которой TXD программно поуправлять. Так вот ничего у меня не вышло. При отключении UART этот вывод оставался выходом выдающим еденицу, и не желал повиноваться регистрам PORTD и DDRD. Так что если хочется без головной боли, то WDT - единственный выход.
singlskv
Nov 12 2008, 21:50
Цитата(Artem_Petrik @ Nov 13 2008, 00:39)

С остановом периферии могут быть сюрпризы. Както раз мне приспичило остановить UART в 88-й меге, чтобы можно было той лапой, на которой TXD программно поуправлять. Так вот ничего у меня не вышло. При отключении UART этот вывод оставался выходом выдающим еденицу, и не желал повиноваться регистрам PORTD и DDRD. Так что если хочется без головной боли, то WDT - единственный выход.
А Вы дождались остановки UART ?
Я специально говорил что нужно дождаться окончания последнего действия:
Bit 3 – TXEN: Transmitter Enable
Writing this bit to one enables the USART Transmitter. The Transmitter will override normal
port operation for the TxD pin when enabled. The disabling of the Transmitter
(writing TXEN to zero) will not become effective until ongoing and pending transmissions
are completed, i.e., when the transmit Shift Register and transmit Buffer Register
do not contain data to be transmitted. When disabled, the transmitter will no longer override
the TxD port.
Цитата(zombi @ Nov 12 2008, 21:55)

Должно все работать ведь если он стал входом значит ресет уже сработал

Вот что Atmel думает об этом:
software reset Цитата
We are currently updating the AVR FAQ and a software reset is actually one of the entries we've already made. Some people might recognise parts of this answer (and others, when the FAQ is up and running) that is simply because we have been crusing around avrfreaks searching for the most common questions, so many of the answers have been written many times before
<START>
Question
How can I reset my AVR through software?
Answer
If you want to perform a software reset of your AVR you should use the internal Watchdog. Simply enable it and let it time out. When the Watchdog triggers it resets the program counter back to 0, clears all the registers and performs all the other tasks. This operation gives the same result as pulling the RESET line low.
You should not try to:
- Use another pin of the AVR to pull the external RESET line. The pins of the AVR are tristated halfway through the minimum reset time, this releases the RESET line and hence nothing happens.
- Jump to program location 0. Jumping to program location 0 does not clear all the registers and hence you do not have a "clean" reset.
Я думаю также будет полезно прочитать FAQ#30 в avr-libc-user-manual:
How do I perform a software reset of the AVR?Анатолий.
Artem_Petrik
Nov 12 2008, 22:52
Цитата(singlskv @ Nov 13 2008, 01:50)

А Вы дождались остановки UART ?
Я специально говорил что нужно дождаться окончания последнего действия:
Bit 3 – TXEN: Transmitter Enable
Writing this bit to one enables the USART Transmitter. The Transmitter will override normal
port operation for the TxD pin when enabled. The disabling of the Transmitter
(writing TXEN to zero) will not become effective until ongoing and pending transmissions
are completed, i.e., when the transmit Shift Register and transmit Buffer Register
do not contain data to be transmitted. When disabled, the transmitter will no longer override
the TxD port.
Спасибо, на будущее учту.
Цитата(Сергей Борщ @ Nov 12 2008, 23:42)

У вас есть уверенность, что перевод портов в третье состояние - заключительная стадия процесса ресета?
Полной уверенности нет.
Но раз процесс ресета пошел разве он может не завершиться???
Цитата(zombi @ Nov 13 2008, 03:53)

Полной уверенности нет.
Но раз процесс ресета пошел разве он может не завершиться???
вполне может. сброс - процесс многоэтапный, для 51-ых я где-то встречал подробное описание всех стадий. так вот, скажем на первом такте при наличии нужного уровня RST происходит сброс регистров pull-up, на втором такте - сброс DDRx, на третьем - остановка таймеров и т.д. (порядок условный - мои предположения). поэтому, если не дождавшись этапа, когда происходит, например, остановка работы ядра контроллера, убрать RST - контроллер вообще может оказаться в неопределенном состоянии (недосброшенным). теоретически может даже зависнуть... но скорее всего процедура сброса просто не будет выполнена до конца: может не произойти переход на адрес 0000, но вся периферия сбросится и т.п. имхо, лучше не экспериментировать.
P.S. так же имхо, нет приложений, критичных к скорости программного сброса, так что нечего бояться времени срабатывания WDT.
VladimirYU
Nov 13 2008, 08:46
Цитата(aesok @ Nov 13 2008, 01:20)

Вот что Atmel думает об этом:
software reset Я думаю также будет полезно прочитать FAQ#30 в avr-libc-user-manual:
How do I perform a software reset of the AVR?Анатолий.
+1000.
Пора, уже понять и
"принять к исполнению", тот факт, что у AVR нет иного "правильного" программного сброса, кроме как с использованием WDT. Все остальное от лукавого.
Цитата(ARV @ Nov 13 2008, 11:52)

убрать RST - контроллер вообще может оказаться в неопределенном состоянии (недосброшенным). теоретически может даже зависнуть...
Пипец!
А даташите напысано шо внешний резэт срабатывает по фронту ?
Или я пэрэвёл нэправылно???
(недосброшенным)
Сергей Борщ
Nov 14 2008, 15:56
Цитата(zombi @ Nov 14 2008, 17:23)

А даташите напысано шо внешний резэт срабатывает по фронту ?
Или я пэрэвёл нэправылно???
(недосброшенным) 
Читать надо весь даташит, а не выборочно: ATmega8, 2486Q–AVR–10/06, Table 15:
Цитата
tRST Minimum pulse width on RESET Pin 1.5 µs
Переводите как хотите. Невнимательным:
Цитата(Сергей Борщ @ Nov 14 2008, 19:56)

Читать надо весь даташит, а не выборочно: ATmega8, 2486Q–AVR–10/06, Table 15:Переводите как хотите. Невнимательным:

Да действительно надо весь читать!
Начал читать.
.
.
.
Прочитал.
Там написано что при импульсе короче 1.5 мкс не гарантируется сброс.
"Shorter pulses are not guaranteed to generate a reset."
Т.е. процедура сброса не начнется.
Но я ничего не могу найти о зависании мк из за короткого импульса.
Или я ищу не там?
Многоэтапный сброс будет необратим, если он вообще начнётся, я так думаю, импульс сброса всего-лишь начинает этот процесс.
Цитата(МП41 @ Nov 14 2008, 20:21)

Многоэтапный сброс будет необратим, если он вообще начнётся, я так думаю, импульс сброса всего-лишь начинает этот процесс.
Вот и я о том же.
Если нога порта в следсвии выполнения процедуры сброса переведена в третье состояние, то кроме пропадания питания это процесс уже никто не сможет остановить. Таким образом сбос обязательно должен завершиться.
конечно, читая даташит, становится понятно лишь то, что там написано. а что не написано - можно домыслить. я не утверждаю, что сброс у атмела многоэтапный, но если это так, то кто даст гарантию, что сигнал RST не играет роль сигнала CS для микросхем памяти? т.е. наличие должного уровня RST лишь разрешает работу многокаскадной схемы сброса? значит, если его убрать раньше, чем процесс дойдет до финала - разрешение исчезнет, и схема останется в каком-то промежуточном состоянии.
простая аналогия: сдвиговый регистр с третьим состоянием выходов: пока есть OE (читай RST), инфа в регистре движется, убрали ОЕ - и на выходах неизвестно что...
повторяю: это лишь мои домыслы, но разве они не логичны?
muravei
Nov 14 2008, 18:46
Цитата(zombi @ Nov 14 2008, 19:14)

Там написано что при импульсе короче 1.5 мкс не гарантируется сброс.
Там что-то про клок еще было, типа если его нет, то 1.5 мкс хватит для сброса.
А кому не лень могут сделать опыт : написать несколько команд, настроить пин и сбросить , и посмотреть осциллом - будет красивый импульс или как.
Цитата(ARV @ Nov 14 2008, 21:46)

конечно, читая даташит, становится понятно лишь то, что там написано. а что не написано - можно домыслить. я не утверждаю, что сброс у атмела многоэтапный, но если это так, то кто даст гарантию, что сигнал RST не играет роль сигнала CS для микросхем памяти? т.е. наличие должного уровня RST лишь разрешает работу многокаскадной схемы сброса? значит, если его убрать раньше, чем процесс дойдет до финала - разрешение исчезнет, и схема останется в каком-то промежуточном состоянии.
простая аналогия: сдвиговый регистр с третьим состоянием выходов: пока есть OE (читай RST), инфа в регистре движется, убрали ОЕ - и на выходах неизвестно что...
повторяю: это лишь мои домыслы, но разве они не логичны?

Ваши мысли кажутся мне вполне логичными.
Но
Цитата
конечно, читая даташит, становится понятно лишь то, что там написано. а что не написано - можно домыслить.
Полный пипец!
И самое главное что проц будет работать именно так как
домыслит каждый из читающих?
Я всегда предполагал что даташит для того и существует чтобы домысливать ничего не нужно было!
Вообщето речь шла о том что если у ATMEGA8 любую ногу порта соединить с ресет и перевести эту ногу в 0. Произойдет ли сброс.
Причем тут CS,OE и сдвиговый регистр с третьим состоянием выходов???
aaarrr
Nov 14 2008, 19:23
Ну, добавьте RC и будет хоть 1.5мкс, хоть 15мс. Только зачем такие извращения, если можно просто задействовать WatchDog?
Цитата(aaarrr @ Nov 14 2008, 23:23)

Ну, добавьте RC и будет хоть 1.5мкс, хоть 15мс. Только зачем такие извращения, если можно просто задействовать WatchDog?
Опять двадцатьпять. А прочитать тему с начала слабо?
aaarrr
Nov 14 2008, 19:31
Цитата(zombi @ Nov 14 2008, 22:27)

Опять двадцатьпять. А прочитать тему с начала слабо?
Поясните свою реплику, будьте любезны.
Цитата(zombi @ Nov 14 2008, 21:49)

Полный пипец!
И самое главное что проц будет работать именно так как домыслит каждый из читающих?
Я всегда предполагал что даташит для того и существует чтобы домысливать ничего не нужно было!
конечно нет. но случайно кто-то может своими домыслами попасть в точку.
если всюду рекомендуют использовать WDT для софт-сброса и
не рекомендуют заводить сигнал с другого пина - этому долно быть какое-то обяснение? вы пытаетесь домыслить, что сброс пройдет (и приводите какие-то домыслы-доказательства этого), я наоборот - и тоже вещаю благую чушь

опыт - критерий истины - заведите порт на RST и попробуйте вообще программу запустить... ну а потом - пересбросить... и тогда, возможно, забрезжит свет истины...
Цитата(aaarrr @ Nov 14 2008, 23:31)

Поясните свою реплику, будьте любезны.
Обсуждалса WDT уже
Цитата(ARV @ Nov 14 2008, 23:34)

конечно нет. но случайно кто-то может своими домыслами попасть в точку.
если всюду рекомендуют использовать WDT для софт-сброса и
не рекомендуют заводить сигнал с другого пина - этому долно быть какое-то обяснение? вы пытаетесь домыслить, что сброс пройдет (и приводите какие-то домыслы-доказательства этого), я наоборот - и тоже вещаю благую чушь

опыт - критерий истины - заведите порт на RST и попробуйте вообще программу запустить... ну а потом - пересбросить... и тогда, возможно, забрезжит свет истины...
Честно говоря мне абсолютно по-уй будет оно работать или нет
Цитата(zombi @ Nov 14 2008, 22:39)

Честно говоря мне абсолютно по-уй будет оно работать или нет
а ваши посты - это просто ради красного словца? разговор поддержать, так сказать?

P.S. вообще-то, мне тоже безразлично все это...
singlskv
Nov 14 2008, 20:06
Цитата(aaarrr @ Nov 14 2008, 22:23)

Ну, добавьте RC и будет хоть 1.5мкс, хоть 15мс. Только зачем такие извращения, если можно просто задействовать WatchDog?
А вот это кстати не факт что RC гарантированно поможет.
В отличии от Power-Up Reset для обычного ресета в даташите нет указания про
гистерезис, тч Reset все равно может сработать а может и нет.
Тем кто расказывает про "неполные" ресеты, немедленно смотреть даташиты
и конкретно картинку под названием External Reset During Operation,
там ресет заканчивается а внутренний счетчик осуществляющий ресет продолжает работать...
zltigo
Nov 14 2008, 20:09
Цитата(zombi @ Nov 14 2008, 22:39)

Честно говоря мне абсолютно по-уй будет оно работать или нет
Moderator:
В таком случае постарайтесь не замусоривать форум.
Огурцов
Nov 14 2008, 20:12
Atmel пишет про WDT. Не помню, было ли где про то, что нельзя использовать один из портов, заведенный на ресет. Вроде бы было, что можно. Иначе действительно получается потенциальный баг. Сброс должен быть полный или не быть вообще, скажем в зависимости от длительности импулься, а не какой-то там наполовину. А с jmp 0 давно понятно - jmp - это как бы и не ресет совсем. Вообще, не понятно, почему Atmel не предусмотрели еще один источник сброса - программный. Хотя это не единственное, что не понятно.
IgorKossak
Nov 14 2008, 20:13
Предлагаю пользователям вернуться в рамки культурного общения.
Цитата(zltigo @ Nov 15 2008, 00:09)

Moderator:
В таком случае постарайтесь не замусоривать форум.
Понял. Исправлюсь.
singlskv
Nov 14 2008, 20:30
Цитата(Огурцов @ Nov 14 2008, 23:12)

Atmel пишет про WDT. Не помню, было ли где про то, что нельзя использовать один из портов, заведенный на ресет.
Atmel как раз четко высказывался на этот счет.
Типа не гарантируем...
Цитата
Иначе действительно получается потенциальный баг. Сброс должен быть полный или не быть вообще, скажем в зависимости от длительности импулься, а не какой-то там наполовину.
Нет, сброс или будет или нет, зависит от массы внешних факторов, например емкости
на пине сброса, температуре итд
Цитата
А с jmp 0 давно понятно - jmp - это как бы и не ресет совсем. Вообще, не понятно, почему Atmel не предусмотрели еще один источник сброса - программный. Хотя это не единственное, что не понятно.
Ну не ресет, рестарт называется, но кто сказал что с програмной точки зрения будут
какие-нить отличия ?
Вам когда-нить приходилось стопить переферию для переключения пинов на другие
функции ? Если приходилось, то софт рестарт не будет для Вас откровением...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.