Ускоряем свою Arduino
- Войдите на сайт для отправки комментариев
Пт, 15/02/2013 - 15:04
В сети наткнулся на такую статью http://habrahabr.ru/post/141442/ . Не понимаю каким образом реализуется ускарение функции digitalWrite().
Таким что выкидывается она (и вместе с ней универсальность и независимость от железа). Выкинули один слой абстракции - получили прирост скорости (универсальность и простота - даром не дается. Если ардуино библиотека взяла на себя "черновоую работу" по выяснению порта, мина, "не зацепить соседние", возможность использовать аналоговые.... то ей для этого требуется не манна, а такты процессора.
Идите в раздел програмирование и почитайте статью "Прямое управление выходами....".
Вот Вам еще статья про ускорение Arduino
В результате скорость выросла в 22 раза
Вот Вам еще статья про ускорение Arduino
В результате скорость выросла в 22 раза
Это и есть прямое управление через регистры. Там в h-файле просто набор макроопределений. Для использования подобной "фишки" нужно иметь такие файлы для каждой платы и подключать, соответственно, "ручками" (хотя, наверно, можно как-то привязаться к среде, чтобы автоматом выбиралось).
Делать такие вещи имеет смысл только если действительно очень нужно быстрее сделать. Иначе смысла нет. То, что переносимость скетча теряется - весский аргумент так не делать :)
Сейчас работает c nano, mega, leonardo. Вопрос с переносимостью отпадает. Правда с мегой работает частично, но главное (дёрганье ногой) работает.
а я делаю по другому. что для меня удобней
взял обычную функцию digitalWrite. выкинул из нее все лишее и объявил новую dWrite (чтобы не заморачиваться с названием)
потом конечно протестировал. digitalWrite 100 или 110 мкс. точно не помню
dWrite 11 мкс
через регистры 10мкс
так как разница небольшая проще dWrite использовать. не нужен под рукой даташит. использование как у digitalWrite (только шим не отключает если был включен)
вот тестировал на 8 или 16мгц ардуине не помню. но все меняется пропорционально
Важно то, что пользователи ардуины углубляются в суть работы МК.
Ах если бы так. Тогда бы на форуме жил только один раздел "Проекты" и вопросы бы никто не задавал. Прям коммунизм! :)
+100
Я вот иногда CyberLib из второй ссылки использую. Она для nano, uno и mega отлично подходит. Для дерганья пинов самое то, да программа худеет заметно. Там и замена для delay есть.
взял обычную функцию digitalWrite. выкинул из нее все лишее и объявил новую dWrite (чтобы не заморачиваться с названием)
А где и что выкинуть, это здесь кухня wiring_digital.c ?
Там мало понятная каша с таймеров....
cyberliib рулит, но когда в скетч добавился таймер компилятор начал ругаться, приходится учить битовые операции. а ее delay действительно в прерываниях работает
>cyberliib рулит, но когда в скетч добавился таймер компилятор начал ругаться
Пкажите скетч.
пользоваться как с digitalWrite
пользоваться как с digitalWrite
Где то это я уже видел в библиатеках, а как сделать тоже самое но для команды DigitalRead и AnalogRead, AnalogWrite ?
Так это тоже саме, просто убрал защиту от дурака. В остальные я не лез
Я хотел на меге использовать CyberLib для чтения аналоговых портов, но оказалось эту библиатеку не дописали для Меги по аналоговым портам. :)
пользоваться как с digitalWrite
bool val будет правильнее.)