Как загрузить данные из R2 в глобальную переменную с использованием asm?
- Войдите на сайт для отправки комментариев
Вс, 12/02/2017 - 22:46
Загрузчик сохраняет MCUSR в R2.
Пишу:
byte kmcusr; __asm__ __volatile__ ("sts %0,r2":"=r"(kmcusr));
выдает ошибку "undefined reference to `r24'".
Пожалуйста, помогите правильно написать нутро asm.
Функция вернёт текущее значение R2
Только все равно, MCUSR что по кнопке reset на ARDUINO, что при срабатывании WATCHDOG одинаков:
B00001000 , т.е. установлен WDRF: Watchdog System Reset Flag.
А мне бы хотелось знать, перезапуск ARDUINO произошел по WATCHDOG или по другой причине.
P.S.При отключении питания MCUSR B00000100, т.е. BORF: Brown-out Reset Flag.
Других значений не смог получить.
osetroff, да так и есть. Сам когда-то интересовался этим вопросом. Нужно копать в исходнике, почему сохранённый регистр не соответствует первозданному. Что-то там автор намудрил, и похоже сам не заметил. Ведь на работу лоадера это никак не влияет :)
Да, пришлось переделать optiboot.
Сохраняю в RAM признак того, что я в bootloader.
Поэтому, когда внутри bootloader происходит reset по watchdog, я очищаю этот признак для программы.
У меня теперь в программе GPIOR0:
2 при внешнем reset;
4 при включении и потере питания;
8 при срабатывании watchdog внутри программы.
Может кто поможет передать код в репозиторий optiboot?
osetroff, по хорошему нужно написать автору оптибута. Его же эта тема тоже беспокоила, раз он в дистрибутив включил файлик test_reset.ino Собссно этот тест его и не работает как положено. Но это нужно сносно на инглише объясняться.
Запостил на github issue #197, может добавят в оффициальную сборку.