zltigo 2 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба Не верю :) Что верю-не верю? Зависит о того, как реализовали startup. Я никогда call main не делаю, бо совсем незачем. А оно это надо приключения на свою голову искать причем абсолютно без какой-бы то ни было надобности??? // останавливаем всю переферию SysTimerStop(); AdcStop(); SpiStop(); PwmStop(); PortsReset(); I2cStop(); Ну и зачем весь этот лишний код? Зачем помнить, что после модификации-добавления надо еще добавить stop()? Watcdog-и есть везде, зачастую есть возможность спровоцировать Watcdog досрочно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба Ну и зачем весь этот лишний код? Зачем помнить, что после модификации-добавления надо еще добавить stop()? Watcdog-и есть везде, зачастую есть возможность спровоцировать Watcdog досрочно.Я же и не говорю что так нужно делать всегда, конечно вариант с вотчдогом намного надежнее(думать меньше надо :) ), ну а если еще и доступ к нему через magic numbers то вобще очень не плохо, не нужно долго ждать, но иногда нужно сделать рестарт очень быстро, и тогда выключение всей переферии за несколько мкс это выход. Ну и тема вроде как называется "Как программно сгенерить ресет?", так что обсуждаем все варианты... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 26 мая, 2008 Опубликовано 26 мая, 2008 (изменено) · Жалоба 8: ((void(*)(void))0)(); +0000003E: DFEF RCALL PC-0x0010 Relative call subroutine 9: for(;;); +0000003F: CFFF RJMP PC-0x0000 Relative jump +00000040: FFFF ??? Data or unknown opcode +00000041: FFFF ??? Data or unknown opcode avr-gcc 4.4 Выдает правильный код проверял для 128 и 8 меги: ((void(*)(void))0)(); 76: e0 e0 ldi r30, 0x00; 0 78: f0 e0 ldi r31, 0x00; 0 7a: 09 95 icall Анатолий. Изменено 26 мая, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба 2singlskv: А скажите пожалуйста, __bad_interrupt всегда был jmp 0 ?Нет, __bad_interrupt заменяеться на jmp 0 для "толстых" чипов и на rjmp __vectors для "тонких", НО, Вы можете переопределить обработчик для незадействованных прерывание(типа контроль), например так: ISR(__vector_default) { // вигхня какаята } Ну и джамп в __bad_interrupt будет на Ваш обработчик. to aesok, а почему бы вам не прописать __vectors в хидерах ? Правда наверное тогда завалят вопросами "а почему у меня не работает ...." :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вован 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба avr-gcc 4.4 Выдает правильный код проверял для 128 и 8 меги: ((void(*)(void))0)(); 76: e0 e0 ldi r30, 0x00; 0 78: f0 e0 ldi r31, 0x00; 0 7a: 09 95 icall Анатолий. уточните какая эта версия 2007хххх пожалуйста, придётся обновить .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 26 мая, 2008 Опубликовано 26 мая, 2008 (изменено) · Жалоба уточните какая эта версия 2007хххх пожалуйста, придётся обновить .... :) я думаю что то типа 2009хххх надо будет у Эрика уточнить. Последняя вышедшая версия WinAVR - 20080512 в ней avr-gcc 4.3. Я уверен что переход на нулевой адрес в ней работает. Если нет пишите. Анатолий. to aesok, а почему бы вам не прописать __vectors в хидерах ? Правда наверное тогда завалят вопросами "а почему у меня не работает ...." :) Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.) avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset Анатолий. Изменено 26 мая, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес... Особенно учитывая что в приведенном Вами линке: avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset Есть небольшое такое предупреждение :) : CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the AVR. А по поводу нужности, ну покажите что ли код с использованием watchdog который будет начинать работу заново менее чем через 1мс ... а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной в последней инстанции это точно не являеться... (типа просто совета так не делать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 26 мая, 2008 Опубликовано 26 мая, 2008 (изменено) · Жалоба ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес... Вы правы, переход на нулевой адрес являеться рестартом программы а не ресетом контроллера. Ресет и рестарт разные вещи и не нужно их путать (я не про Вас). Просто выполнять ресет более надежно. А по поводу нужности, ну покажите что ли код с использованием watchdog который будет начинать работу заново менее чем через 1мс ... Ну не все вещи в этой жизни можно решить нажимая на кнопочки, в смысле програмно. Програмно AVR-ку можно сбросит за 16мс. Надо быстрее ставте аппаратный формирователь сброса и дергайте его пином. C'EST LA VIE. а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной в последней инстанции это точно не являеться... (типа просто совета так не делать) А зачем полагаться на программиста который может ошибиться, может проще подождать 16 мс и быть уверенным что работа программы всегда будет начинаться на контроллере который находиться в предсказуемом состоянии? Я выбираю надежность перед крутизной. Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом. Анатолий. Изменено 26 мая, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом. договорились :beer: Просто реально бывают ситуации когда нужно "начать все с начала", при этом програмный контроль всего и вся займет кода(и времени) значительно больше чем просто вариант "все остановили, все перезапустили", а 16мс это иногда так много... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба а 16мс это иногда так много... пином Reset дергайте :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба пином Reset дергайте :)реально быстро стартануть после настоящего ресета можно только или на внутреннем RC или на керамике, ну нету у авр варианта переключения источника тактирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба НО, Вы можете переопределить обработчик для незадействованных прерывание(типа контроль), Нет, я имел ввиду по умолчанию. пином Reset дергайте :) Тогда надо помнить о таких багах: 2. Part may hang in reset Some parts may get stuck in a reset state when a reset signal is applied when the internal reset state-machine is in a specific state. The internal reset state-machine is in this state for approximately 10 ns immediately before the part wakes up after a reset, and in a 10 ns window when altering the system clock prescaler...... There are theoretical possibilities of this happening also in run-mode. The following three cases can trigger the device to get stuck in a reset-state: - Two succeeding resets are applied where the second reset occurs in the 10ns window before the device is out of the reset-state caused by the first reset. - A reset is applied in a 10 ns window while the system clock prescaler value is updated by software. .............. Возможные последствия усложнения схемы ресета: девайс отъезжает при наносекундных помехах. :bb-offtopic: Лично меня (в моих приложениях) даже подтягивающий резистор на ресете >1кОм уже в ступор вводит. 300 Ом - не больше - ставлю, когда ISP не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба По мотивам этой темы озадачился вопросом кодогенерации в Gcc. Ну вобщем все правильно, вышеприведенная ошибка(с неправильным джампом) есть только в более менее давних версиях Gcc. Сравнивалась кодогенерация в версиях gcc_3.4.6 и gcc_4.1.2 : gcc_3.4.6: ;; Unconditional and other jump instructions. ....................... (define_insn "call_insn" ....................... return AS1(%~call,%c0); }" ....................... (define_insn "call_value_insn" ....................... return AS1(%~call,%c1); }" gcc_4.1.2: ;; Unconditional and other jump instructions. ....................... (define_insn "call_insn" ....................... else if (which_alternative==2) return AS1(%~call,%c0); return (AS2 (ldi,r30,lo8(%0)) CR_TAB AS2 (ldi,r31,hi8(%0)) CR_TAB \"icall\"); }" ....................... (define_insn "call_value_insn" ....................... else if (which_alternative==2) return AS1(%~call,%c1); return (AS2 (ldi, r30, lo8(%1)) CR_TAB AS2 (ldi, r31, hi8(%1)) CR_TAB \"icall\"); }" то есть как видно из рисунка, при переходе от 3.4.6 к 4.1.2 эта ошибка была подправленна, как это точно соотноситься с версиями WinAvr точно не знаю, но думаю что все что было начиная с 200705xx уже правильное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться