целые порты типа PA, PB дефайнить как 0x1000 0x2000
пин на порту типа B2 B3 дефайнить как 0x0202 0x0203
сквозная нумерация пинов делается с пустым значением WP например 0х000А 0х00В2
тогда всё это сможет кушать pinWrite.
@redetection
Мне не нравится такой подход в целом: внутри каждого пинврайт будет N проверок на пины. Но простого решения пока тоже нет.
В идеале надо DSL и при компиляции анализировать:
если пришла константа — т.е. pinWrite(A4, k) — прямо на компиляции подставить нужные маски и никаких особых проверок
если пришло значение переменной — pinWrite(dstPin, k) — то тогда уже вставлять код со всеми проверками
Я пока не нагуглил, можно ли зделать проверку на константность на уровне препроцессора.
На самом деле, в идеале надо вообще не программировать императивно, а лишь декларировать зависимости и сводить количество явных последовательностей к минимуму. Это позволило бы компилятору точно знать, где что можно соптимизировать, и вывело бы программирование на качественно новый уровень. Пока не видел хороших реализаций такого, чтобы не было много оверхеда — все почему-то делают это в рантайме, а не на этапе компиляции. :(
@dubkov
Не совсем понимаю, что такое DSL (для меня это способ организации проводной передачи данных).
@redetection
это свой язык или расширение языка существующего, вносящее новые синтаксические конструкции, направленные на решение задач определённого круга (на самом деле, не обязательно, но это значение слова domain) http://en.wikipedia.org/wiki/Domain-specific_language
@dubkov
Не получится ли, что сделать восемь пинврайтов с константами по очереди сделать будет быстрее, чем пинврайт в цикле с итератором от 0 до 7? м?
@redetection
получится, и это большой вин, я считаю — без этой фичи оно всегда было бы одинаково медленно.
один фиг 99% пользователей ардуино не думают об оптимальности выполнения кода
@dubkov
Мне как пользователю лениво писать 8 пинврайтов, я пишу циклом
Вот что неплохо было бы сделать, так это переписать компилятор так, чтобы он, видя рядом два пинврайта в один порт, складывал их в один.
@redetection
ну, я думаю, достаточно объявить pinWrite как inline и компилятору указать ключ оптимизации -O2, например
@dubkov
я тебе не верю, что это так просто, поэтому проверю
Я могу ошибаться, но дизассембли идентичный в двух случаях
11.