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

 
 
> Как программно сгенерить ресет?
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

Сообщений в этой теме
- Karl   Как программно сгенерить ресет?   Jul 26 2005, 10:52
|- - Палыч   Цитата(Rock @ May 21 2008, 16:52) В WinAV...   May 21 2008, 14:20
|- - Rock   Цитата(aesok @ May 26 2008, 22:51) avr-gc...   May 26 2008, 19:16
|- - aesok   Цитата(Rock @ May 26 2008, 23:16) уточнит...   May 26 2008, 19:27
|- - singlskv   Цитата(aesok @ May 26 2008, 23:27) Потому...   May 26 2008, 20:26
|- - aesok   Цитата(singlskv @ May 27 2008, 00:26) ну ...   May 26 2008, 21:03
|- - singlskv   Цитата(aesok @ May 27 2008, 01:03) Давайт...   May 26 2008, 21:16
|- - 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 Текстовая версия Сейчас: 24th July 2025 - 19:29
Рейтинг@Mail.ru


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