-
- йцyкeн прав - это не ради повышения уровня абстракции сделано. Но в отличие от него я знаю зачем :). Во-первых, для контроля устанавливаемых параметров: здесь все поля структуры имеют свои/разные типы, а допустимые для них параметры определены через enum, благодаря чему чужой параметр или произвольное число из головы туда не подставишь. Но главное - второе, это особенность архитектуры ARM, когда большинство периферийных регистров не имеют жесткой специализации (как, Kceния(788 знак., 05.10.2020 14:56)
- Да в том-то и глупость, что это не другой уровень абстракции. Это
тот же уровень, только регистры периферии заменены на поля
структуры. Зачем - непонятно. - йцyкeн(04.10.2020 21:30)
- Затем, что один и тот же код должен одинаково работать на всех STM
микроконтроллерах. Используя прямую запись в регистры построить
такой код не удастся. - RxTx(10.10.2020 15:30)
- Такого даже ПИКи себе не позволяют, чего уж ожидать от СТМов. - Kpoк(11.10.2020 22:48)
- - Ну хорошо, вы не помните, как попали в самолёт. Но как вы вышли оттуда, вы должны помнить? - Помнить должен. Но не помню. - йцyкeн(10.10.2020 16:56)
- Они решают это типичным паттерном "вызов API-функции". Программист заполняет ряд параметров. Так как их много это поля структуры. Этим высказывается абстрактное намерение. Затем вызывается API функция инициализации. Функция находится в файле отвечающем за обслуживание конкретного семейства, поэтому извне она черный ящик, абстрагирующий параметры(поля структуры) от регистров и особенностей инициализации семейства. - RxTx(10.10.2020 16:07)
- Не думаю, что о совместимости кода для всех STM-контроллеров кто-то
заботится. Уж который раз CubeMX перелицовывают - старые проекты
давно уже не компилируются его новыми версиями (хотя всегда можно
достать старую - она по согласию заливается, если на новую версию
переходить отказываешься). Хуже другое - меняются не только сами
структуры (например, у STM32F4 в структуре больше полей, чем у
STM32F1), но и многочисленные списки enum, которые в эти поля
подставляются. Например, Kceния(123 знак., 10.10.2020 16:05)
- Заботятся. Но как всегда, получается не очень. Суть содержится в
самом названии HAL - Hardware Abstraction Layer, Слой абстракции от
железа. - RxTx(10.10.2020 16:08)
- Микроконтроллеры - такая область, где абстрагироваться от железа
никак нельзя, а абстракционисты переходят на Linux. :) - Kceния(10.10.2020 16:11)
- Ну можно долго и со вкусом все это обсуждать, все эти тезисы :) На мой взгляд STMicroelectronics решают задачу по удешевлению процесса сопровождения линейки своих микроконтроллеров. - RxTx(10.10.2020 21:20)
- Хреновый из вас программист - evgeniy1294(10.10.2020 16:46)
- Вы сами на регистрах пишите :), каков уж тут уровень абстракции. - Kceния(10.10.2020 17:20)
- Микроконтроллеры - такая область, где абстрагироваться от железа
никак нельзя, а абстракционисты переходят на Linux. :) - Kceния(10.10.2020 16:11)
- Заботятся. Но как всегда, получается не очень. Суть содержится в
самом названии HAL - Hardware Abstraction Layer, Слой абстракции от
железа. - RxTx(10.10.2020 16:08)
- Очень понятно. Потом исчезнуть библиотеки и "Reference manuals", и
АГА! Сначала примеры по применению, потом библиотеки в исходниках,
потом в бинарниках, потом без описания аппаратуры. "Здравствуй,
бабушка!". - teap0t(04.10.2020 22:05)
- Дык это уже давным-давно так в железе, которое "только под линух".
По телефону в техподдержку. - SciFi(04.10.2020 22:08)
- И не всем это нравится. - teap0t(04.10.2020 22:39, ссылка)
- Дык это уже давным-давно так в железе, которое "только под линух".
По телефону в техподдержку. - SciFi(04.10.2020 22:08)
- Разве не это позволяет драйверу периферии работать с несколькими
группами регистров, например UART ? - VLLV(04.10.2020 21:47)
- Не понял вопроса. Моя идея в том, что драйвер нужен там, где есть
нетривиальная логика, например USB. "Драйвер", представляющий
обёртку нулевой толщины вокруг обращения к регистру, мне лично не
нужен. Меня не задирает написать I2C1->DR = byte1; - йцyкeн(04.10.2020 22:33)
- А мне нужен. Если в контроллере 3 УАРТа, зачем писать
UART1->DR = byte1, UART2->DR = byte1, UART3->DR =
byte1 вместо uart->DR = byte1? - VLLV(04.10.2020 22:59)
- КО сообщает, что в паре PERIPHERAL->REGISTER мы возмущаемся
бессмысленной заменой REGISTER на поле InitForDummies в какой-то
странной структуре. Использование переменной-указателя вместо
PERIPHERAL не только не осуждается, но и приветствуется. - SciFi(04.10.2020 23:05)
- Похоже, я теряю обоняние и ничего не соображаю, но высказаться
хочется :( - VLLV(05.10.2020 11:21)
- Вот только не надо самокопанием заниматься, до добра не доведёт :-) - SciFi(05.10.2020 11:23)
- Похоже, я теряю обоняние и ничего не соображаю, но высказаться
хочется :( - VLLV(05.10.2020 11:21)
- КО сообщает, что в паре PERIPHERAL->REGISTER мы возмущаемся
бессмысленной заменой REGISTER на поле InitForDummies в какой-то
странной структуре. Использование переменной-указателя вместо
PERIPHERAL не только не осуждается, но и приветствуется. - SciFi(04.10.2020 23:05)
- "Не в совокупности ищи единства, но более — в единообразии разделения". - teap0t(04.10.2020 22:41)
- А мне нужен. Если в контроллере 3 УАРТа, зачем писать
UART1->DR = byte1, UART2->DR = byte1, UART3->DR =
byte1 вместо uart->DR = byte1? - VLLV(04.10.2020 22:59)
- Не понял вопроса. Моя идея в том, что драйвер нужен там, где есть
нетривиальная логика, например USB. "Драйвер", представляющий
обёртку нулевой толщины вокруг обращения к регистру, мне лично не
нужен. Меня не задирает написать I2C1->DR = byte1; - йцyкeн(04.10.2020 22:33)
- +1. Я это называю "пустая абстракция". Лишняя сущность. - Cкpипaч(04.10.2020 21:35)
- Затем, что один и тот же код должен одинаково работать на всех STM
микроконтроллерах. Используя прямую запись в регистры построить
такой код не удастся. - RxTx(10.10.2020 15:30)
- Это не абстракция. Это "двое из ларца" для бедных, т.е. тех, у кого нет денег на оплату услуг настоящих двоих из ларца. - SciFi(04.10.2020 20:54)