VladimirYU 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба так делать нельзя... По крайней мере Atmel на этот счет говорит четко, НИЗЯ! Можно по подобней, аппарвтный сброс еще никто не запрещал, ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 133 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Сергей, а это проверенное решение для WinAVR ? Оно одинаково работает на контроллерах с call/rcall и тех у которых только rcall ? Оно проверено на вызове загрузчика, который живет по адресу 0x1800 и другой функции по другому адресу. Конкретно на адрес 0x0000 не переходил, но не вижу особой разницы - с точки зрения компилятора это вызов обычной функции, о расположении которой он ничего не знает и не должен знать. С точки зрения линкера адреса функций - обычные symbols, ему тоже все равно чему этот адрес равен конкретно. А опцией -Wl мы просто ему говорим "этот символ (метку) мы определили за тебя"В inderect jump ничего по воле компилятора уже поменятся не может...Да, но оно требует загрузки R30:R31 и IJMP вместо обычного ®JMP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Можно по подобней, аппарвтный сброс еще никто не запрещал, ИМХО. Вот официальное мнение 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" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Вот официальное мнение 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"! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба Вот официальное мнение 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 ИМХО очевидно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба А оценить нужность "чистоты" регистров способен только один ATMEL, один раз для всех проектов, программист just "should not try"! Ну дык Вы же сами намекнули Использую оба решения, но при использовании программного сброса легко упустить инициализацию портов. Например, оставить на выход сигналы программного I2C. почему они Вас боятся :08: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 9 июля, 2007 Опубликовано 9 июля, 2007 · Жалоба почему они Вас боятся :08: Я не люблю наступать на грабли, но даже ATMEL не отнимет мое право сделать ЭТО :maniac: ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться