ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
965508 Топик полностью
Связанные сообщения
Hal
Подскажите как сейчас правильно организовать в микроконтроллере программные таймеры?2020-10-23
При наличии полноценного компилятора не при чём (не хуже чем 16 бит). Но как правило с этим проблемы. Для всех кроме AVR у многи...2020-02-28
Железо нужно симулировать не на уровне битов и фронтов сигналов, а на уровне высокоуровневых операций (например, чтение-запись б...2019-11-07
От проекта зависит. Насколько чётко выделена аппаратно-зависимая часть и насколько абстракции используемые в старом проекте реал...2019-05-24
Собственно можно код запускать в эмуляторе процессора (qemu), которому привязать симуляцию нужной аппаратуры, или заменить HAL н...2019-02-06
Когда ПО прибора запускается на обычном ПК. Для этого обычно ПО разделяется на два слоя, как минимум: платформо-независимый (бол...2018-05-23
Одни абстракции заменяются на другие, которые тоже нужно учить, документировать и запоминать, учитывать возможные побочные эффек...2015-07-23
Жалкая паделка финских студентов написана на 100% на C, из ассемблера только вектора прерываний, crt и ещё мелочи, в C30 v3.31. ...2014-04-10
Да, трэш угар и содомия. Иногда абстракции через край, поэтому я имею такое мнение, что иногда и не грех в исходники прямо вписа...2013-12-29
Не совсем. Над HAL может быть ещё один слой, уже нужный для совмещения разных программных интерфейсов. Т.е. есть модуль A, котор...2013-10-25
Полезны аж 3 прослойки (ассемблеристам дальше лучше не читать):2011-10-13
fk0, легенда (17.12.2019 12:06, просмотров: 436) ответил Chum_A на Тоже хочу бутылку :). Наметилась дискуссия (см. 1-ю ссылку) "о роли и месте С++". Прошу знатоков и прежде всего fk0 прокомментировать материал (см. 2-ю ссылку). Моё ИМХО, что это как-то уже слишком заабстрагировалось, "или нет?" (с).
Выводы контроллера всегда управляются в контексте управления каким-либо более крупным аппаратным ресурсом. I2C-шиной, например. Вот в классе, функции, модуле управляющем шиной и не зазорно будет напрямую записать в GPIO регистр и подёргать за нужную ножку. С одной стороны. А с другой ножки захочется однажды переназначить. И следовательно -- менять код. Так конечно неудобно и хочется ввести абстракцию, чтоб условно класс I2C параметризовать назначенными ему ножками. Но от закапывания так далеко может остановить осознание, что любые, какие попало выводы МК там вряд ли могут оказаться, а только выбор из одного-двух вариантов обычно. И нельзя просто сменить вывод МК, это переконфигурировать весь модуль I2C и, причём, согласованно с другими модулями (чтоб не было конфликтов). Причём делается это только при смене печатной платы ещё. Т.е. чаще всего смена ножек невозможна, а про смене печатной платы не сложно поменять весь HAL. Поэтому я делал так: вначале после сброса все ножки приводятся в какое-то осмысленное положение и состояние, а потом каждый модуль напрямую управляет конкретными ножками. Так годится во всех простых случаях, если в основном работа ведётся с аппаратными модулями МК или на уровне включил-выключил, если нет *сложного* "ногодрыга". Но иногда абстракция таки нужна: это запросто окажется тот же модуль I2C, модуль управления LCD-дисплеем, везде где много сложного кода работающего с GPIO и И хардкодить там конкретные пины неудобно. И там приходится вводить абстракции вроде таких как "управление пинами SCL и SDA" ("1", "0" или "Z" для каждой отдельно), "управление шиной дисплея" (вывод 8-бит, ввод 8-бит). Эти отдельные слои абстракции просто реализуются отдельными модулями/классами, внутри же опять же ничего плохого в том, чтоб просто писать в нужные регистры МК. И уже при смене МК или платы меняются только эти модули, а модуль логического управления дисплеем работает через них и модификации не требует, например. Вводить же такую абстракцию как "PIN с таким-то номером" бессмысленно, это действительно пустая абстракция, прямая запись в GPIO-регистр уже ничем не отличается (потому, что в случае такой абстракции или прямого использования GPIO-регистров смена МК или печатной платы заставит изменить обращение к конкретному пину всё равно).
[ZX]