|
Как программно сгенерить ресет? |
|
|
|
 |
Ответов
|
May 21 2008, 13:52
|
Участник

Группа: Участник
Сообщений: 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.
|
|
|
|
|
May 21 2008, 14:23
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 21 2008, 19:05
|

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

|
Цитата(Сергей Борщ @ May 21 2008, 17:23)  Наверное MALLOY2 подразумевал ((void(*)()0x0000)(); Увы, опечатка, ибо при беглом взгляде видно, что скобки не парные. Наверное всё таки вот так: Код ((void (*)())0x0000)(); Не знаю, будет ли работать в WinAVR, но в IAR точно работает.
|
|
|
|
|
May 21 2008, 19:27
|

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

|
Цитата(IgorKossak @ May 21 2008, 21:05)  Не знаю, будет ли работать в WinAVR, но в IAR точно работает. А чего не работать, если чистейший "C"  Уже как-то поминал 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
|
|
|
|
|
May 26 2008, 12:10
|
Участник

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

|
Цитата(zltigo @ May 21 2008, 23:27)  ((void(*)(void))0)(); А чего не работать, если чистейший "C"  Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580Только это рестарт, а не ресет. Reset через Watchdog. А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!!
|
|
|
|
|
May 26 2008, 12:21
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 26 2008, 17:21
|
Знающий
   
Группа: Участник
Сообщений: 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 Анатолий.
|
|
|
|
|
May 26 2008, 17:49
|
Участник

Группа: Участник
Сообщений: 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 и какие опции интересны?
|
|
|
|
|
May 26 2008, 18:01
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Rock @ May 26 2008, 21:49)  WinAVR-20050214 и какие опции интересны? Извините ни какие. Старенький он. Не буду смотреть. Анатолий.
|
|
|
|
|
May 26 2008, 18: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
|
|
|
|
|
May 26 2008, 18:51
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 26 2008, 19:16
|
Участник

Группа: Участник
Сообщений: 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хххх пожалуйста, придётся обновить ....
|
|
|
|
|
May 26 2008, 19:27
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Rock @ May 26 2008, 23:16)  уточните какая эта версия 2007хххх пожалуйста, придётся обновить ....  я думаю что то типа 2009хххх надо будет у Эрика уточнить. Последняя вышедшая версия WinAVR - 20080512 в ней avr-gcc 4.3. Я уверен что переход на нулевой адрес в ней работает. Если нет пишите. Анатолий. Цитата(singlskv @ May 26 2008, 23:14)  to aesok, а почему бы вам не прописать __vectors в хидерах ? Правда наверное тогда завалят вопросами "а почему у меня не работает ...."  Потому что нет никаких причин переходить на 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
|
|
|
|
|
May 26 2008, 20:26
|
дятел
    
Группа: Свой
Сообщений: 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Есть небольшое такое предупреждение  : 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мс ... а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной в последней инстанции это точно не являеться... (типа просто совета так не делать)
|
|
|
|
|
May 26 2008, 21:03
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 26 2008, 21:16
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ May 27 2008, 01:03)  Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом. договорились Просто реально бывают ситуации когда нужно "начать все с начала", при этом програмный контроль всего и вся займет кода(и времени) значительно больше чем просто вариант "все остановили, все перезапустили", а 16мс это иногда так много...
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|