реклама на сайте
подробности

 
 
> "Правильный" софт ресет, который почти как хард ресет
UniBomb
сообщение Nov 12 2008, 13:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416



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

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

Я так подозреваю, что дело в стеке, т.к. там на этот момент могут храниться несколько точек возврата ну и какие-то левые значения, из-за которых начальные значения являются некорректныи. Посему хочу спросить - как сбросить стек? Как поведёт себя перифирия после повторной инициализации?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
МП41
сообщение Nov 12 2008, 14:37
Сообщение #2


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



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

Сообщение отредактировал МП41 - Nov 12 2008, 14:40


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 12 2008, 17:34
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
zombi
сообщение Nov 12 2008, 17:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



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

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

А вообще мне кажется проблема только в неправильной начальной инициализации стека,портов и перифирии. Возможно первая инициализация (по включению питания) происходит нормально т.к. после аппаратного сброса все регистры инициализируются начальным значением, чего нет при JMP.
Нужно по шагам проверить программу инициализации предполагая что в регистрах и портах не стартовые значения, ну и конечно CLI и инициализация стека в начале обязательно.
Сброс по WDT оч. прикольно, думаю должен решить проблему.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 12 2008, 19:42
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
zombi
сообщение Nov 13 2008, 00:53
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Сергей Борщ @ Nov 12 2008, 23:42) *
У вас есть уверенность, что перевод портов в третье состояние - заключительная стадия процесса ресета?

Полной уверенности нет.
Но раз процесс ресета пошел разве он может не завершиться???
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 13 2008, 07:52
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01494 секунд с 7
ELECTRONIX ©2004-2016