fk0, легенда (17.12.2019 12:06, просмотров: 489) ответил Chum_A на Тоже хочу бутылку :). Наметилась дискуссия (см. 1-ю ссылку) "о роли и месте С++". Прошу знатоков и прежде всего fk0 прокомментировать материал (см. 2-ю ссылку). Моё ИМХО, что это как-то уже слишком заабстрагировалось, "или нет?" (с).
Выводы контроллера всегда управляются в контексте управления каким-либо более крупным аппаратным ресурсом. I2C-шиной, например. Вот в классе, функции, модуле управляющем шиной и не зазорно будет напрямую записать в GPIO регистр и подёргать за нужную ножку. С одной стороны.
А с другой ножки захочется однажды переназначить. И следовательно -- менять код. Так конечно неудобно и хочется ввести абстракцию, чтоб условно класс I2C параметризовать назначенными ему ножками. Но от закапывания так далеко может остановить осознание, что любые, какие попало выводы МК там вряд ли могут оказаться, а только выбор из одного-двух вариантов обычно. И нельзя просто сменить вывод МК, это переконфигурировать весь модуль I2C и, причём, согласованно с другими модулями (чтоб не было конфликтов). Причём делается это только при смене печатной платы ещё. Т.е. чаще всего смена ножек невозможна, а про смене печатной платы не сложно поменять весь HAL. Поэтому я делал так: вначале после сброса все ножки приводятся в какое-то осмысленное положение и состояние, а потом каждый модуль напрямую управляет конкретными ножками.
Так годится во всех простых случаях, если в основном работа ведётся с аппаратными модулями МК или на уровне включил-выключил, если нет *сложного* "ногодрыга". Но иногда абстракция таки нужна: это запросто окажется тот же модуль I2C, модуль управления LCD-дисплеем, везде где много сложного кода работающего с GPIO и И хардкодить там конкретные пины неудобно. И там приходится вводить абстракции вроде таких как "управление пинами SCL и SDA" ("1", "0" или "Z" для каждой отдельно), "управление шиной дисплея" (вывод 8-бит, ввод 8-бит). Эти отдельные слои абстракции просто реализуются отдельными модулями/классами, внутри же опять же ничего плохого в том, чтоб просто писать в нужные регистры МК. И уже при смене МК или платы меняются только эти модули, а модуль логического управления дисплеем работает через них и модификации не требует, например.
Вводить же такую абстракцию как "PIN с таким-то номером" бессмысленно, это действительно пустая абстракция, прямая запись в GPIO-регистр уже ничем не отличается (потому, что в случае такой абстракции или прямого использования GPIO-регистров смена МК или печатной платы заставит изменить обращение к конкретному пину всё равно).
[ZX]