Перезапуск МК
- Реклама
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
можно подключить ножку мк к ноге ресет и создать в нужный момент на ней "0"Tohey писал(а):Как можно перезапустить программно МК?
а можно при включеом сторожевом таймере просто сделать паузу в проге.
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
Вот так. Сам нашел на форуме, теперь пользуюсь.
void (*funcptr)( void ) = 0x0000;
funcptr();// при вызове сброс
void (*funcptr)( void ) = 0x0000;
funcptr();// при вызове сброс
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
- Реклама
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
Наиболее просто - это как было сказано ранее, подавать сигнал с вывода порта на вывод сброса, но этот вариант не так прост: не для всех МК возможен. Как еще состояние вывода порта будет воспринято в сам момнет сброса? Например, в МК семейства MCS-51 сброс дается высоким уровнем, и при сбросе все выводы всех портов тоже устанавливыаются в высокий уровень, т.е. если просто соединить какой-то вывод с RST - процесс сброса никогда не кончится, программа будет стоять и все.
Применение WDT и паузы так же не всегда возможно, т.к. месколько миллисекунд ожидания могут быть критически важны и недопустимы.
Остаются два варианта: либо использовать МК, в которых имеется стандартный способ программного сброса (например С8051F330), или искать иной способ нарушить работу программы. Кажется, в некоторых МК сброс получается, если сделать переход на несуществующий адрес ПЗУ, или обратиться к несуществующему адресу EEPROM...
В общем, задача не так проста и универсального решения не имеет.
Применение WDT и паузы так же не всегда возможно, т.к. месколько миллисекунд ожидания могут быть критически важны и недопустимы.
Остаются два варианта: либо использовать МК, в которых имеется стандартный способ программного сброса (например С8051F330), или искать иной способ нарушить работу программы. Кажется, в некоторых МК сброс получается, если сделать переход на несуществующий адрес ПЗУ, или обратиться к несуществующему адресу EEPROM...
В общем, задача не так проста и универсального решения не имеет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
Важно!
void (*funcptr)( void ) = 0x0000; - эту строчку указать в начале программы или в заголовочном файле (глобальная переменная).
Здесь обьявляется переменная указатель на функцию,
при вызове вызывается функция с адрессом funcptr=0.
листинг WinAvr
9fc: e0 91 af 00 lds r30, 0x00AF
a00: f0 91 b0 00 lds r31, 0x00B0
a04: 09 95 icall
0x00AF и 0x00B0 содержимое ноль.
если написать asm(rjmp 0) о такая вещь в WinAvr не проходит, программа прыгает на адресс функции main().
Помоему работать должно с любым компилятором.
void (*funcptr)( void ) = 0x0000; - эту строчку указать в начале программы или в заголовочном файле (глобальная переменная).
Здесь обьявляется переменная указатель на функцию,
при вызове вызывается функция с адрессом funcptr=0.
листинг WinAvr
9fc: e0 91 af 00 lds r30, 0x00AF
a00: f0 91 b0 00 lds r31, 0x00B0
a04: 09 95 icall
0x00AF и 0x00B0 содержимое ноль.
если написать asm(rjmp 0) о такая вещь в WinAvr не проходит, программа прыгает на адресс функции main().
Помоему работать должно с любым компилятором.
Кстати, про нулики с единичками, кое-что тут было:
http://www.radiokot.ru/forum/viewtopic.php?t=2527
http://www.radiokot.ru/forum/viewtopic.php?t=2527
Память очень интересная штука: бывает так, что запомнишь одно, а вспомнишь другое...
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
Прочитал ветку внимательней
был вопрос
Как можно перезапустить программно МК?
потом
Перезапуск МК и начало проги с начала это ведь разные вещи !
Ну дык как еще перезапустить программно мк, как не запустить программу с адресса 0? В любой проге надо обязательно инициализировать переферию, если писать на Си то, если сделать переход на адресс 0 то это равносильно перезапуску. Про ассемблер молчу, там таких вопросов не возникает, если не считать значения в озу и регистрах общего назначения.
был вопрос
Как можно перезапустить программно МК?
потом
Перезапуск МК и начало проги с начала это ведь разные вещи !
Ну дык как еще перезапустить программно мк, как не запустить программу с адресса 0? В любой проге надо обязательно инициализировать переферию, если писать на Си то, если сделать переход на адресс 0 то это равносильно перезапуску. Про ассемблер молчу, там таких вопросов не возникает, если не считать значения в озу и регистрах общего назначения.


