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

|
Добрый день. Подскажите пожалуйста, как правильно сделать софтресет, а то возникла такая проблема:
Есть прибор, который по усарту может получить команду сброса, после которой должен соответсвенно сбросится. Программа написана на асме, и когда я получаю эту команду, то просто jmpом прыгаю в самый первый байт кода. После этого у меня опять происходит инициализация устройства и программа как бы начинается заново. Всё было хорошо года два, пока сегодня не заметили странную штуку - после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо.
Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?
|
|
|
|
|
 |
Ответов
|
Nov 12 2008, 17:34
|

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

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

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

|
Цитата(zombi @ Nov 12 2008, 20:55)  ну и конечно CLI и инициализация стека в начале обязательно. Снова спрошу - зачем это шаманство с дополнительной инициализацией стека в начале? Программа и так его где надо проинициализирует. Раз она работает после аппаратного ресета, значит стек инициализируется где нужно. Даже(!) если будут разрешены прерывания, то их контекст будет сохраняться в ОЗУ, там, где остался указатель стека от предыдущего запуска программы. Запрещать прерывания перед инициализацией (в случае перезапука методом jmp) конечно нужно. Цитата(zombi @ Nov 12 2008, 20:55)  Должно все работать ведь если он стал входом значит ресет уже сработал У вас есть уверенность, что перевод портов в третье состояние - заключительная стадия процесса ресета?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 13 2008, 07:52
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(zombi @ Nov 13 2008, 03:53)  Полной уверенности нет. Но раз процесс ресета пошел разве он может не завершиться??? вполне может. сброс - процесс многоэтапный, для 51-ых я где-то встречал подробное описание всех стадий. так вот, скажем на первом такте при наличии нужного уровня RST происходит сброс регистров pull-up, на втором такте - сброс DDRx, на третьем - остановка таймеров и т.д. (порядок условный - мои предположения). поэтому, если не дождавшись этапа, когда происходит, например, остановка работы ядра контроллера, убрать RST - контроллер вообще может оказаться в неопределенном состоянии (недосброшенным). теоретически может даже зависнуть... но скорее всего процедура сброса просто не будет выполнена до конца: может не произойти переход на адрес 0000, но вся периферия сбросится и т.п. имхо, лучше не экспериментировать. P.S. так же имхо, нет приложений, критичных к скорости программного сброса, так что нечего бояться времени срабатывания WDT.
Сообщение отредактировал ARV - Nov 13 2008, 07:53
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
Сообщений в этой теме
UniBomb "Правильный" софт ресет Nov 12 2008, 13:57 Igor26 А почему бы сделать сброс по WDT? Получив команду ... Nov 12 2008, 14:02 UniBomb Цитата(Igor26 @ Nov 12 2008, 17:02) А поч... Nov 12 2008, 14:09 МП41 Или соединить один из выводов через диод с выводом... Nov 12 2008, 14:15 Сергей Борщ Цитата(МП41 @ Nov 12 2008, 17:15) Или сое... Nov 12 2008, 14:32 UniBomb МП41, аппаратно к сожалению уже ничего не сделать,... Nov 12 2008, 14:20 МП41 Организовать цикл N-раз (по размеру SRAM-$60)... Nov 12 2008, 14:28      zombi Цитата(ARV @ Nov 13 2008, 11:52) убрать R... Nov 14 2008, 15:23       Сергей Борщ Цитата(zombi @ Nov 14 2008, 17:23) А дат... Nov 14 2008, 15:56        zombi Цитата(Сергей Борщ @ Nov 14 2008, 19:56) ... Nov 14 2008, 16:14         muravei Цитата(zombi @ Nov 14 2008, 19:14) Там на... Nov 14 2008, 18:46   aesok Цитата(zombi @ Nov 12 2008, 21:55) Должно... Nov 12 2008, 22:20    VladimirYU Цитата(aesok @ Nov 13 2008, 01:20) Вот чт... Nov 13 2008, 08:46 ARV стек в данном случае ни при чем. переход на начало... Nov 12 2008, 14:51 МП41 Так перед переходом в начало программы следует пре... Nov 12 2008, 14:59 Vlad219i Цитата(UniBomb @ Nov 12 2008, 17:57) jmpо... Nov 12 2008, 15:00 МП41 Цитата(Vlad219i @ Nov 12 2008, 18:00) ... Nov 12 2008, 15:04  Vlad219i Цитата(МП41 @ Nov 12 2008, 19:04) Так обы... Nov 12 2008, 15:37 UniBomb Всем спасибо, сделал через WDT - вроде пока работа... Nov 12 2008, 15:03 domowoj Цитата(UniBomb @ Nov 12 2008, 20:57) посл... Nov 12 2008, 15:32 singlskv Обсуждалось уже очень много раз.
ИМХО:
- если нуже... Nov 12 2008, 20:46 Artem_Petrik С остановом периферии могут быть сюрпризы. Както р... Nov 12 2008, 21:39 singlskv Цитата(Artem_Petrik @ Nov 13 2008, 00:39)... Nov 12 2008, 21:50  Artem_Petrik Цитата(singlskv @ Nov 13 2008, 01:50) А В... Nov 12 2008, 22:52 МП41 Многоэтапный сброс будет необратим, если он вообще... Nov 14 2008, 16:21 zombi Цитата(МП41 @ Nov 14 2008, 20:21) Многоэт... Nov 14 2008, 17:13 ARV конечно, читая даташит, становится понятно лишь то... Nov 14 2008, 17:46 zombi Цитата(ARV @ Nov 14 2008, 21:46) конечно,... Nov 14 2008, 18:49  ARV Цитата(zombi @ Nov 14 2008, 21:49) Полный... Nov 14 2008, 19:34 aaarrr Ну, добавьте RC и будет хоть 1.5мкс, хоть 15мс. То... Nov 14 2008, 19:23 zombi Цитата(aaarrr @ Nov 14 2008, 23:23) Ну, д... Nov 14 2008, 19:27  aaarrr Цитата(zombi @ Nov 14 2008, 22:27) Опять ... Nov 14 2008, 19:31   zombi Цитата(aaarrr @ Nov 14 2008, 23:31) Поясн... Nov 14 2008, 19:39    ARV Цитата(zombi @ Nov 14 2008, 22:39) Честно... Nov 14 2008, 19:43     Огурцов Atmel пишет про WDT. Не помню, было ли где про то,... Nov 14 2008, 20:12      singlskv Цитата(Огурцов @ Nov 14 2008, 23:12) Atme... Nov 14 2008, 20:30    zltigo Цитата(zombi @ Nov 14 2008, 22:39) Честно... Nov 14 2008, 20:09     zombi Цитата(zltigo @ Nov 15 2008, 00:09) Moder... Nov 14 2008, 20:18 singlskv Цитата(aaarrr @ Nov 14 2008, 22:23) Ну, д... Nov 14 2008, 20:06 IgorKossak Предлагаю пользователям вернуться в рамки культурн... Nov 14 2008, 20:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|