Перейти к содержанию
    

Как сделать перезагрузку программно?

так делать нельзя...

По крайней мере Atmel на этот счет говорит четко, НИЗЯ!

 

Можно по подобней, аппарвтный сброс еще никто не запрещал, ИМХО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей, а это проверенное решение для WinAVR ?

Оно одинаково работает на контроллерах с call/rcall и тех у которых только rcall ?

Оно проверено на вызове загрузчика, который живет по адресу 0x1800 и другой функции по другому адресу. Конкретно на адрес 0x0000 не переходил, но не вижу особой разницы - с точки зрения компилятора это вызов обычной функции, о расположении которой он ничего не знает и не должен знать. С точки зрения линкера адреса функций - обычные symbols, ему тоже все равно чему этот адрес равен конкретно. А опцией -Wl мы просто ему говорим "этот символ (метку) мы определили за тебя"
В inderect jump ничего по воле компилятора уже поменятся не может...
Да, но оно требует загрузки R30:R31 и IJMP вместо обычного ®JMP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно по подобней, аппарвтный сброс еще никто не запрещал, ИМХО.

Вот официальное мнение Atmel по этому вопросу:

 

Software Reset

Question

How can I reset my AVR through software?

 

Answer

If you want to perform a software reset of your AVR you should use the internal Watchdog. Simply enable it and let it time out. When the Watchdog triggers it resets the program counter back to 0, clears all the registers and performs all the other tasks. This operation gives the same result as pulling the RESET line low.

 

You should not try to:

- Use another pin of the AVR to pull the external RESET line. The pins of the AVR are tristated halfway through the minimum reset time, this releases the RESET line and hence nothing happens.

- Jump to program location 0. Jumping to program location 0 does not clear all the registers and hence you do not have a "clean" reset.

 

 

Оно проверено на вызове загрузчика, который живет по адресу 0x1800 и другой функции по другому адресу. Конкретно на адрес 0x0000 не переходил, но не вижу особой разницы - с точки зрения компилятора это вызов обычной функции, о расположении которой он ничего не знает и не должен знать. С точки зрения линкера адреса функций - обычные symbols, ему тоже все равно чему этот адрес равен конкретно. А опцией -Wl мы просто ему говорим "этот символ (метку) мы определили за тебя

Вот в этом и вопрос знает или не знает ?

линкер должен знать :)

Попробую найти/воспроизвести код с "неправильным" вызовом функции по адресу 0x0000,

а потом попробую Ваш вариант.

"Да, но оно требует загрузки R30:R31 и IJMP вместо обычного ®JMP.

Ну вроде как в IAR для этого можно воспользоваться "__z" ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот официальное мнение Atmel по этому вопросу:

..

How can I reset my AVR through software?

...

You should not try to:

...

- Jump to program location 0. Jumping to program location 0 does not clear all the registers and hence you do not have a "clean" reset.[/i]

А оценить нужность "чистоты" регистров способен только один ATMEL, один раз для всех проектов, программист just "should not try"! :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот официальное мнение Atmel по этому вопросу:

 

Software Reset

Question

How can I reset my AVR through software?

 

Answer

If you want to perform a software reset of your AVR you should use the internal Watchdog. Simply enable it and let it time out. When the Watchdog triggers it resets the program counter back to 0, clears all the registers and performs all the other tasks. This operation gives the same result as pulling the RESET line low.

 

You should not try to:

- Use another pin of the AVR to pull the external RESET line. The pins of the AVR are tristated halfway through the minimum reset time, this releases the RESET line and hence nothing happens.

- Jump to program location 0. Jumping to program location 0 does not clear all the registers and hence you do not have a "clean" reset.

 

Естественно, требования к аппаратному сбросу никто не отменял, поэтому ATMEL и не рекомендует "самострел". Ну о то что переход на 0х0000 это не эквивалент RESET ИМХО очевидно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А оценить нужность "чистоты" регистров способен только один ATMEL, один раз для всех проектов, программист just "should not try"! :biggrin:

:biggrin::biggrin::biggrin:

Ну дык Вы же сами намекнули

Использую оба решения, но при использовании программного сброса легко упустить инициализацию портов. Например, оставить на выход сигналы программного I2C.

почему они Вас боятся :08:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему они Вас боятся :08:

Я не люблю наступать на грабли, но даже ATMEL не отнимет мое право сделать ЭТО :maniac: !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...