PeterBeklemishev / mila

Arduino alternative based on MILANDR processor
6 stars 0 forks source link

[legacy] Port mapping #22

Open ReDetection opened 9 years ago

ReDetection commented 9 years ago

11.

@dubkov Предлагаю такой маппинг пинов: 0xWP0p

W - whole port P - port 0 - zero p - pin

целые порты типа 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 я тебе не верю, что это так просто, поэтому проверю

Я могу ошибаться, но дизассембли идентичный в двух случаях