Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Совет, как сделать программную перезагрузку AVR, на примере WinAVR (+)

Отправлено Каа 25 августа 2009, г. 11:32


Если просто прыгнуть по нулевому адресу, то все переменные будут в неопределенном состоянии, что может быть чревато. Лучше перезагрузиться по watchdog, вот так:


#include <avr/wdt.h>

void cmd_reset()
{
// пишем прощальное письмо
return_status(CMD_RESET, ERR_NO);
// и совершаем самоубийство
// для этого заводим часовую бомбу
wdt_enable(WDTO_15MS);
// и ждем реинкарнации
while(1);
}



Но на многих процессорах таймер будет продолжать работать и после перезагрузки, и если не принять мер, то через 15 мс он опять все сбросит, и так бесконечно. Для этого затыкаем его до входа в main() вот так:



void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3")));

void wdt_init(void)
{
MCUSR = 0;
wdt_disable();

return;
}



Это все написано в WinAVR-20090313/doc/avr-libc/avr-libc-user-manual/FAQ.html
Но, как говорится, если ничего не получается, прочти инструкцию. Мне пришлось некоторое время потрахаться, пока не нашел решение. Может кому пригодится.


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
умножьте 2 на три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru