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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> "Правильный" софт ресет, который почти как хард ресет
UniBomb
сообщение Nov 12 2008, 13:57
Сообщение #1


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

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



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

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

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


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT.
Go to the top of the page
 
+Quote Post
UniBomb
сообщение Nov 12 2008, 14:09
Сообщение #3


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

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



Цитата(Igor26 @ Nov 12 2008, 17:02) *
А почему бы сделать сброс по WDT? Получив команду на перезапуск уходим в вечный цикл, а через некоторое время произойдет сброс по WDT.


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

А после сброса по сторожевому таймеру сбросятся ли его настройки?
Go to the top of the page
 
+Quote Post
МП41
сообщение Nov 12 2008, 14:15
Сообщение #4


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

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



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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
UniBomb
сообщение Nov 12 2008, 14:20
Сообщение #5


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

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



МП41, аппаратно к сожалению уже ничего не сделать, так как прибор уже давно в серии. А вот насчёт чистки оперативки, в которой стек находится - как это правильно делать?
Go to the top of the page
 
+Quote Post
МП41
сообщение Nov 12 2008, 14:28
Сообщение #6


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

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



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


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


Гуру
******

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



Цитата(МП41 @ Nov 12 2008, 17:15) *
Или соединить один из выводов через диод с выводом сброса и дёргать этим выводом, когда надо smile.gif,
И при определенных условиях получить чудеса, ибо вывод по сбросу станет входом и может не выполниться требование на минимальную длительность импульса на входе RESET.
Цитата(МП41 @ Nov 12 2008, 17:15) *
При старте не мешало бы оперативку чистить, в которой и стек находится.
А вот это зачем? Неужели вменяемая программа полагается, что в ОЗУ после старта будут какие-то конкретные значения? Как можно что-то прочитать со стека, предварительно не положив на него это что-то?


--------------------
На любой вопрос даю любой ответ
"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
МП41
сообщение Nov 12 2008, 14:37
Сообщение #8


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
ARV
сообщение Nov 12 2008, 14:51
Сообщение #9


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

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



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

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
МП41
сообщение Nov 12 2008, 14:59
Сообщение #10


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

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



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

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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Nov 12 2008, 15:00
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204



Цитата(UniBomb @ Nov 12 2008, 17:57) *
jmpом прыгаю в самый первый байт кода.


А первый байт - команда cli или ... ?
В инициализации что-то не продумано, лично мне так кааацца.

Цитата(UniBomb @ Nov 12 2008, 17:57) *
хочу спросить - как сбросить стек?


"В лоб" - загрузить в sph:spl значение ramend (при запрещенных прерываниях, разумеется).
Go to the top of the page
 
+Quote Post
UniBomb
сообщение Nov 12 2008, 15:03
Сообщение #12


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

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



Всем спасибо, сделал через WDT - вроде пока работает))))
Go to the top of the page
 
+Quote Post
МП41
сообщение Nov 12 2008, 15:04
Сообщение #13


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

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



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

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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
domowoj
сообщение Nov 12 2008, 15:32
Сообщение #14


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

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Цитата(UniBomb @ Nov 12 2008, 20:57) *
после такого сброса показания прибора зашкаливают, а потом всё опять приходит в норму. Это в принципе недопустимо.

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

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

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


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Nov 12 2008, 15:37
Сообщение #15


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204



Цитата(МП41 @ Nov 12 2008, 19:04) *
Так обычно в нуле стоит команда, которая прыгает на метку "RESET", которая находится за векторами прерываний, после чего стек первым делом и настраивается, потом порты... и т.д.


Первым делом запрещаются прерывания - я как раз об этом. :-)
Go to the top of the page
 
+Quote Post

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

 


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


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