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

 
 
> Как программно сгенерить ресет?
Karl
сообщение Jul 26 2005, 10:52
Сообщение #1


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

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



Контроллер мега8535. Свободных выводов нет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Jul 26 2005, 11:27
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



1) можнро через вачдог если он есть

2) а можно так ( ( void ( void * ) ( void ) ) 0x0000 ) ( );

3) или на асме JMP 0x0000
Go to the top of the page
 
+Quote Post
Rock
сообщение May 21 2008, 13:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(MALLOY2 @ Jul 26 2005, 15:27) *
1) можнро через вачдог если он есть

2) а можно так ( ( void ( void * ) ( void ) ) 0x0000 ) ( );

3) или на асме JMP 0x0000



В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет,
ещё бы хотелось узнать что эта запись означает.
А если в процессоре нет команды jmp, то кроме wdt можно сбросить процессор
запретив все прерывания очистить стек и следующую команду поставить ret.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2008, 14:23
Сообщение #4


Гуру
******

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



Цитата(Rock @ May 21 2008, 16:52) *
В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет,
ещё бы хотелось узнать что эта запись означает.
Наверное MALLOY2 подразумевал ((void(*)()0x0000)(); - приведение константы 0х0000 к типу "указатель на функцию" и вызов функции по этому указателю. Поиск по форуму по "((void(*)()0x0000)()" вам даст несколько ссылок на обсуждения.


--------------------
На любой вопрос даю любой ответ
"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
IgorKossak
сообщение May 21 2008, 19:05
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ May 21 2008, 17:23) *
Наверное MALLOY2 подразумевал ((void(*)()0x0000)();

Увы, опечатка, ибо при беглом взгляде видно, что скобки не парные. Наверное всё таки вот так:
Код
((void (*)())0x0000)();

Не знаю, будет ли работать в WinAVR, но в IAR точно работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 21 2008, 19:27
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorKossak @ May 21 2008, 21:05) *
Не знаю, будет ли работать в WinAVR, но в IAR точно работает.

А чего не работать, если чистейший "C" smile.gif
Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580
Цитата
1. 0 Берем, например, 0
2. ()0 Будем явно тип преобразовывать
3. (*)0 В указатель
4, ((*)())0 .................. на функцию
5. ((*)(void))0 ........................................без параметров
6. (void(*)(void))0 ничего не возвращающую
7. Ну и вызываем это ((void(*)(void))0)();
При необходимости добавляем параметры и возвращаемые значеня по месту..

Только это рестарт, а не ресет. Reset через Watchdog.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 12:10
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(zltigo @ May 21 2008, 23:27) *
((void(*)(void))0)();
А чего не работать, если чистейший "C" smile.gif
Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580

Только это рестарт, а не ресет. Reset через Watchdog.

А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!! laughing.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 26 2008, 12:15
Сообщение #8


Гуру
******

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



Цитата(Rock @ May 26 2008, 15:10) *
А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!! laughing.gif
Такие серьезные заявления обычно подтверждаются приведением исходника и отрывка листинга. У меня, например, работает.


--------------------
На любой вопрос даю любой ответ
"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
Rock
сообщение May 26 2008, 12:21
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(Сергей Борщ @ May 26 2008, 16:15) *
Такие серьезные заявления обычно подтверждаются приведением исходника и отрывка листинга. У меня, например, работает.

вот кусок из студии
дизассемблер:
@00000A2D: main
1350: {
+00000A2D: E5C6 LDI R28,0x56 Load immediate
+00000A2E: E0D4 LDI R29,0x04 Load immediate
+00000A2F: BFDE OUT 0x3E,R29 Out to I/O location
+00000A30: BFCD OUT 0x3D,R28 Out to I/O location
1356: if ((MCUCSR>>WDRF)&1) //Watchdog Reset Flag
+00000A31: B784 IN R24,0x34 In from I/O location
+00000A32: 9586 LSR R24 Logical shift right
+00000A33: 9586 LSR R24 Logical shift right
+00000A34: 9586 LSR R24 Logical shift right
+00000A35: FF80 SBRS R24,0 Skip if bit in register set
+00000A36: C005 RJMP PC+0x0006 Relative jump
1357: conditions.start =1;
+00000A37: 91800079 LDS R24,0x0079 Load direct from data space
+00000A39: 6082 ORI R24,0x02 Logical OR with immediate
+00000A3A: 93800079 STS 0x0079,R24 Store direct to data space
1358: MCUCSR =0;
+00000A3C: BE14 OUT 0x34,R1 Out to I/O location
1359: init_ctc();
+00000A3D: DBF7 RCALL PC-0x0408 Relative call subroutine
1361: initport();
+00000A3E: D60F RCALL PC+0x0610 Relative call subroutine
1362: ((void(*)(void))0)();
+00000A3F: D60E RCALL PC+0x060F Relative call subroutine
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 17:21
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 16:21) *
1361: initport();
+00000A3E: D60F RCALL PC+0x0610 Relative call subroutine
1362: ((void(*)(void))0)();
+00000A3F: D60E RCALL PC+0x060F Relative call subroutine


Пожалуста укажите версию WinAVR и опции компилятора. У меня '((void(*)(void))0)();' всегда компилиться в
Код
    ldi r30,lo8(0)    ;  7    call_insn/4    [length = 3]
    ldi r31,hi8(0)
    icall


Анатолий.
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 17:49
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(aesok @ May 26 2008, 21:21) *
Пожалуста укажите версию WinAVR и опции компилятора. У меня '((void(*)(void))0)();' всегда компилиться в
Код
    ldi r30,lo8(0);  7    call_insn/4    [length = 3]
    ldi r31,hi8(0)
    icall


Анатолий.


WinAVR-20050214 и какие опции интересны?
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 18:01
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 21:49) *
WinAVR-20050214 и какие опции интересны?


Извините ни какие. Старенький он. Не буду смотреть.

Анатолий.
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 18:13
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(aesok @ May 26 2008, 22:01) *
Извините ни какие. Старенький он. Не буду смотреть.

Анатолий.

вот простая прога

#include <avr/io.h>
volatile unsigned char x, y, z;
int main(void)
{
x=1;
y=1;
z=x+y;
((void(*)(void))0)();
for(;;);
return(0);
}
вот что компельнул
............................
@0000002E: main
---- main.c ---------------------------------------------------------------------------------------
4: {
+0000002E: E5CF LDI R28,0x5F Load immediate
+0000002F: E0D4 LDI R29,0x04 Load immediate
+00000030: BFDE OUT 0x3E,R29 Out to I/O location
+00000031: BFCD OUT 0x3D,R28 Out to I/O location
5: x=1;
+00000032: E081 LDI R24,0x01 Load immediate
+00000033: 93800060 STS 0x0060,R24 Store direct to data space
6: y=1;
+00000035: 93800062 STS 0x0062,R24 Store direct to data space
7: z=x+y;
+00000037: 91800060 LDS R24,0x0060 Load direct from data space
+00000039: 91900062 LDS R25,0x0062 Load direct from data space
+0000003B: 0F89 ADD R24,R25 Add without carry
+0000003C: 93800061 STS 0x0061,R24 Store direct to data space
8: ((void(*)(void))0)();
+0000003E: DFEF RCALL PC-0x0010 Relative call subroutine
9: for(;;);
+0000003F: CFFF RJMP PC-0x0000 Relative jump
+00000040: FFFF ??? Data or unknown opcode
+00000041: FFFF ??? Data or unknown opcode
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 18:51
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 22:13) *
Код
8:          ((void(*)(void))0)();
+0000003E:   DFEF        RCALL   PC-0x0010        Relative call subroutine
9:          for(;;);
+0000003F:   CFFF        RJMP    PC-0x0000        Relative jump
+00000040:   FFFF        ???                      Data or unknown opcode
+00000041:   FFFF        ???                      Data or unknown opcode


avr-gcc 4.4
Выдает правильный код проверял для 128 и 8 меги:
Код
((void(*)(void))0)();
  76:    e0 e0           ldi    r30, 0x00; 0
  78:    f0 e0           ldi    r31, 0x00; 0
  7a:    09 95           icall


Анатолий.

Сообщение отредактировал aesok - May 26 2008, 18:59
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 19:16
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478



Цитата(aesok @ May 26 2008, 22:51) *
avr-gcc 4.4
Выдает правильный код проверял для 128 и 8 меги:
Код
((void(*)(void))0)();
  76:    e0 e0           ldi    r30, 0x00; 0
  78:    f0 e0           ldi    r31, 0x00; 0
  7a:    09 95           icall


Анатолий.

уточните какая эта версия 2007хххх пожалуйста, придётся обновить ....
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 19:27
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Rock @ May 26 2008, 23:16) *
уточните какая эта версия 2007хххх пожалуйста, придётся обновить ....

smile.gif я думаю что то типа 2009хххх надо будет у Эрика уточнить.

Последняя вышедшая версия WinAVR - 20080512 в ней avr-gcc 4.3. Я уверен что переход на нулевой адрес в ней работает. Если нет пишите.

Анатолий.

Цитата(singlskv @ May 26 2008, 23:14) *
to aesok, а почему бы вам не прописать __vectors в хидерах ?
Правда наверное тогда завалят вопросами "а почему у меня не работает ...." smile.gif


Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)

avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset

Анатолий.

Сообщение отредактировал aesok - May 26 2008, 19:35
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 20:26
Сообщение #17


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aesok @ May 26 2008, 23:27) *
Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)
ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю
когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес...
Особенно учитывая что в приведенном Вами линке:
Цитата
avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset
Есть небольшое такое предупреждение smile.gif :
CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the AVR.

А по поводу нужности, ну покажите что ли код с использованием watchdog который будет
начинать работу заново менее чем через 1мс ...

а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не
в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной
в последней инстанции это точно не являеться... (типа просто совета так не делать)
Go to the top of the page
 
+Quote Post
aesok
сообщение May 26 2008, 21:03
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(singlskv @ May 27 2008, 00:26) *
ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю
когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес...

Вы правы, переход на нулевой адрес являеться рестартом программы а не ресетом контроллера. Ресет и рестарт разные вещи и не нужно их путать (я не про Вас). Просто выполнять ресет более надежно.

Цитата
А по поводу нужности, ну покажите что ли код с использованием watchdog который будет
начинать работу заново менее чем через 1мс ...


Ну не все вещи в этой жизни можно решить нажимая на кнопочки, в смысле програмно. Програмно AVR-ку можно сбросит за 16мс. Надо быстрее ставте аппаратный формирователь сброса и дергайте его пином. C'EST LA VIE.

Цитата
а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не
в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной
в последней инстанции это точно не являеться... (типа просто совета так не делать)


А зачем полагаться на программиста который может ошибиться, может проще подождать 16 мс и быть уверенным что работа программы всегда будет начинаться на контроллере который находиться в предсказуемом состоянии? Я выбираю надежность перед крутизной.

Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом.

Анатолий.

Сообщение отредактировал aesok - May 26 2008, 21:07
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 26 2008, 21:16
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aesok @ May 27 2008, 01:03) *
Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом.
договорились beer.gif
Просто реально бывают ситуации когда нужно "начать все с начала", при этом програмный
контроль всего и вся займет кода(и времени) значительно больше чем просто вариант
"все остановили, все перезапустили", а 16мс это иногда так много...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Karl   Как программно сгенерить ресет?   Jul 26 2005, 10:52
|- - Палыч   Цитата(Rock @ May 21 2008, 16:52) В WinAV...   May 21 2008, 14:20
|- - defunct   Цитата(singlskv @ May 27 2008, 00:16) а 1...   May 26 2008, 21:36
|- - singlskv   Цитата(defunct @ May 27 2008, 01:36) пино...   May 26 2008, 21:51
- - nml   Цитата(Karl @ Jul 26 2005, 13:52)Контроллер м...   Jul 26 2005, 11:34
|- - Karl   Цитата(nml @ Jul 26 2005, 16:34)Цитата(Karl ...   Jul 27 2005, 03:22
- - lolikandr   В своё время удовлетворился таким решением - глоба...   Jul 28 2005, 06:18
|- - IgorKossak   Цитата(lolikandr @ Jul 28 2005, 09:18)В своё ...   Jul 29 2005, 07:04
- - lolikandr   ЦитатаНаверное, под важными регистрами имелась в в...   Jul 29 2005, 13:26
- - MrYuran   Ещё один способ: пишем ручками стартап со всеми не...   May 21 2008, 14:04
- - kada   Работающий пример на IARe: Код// Программный сбро...   May 21 2008, 16:39
- - Палыч   А, не выдаёт ли транслятор какого-либо сообщения п...   May 26 2008, 12:47
|- - Rock   Цитата(Палыч @ May 26 2008, 16:47) А, не ...   May 26 2008, 12:51
|- - VladimirYU   Цитата(Палыч @ May 26 2008, 16:47) АА, не...   May 26 2008, 12:52
- - Палыч   Цитата(Rock @ May 26 2008, 15:51) нет...   May 26 2008, 12:57
|- - Rock   Цитата(Палыч @ May 26 2008, 16:57) Странн...   May 26 2008, 13:05
- - _Pasha   Есть еще Кодint main(void) { ................   May 26 2008, 13:16
|- - Rock   Цитата(_Pasha @ May 26 2008, 17:16) Есть ...   May 26 2008, 13:45
|- - zltigo   Цитата(_Pasha @ May 26 2008, 15:16) Есть ...   May 26 2008, 13:58
|- - Rock   Цитата(zltigo @ May 26 2008, 17:58) Это н...   May 26 2008, 14:02
- - Палыч   Сейчас попробовал эту конструкцию в WinAVR - всё х...   May 26 2008, 13:50
|- - Rock   Цитата(Палыч @ May 26 2008, 17:50) Сейчас...   May 26 2008, 13:52
|- - Палыч   Цитата(Rock @ May 26 2008, 16:52) какую? ...   May 26 2008, 14:19
- - singlskv   Щаз я Вам все объясню Дело в том что у WinAVR ес...   May 26 2008, 15:11
|- - zltigo   Цитата(singlskv @ May 26 2008, 17:11) Дел...   May 26 2008, 15:51
|- - defunct   Цитата(singlskv @ May 26 2008, 18:11) ито...   May 26 2008, 16:03
|- - Палыч   А, ведь точно - прав singlskv! Цитата(defunct...   May 26 2008, 16:14
||- - defunct   Цитата(Палыч @ May 26 2008, 19:14) Наверн...   May 26 2008, 16:17
|- - singlskv   Цитата(defunct @ May 26 2008, 20:03) А по...   May 26 2008, 16:23
- - singlskv   Да, ну и конечно стоит еще добавить вариант которы...   May 26 2008, 16:00
- - _Pasha   Цитата(zltigo @ May 26 2008, 17:58) Это н...   May 26 2008, 17:02
|- - zltigo   Цитата(_Pasha @ May 26 2008, 19:02) Нет, ...   May 26 2008, 17:20
||- - _Pasha   Цитата(zltigo @ May 26 2008, 21:20) Карти...   May 26 2008, 17:49
|||- - zltigo   Цитата(_Pasha @ May 26 2008, 19:49) Не ве...   May 26 2008, 18:22
|||- - singlskv   Цитата(zltigo @ May 26 2008, 22:22) Ну и ...   May 26 2008, 18:36
||- - singlskv   Цитата(zltigo @ May 26 2008, 21:20) вещи ...   May 26 2008, 18:06
||- - aesok   Цитата(singlskv @ May 26 2008, 22:06) А 2...   May 26 2008, 18:11
|- - singlskv   Цитата(_Pasha @ May 26 2008, 21:02) 2sing...   May 26 2008, 19:14
- - _Pasha   Цитата(singlskv @ May 26 2008, 23:14) НО,...   May 27 2008, 03:45
- - singlskv   По мотивам этой темы озадачился вопросом кодогенер...   May 27 2008, 18:57


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

 


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


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