|
возврат к началу программы из прерывания |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Apr 6 2011, 22:02
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Смотря какой процессор и какая у вас конфигурация. Если xmega, там есть программный ресет. Если используется вочдог, можно вызвать ресет бесконечным циклом. Если не то и не другое, запретить прерывания, настроить стек (если он в начале программы не настраивается), сбросить все настройки периферии (особенно разрешения прерываний), которые могут помешать вашей программе (если авария, может, и периферия расстроена?), и уйти на вектор ресета (0 или бутлоадер)
Сообщение отредактировал V_G - Apr 6 2011, 22:03
|
|
|
|
|
Apr 7 2011, 05:18
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-10
Пользователь №: 60 334

|
ATtiny25.С вочдогом интересная идея,нужно будет попробовать. Примерный код обработчика прерывания ISR(INT0_vect) { SetBit(PORTB,RBT); _delay_ms(100); ClearBit(PORTB,RBT); ClearBit(PORTB,K1); //здесь сделать ресет } Подскажите как уйти на 0x0000 средствами WinAvr?
|
|
|
|
|
Apr 7 2011, 10:13
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-10
Пользователь №: 60 334

|
чудеса,работает!спасбо!Не могли бы вы пояснить код?как он работает?
|
|
|
|
|
Apr 7 2011, 10:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(1100.1010.1011.1010 @ Apr 7 2011, 14:13)  Не могли бы вы пояснить код? Ну, собственно, тут-то всего две строчки: 1) определяем указатель на функцию со значением ноль 2) вызываем функцию по указателю, т.е. переходим на выполнение функции, код которой якобы расположен с адреса ноль. Хочу обратить внимание, что с помощью WDT - "честный" сброс МК, а код, приведенный мною - всего лишь "перезапуск" программы. Т.е. устройства, которые в этот момент работали - будут продолжать работать (например, USART - выдавать/принимать данные), что не всегда допустимо!
|
|
|
|
|
Apr 7 2011, 11:08
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-10
Пользователь №: 60 334

|
C WDT понятно.Не совсем понял (и не нашел в нете) синтаксис функции. void (*function)(void) * это знак нулевой функции? и что означает (void *)0;
и где бы почитать про такие фенкции?
Сообщение отредактировал 1100.1010.1011.1010 - Apr 7 2011, 11:15
|
|
|
|
|
Apr 8 2011, 16:29
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-10
Пользователь №: 60 334

|
Палыч,то что вы пояснили как раз понятно.Не все ясно с __attribute__((noreturn)) void restart(void)
|
|
|
|
|
Apr 8 2011, 17:29
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(Xenia @ Apr 8 2011, 19:59)  SysRq, скажите, а зачем нужен wdt_reset() после cli? Вы правы, пожалуй. Не нужен он. Уберём-с  -- Цитата(1100.1010.1011.1010 @ Apr 8 2011, 20:29)  Не все ясно с __attribute__((noreturn)) void restart(void) Функция с таким атрибутом имеет пролог поменьше, стека расходует меньше, т.к. не сохраняет call-saved регситры -> выполняется быстрее, и проще учитывать необходимый размер стека.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|