-
- Ваша позиция правильна. Эх, опустился норот без розовыхЪ членов
сообщества. Скоро под себя ходить будет. Никаких 1< < не
должно быть нигде в .с файлах. В одном лишь конфиг-хидере все
выводы описываются. - RED_LED(20.06.2024 23:49, )
- Дадад! А главное goto запретить. И тогда сразу же наступит всеобщий
скрам и эджайл! Писал в стиле "одном лишь конфиг-хидере все выводы
описываются", заебался скакать между конфигом и реализацией. Если
все относящееся к одной сущности в одном месте то есть в .c файле -
будет меньше ошибок и править проще. - 3m(23.06.2024 13:32)
- Параметризуйте и править ничего не надо будет. И да, goto в топку. - VladislavS.(23.06.2024 14:17)
- Дадад! А главное goto запретить. И тогда сразу же наступит всеобщий
скрам и эджайл! Писал в стиле "одном лишь конфиг-хидере все выводы
описываются", заебался скакать между конфигом и реализацией. Если
все относящееся к одной сущности в одном месте то есть в .c файле -
будет меньше ошибок и править проще. - 3m(23.06.2024 13:32)
- Да. Сразу на более высокий уровень абстракции. Но совершенно не так
как написали вы. Cкpипaч(71 знак., 20.06.2024 19:30 - 21:36)
- Этот код гавно, и я поясню почему. Costic(1098 знак., 22.06.2024 15:25)
- Этот код - демонстрация НЕ смешивания областей определения. Там где
определен Fucking_Silly_Led_On() не используются биты. Вообще. Ни в
явной форме, через ООП-прослойку. Cкpипaч(328 знак., 22.06.2024 18:27, ссылка)
- Класс Led необходим, т.к. он должен иметь ряд операций -
включить/выключить/другое и варианты создания/удаления. Led можно
включить записью 1 или 0 в порт, путём управления ШИМ, ЦАП тоже
можно... Всё это должно быть скрыто в слое абстракции. Пользователю
класса Led должно быть безразлично как включается светодиод на
конкретной плате. Он потом на другой плате будет пользоваться таким
же классом, но с другой реализацией (в идеале от производителя). Вы
же используете Costic(145 знак., 22.06.2024 18:55)
- А "необходим" именно класс? Модуль точно не устроит? :) - Cкpипaч(22.06.2024 19:48)
- Класс лучше оптимизируется. - VladislavS.(22.06.2024 22:35)
- В языке С++ модулей нет. %) - Costic(22.06.2024 19:55)
- Вы таки удивитесь, но есть :) VladislavS.(7 знак., 22.06.2024 22:38, ссылка)
- спасибо. интересненько - Vit(23.06.2024 10:25)
- А мне похер, я пишу на Паскале, просто компилирую компилятором С++. - Cкpипaч(22.06.2024 19:59)
- Вы таки удивитесь, но есть :) VladislavS.(7 знак., 22.06.2024 22:38, ссылка)
- "(в идеале от производителя)" Ну вот... Кто-то должэн написать и
отладить класс, который кому-то можэт быть полезен(а можэт и
никому), красиво упаковать и выложить на всеобщее использование.
Аналогия с секторами не канает по простой причине: архитектура ПЦ и
МС-ДОС/Вынь/Линь, это стандартная вещь и "производитель" вполне
себе, можэт заморочиться созданием стандартных классов. А вот
создатель какой-нить CH32V***, да хер с ним, сама STM, просто
умается ваять хоть какой набор mse homjak(96 знак., 22.06.2024 19:24)
- POSIX, STL, BSD Sockets тоже не сразу появились. STM - "пуп Земли"
только в России. Я уже писал, что ARM занимается классами, только
пока хреново у них получается. - Costic(22.06.2024 19:44)
- Разожгу срач. Считаю BSD Sockets наглядным примером крайне
неудачной и "дырявой" абстракции. "Посмотрите дети, как не надо
делать" - LightElf(05.07.2024 18:52)
- +100500 - =AlexD=(08.07.2024 15:33)
- Я не про это. Я про другое. mse homjak(634 знак., 22.06.2024 19:52)
- Спасибо. Хорошая формулировка того, с чем я тут ко всем плюсовикам доколупываюсь. Чувствуется класс :) - Cкpипaч(07.07.2024 14:53)
- +1. Редкая разумная мысль в угаре абстрактизации. - 3m(07.07.2024 11:13)
- Сейчас мы все ограничены CMSIS... и немного LL. - Costic(22.06.2024 19:57)
- Настоящщие мущщины не ограничены, потому что они кодят в хексе!* SciFi(40 знак., 07.07.2024 11:20)
- Ну вот, для каких-то кусков, которые поддаются стандартизации, это работает. Как и в стандартных библиотеках С. - mse homjak(22.06.2024 20:06)
- Разожгу срач. Считаю BSD Sockets наглядным примером крайне
неудачной и "дырявой" абстракции. "Посмотрите дети, как не надо
делать" - LightElf(05.07.2024 18:52)
- POSIX, STL, BSD Sockets тоже не сразу появились. STM - "пуп Земли"
только в России. Я уже писал, что ARM занимается классами, только
пока хреново у них получается. - Costic(22.06.2024 19:44)
- А "необходим" именно класс? Модуль точно не устроит? :) - Cкpипaч(22.06.2024 19:48)
- Класс Led необходим, т.к. он должен иметь ряд операций -
включить/выключить/другое и варианты создания/удаления. Led можно
включить записью 1 или 0 в порт, путём управления ШИМ, ЦАП тоже
можно... Всё это должно быть скрыто в слое абстракции. Пользователю
класса Led должно быть безразлично как включается светодиод на
конкретной плате. Он потом на другой плате будет пользоваться таким
же классом, но с другой реализацией (в идеале от производителя). Вы
же используете Costic(145 знак., 22.06.2024 18:55)
- Вам реально нужна библиотека для манипуляции битами и регистрами?
Мне - нет. - Cкpипaч(22.06.2024 15:40)
- Всем нужна, все <gpio.h> используют. Но написать GPIO
толково на С++ пока никто не может. Средства С++ и современные IDE
имеют подсказки и помогают писать код. Т.е. на этапе написания кода
уже могут исключаться ошибки, т.к. IDE предложит только
ограниченное множество портов, пинов и иных объектов в зависимости
от контекста. Даже компилировать не надо, как у Владислава. А это
повышение производительности труда, которая тебе очень нравится. - Costic(22.06.2024 19:40)
- Да, но подсказки они берут от написанных кем-то *.h файлов. И иногда, это вырождается в "обнять и плакать". - mse homjak(22.06.2024 20:00)
- Для инженерных задач, думаю, такая библиотека не нужна. Но
манипулирование битами это то средство в языке С, с помощью
которого предметная область "электротехники" отображается (mapping)
в алгоритмах и программах. По-хорошему, нужны средства (классы,
операторы, функции, множества) для описания предметной области.
Современный С++ может предоставить эти средства. - Costic(22.06.2024 16:39)
- Т.е. желание впихуйнуть операции над битами в совершенно иной слой
абстракции - неистребимо. Принято. Лично я так делать не буду. И
подчиненным не позволю. - Cкpипaч(22.06.2024 18:27)
- Тут вот какая штука... Дополнительная абстракция бит, позволяет
оптимизировать код на этапе компиляции. Причём так, что
последовательность действий над волатильными регистрами аппаратуры
сохраняется, обеспечивая требуемые последовательности ввода-вывода.
И, при этом, биты разных объектов, принадлежащие одному регистру,
упаковываются в одну операцию, а не в последовательность. Nikolay_Po(107 знак., 22.06.2024 18:45)
- Я вот выше писал что классы для работы с битами это перебор, но вспомнил как делал обёртку над системой команд RISC-V. Там при доступе к полям спецрегистров куча разных ассемблерных команд. Чтобы не думать как правильно и/или оптимально с ними работать пришолось обернуть в класс и переложить заботы на компилятор. В результате код обходит написанный вендором на асме. - VladislavS.(22.06.2024 23:21)
- А ЗАЧЕМ перемешивать работу с регистрами и прикладной код? Ради половины процента экономии по памяти программ? Я даже не
говорю "преждевременная оптимизация". Я просто молчу. Со скорбным
видом. - Cкpипaч(22.06.2024 18:54)
- А почему бы не экономить, особенно если это бесплатно делает
компилятор? И не преждевременно, а всегда и без устали. - VladislavS.(22.06.2024 22:49)
- Перечитал ветку еще раз - мы говорим о разном и друг друга не
слышим. Cкpипaч(556 знак., 23.06.2024 07:39)
- Вы противоречите своему примеру идеалного метода включения диода в
который поместили работу с битами и регистрами конкретного
контроллера. Вы этот метод будете переписывать раз за разом, а я
нет. Битовая арифметика с регистрами на каком-то уровне всё равно
появится, но этот уровень ниже чем у вас. Gpio, spi, i2c, usb - это
всё должно быть прослойкой абстракциией, позволяющей писать
прикладной уровень не думая для какого контроллера ты пишешь.
Написана эта абстракция VladislavS.(97 знак., 23.06.2024 08:28 - 09:05)
- Я - буду. Поменяю имя регистра или номер бита, если нужно. А как вы
получили гарантию что не регистр, не не номер бита никогда не
изменится в вашем случае? - Cкpипaч(23.06.2024 08:41)
- Гарантия одна, в методе включения светодиода не использовать ни имя
регистра, ни номер бита. Использовать абстракцию, я же приводил код
метода LED::On(); VladislavS.(123 знак., 23.06.2024 09:03)
- У вас есть неявное предположение что все LED гарантировано ведут
себя одинаково. Я в таком случае введу прикладной номер LED, а то какой номер, к какому биту какого регистра
относится - спрячу внутри модуля bsp. Cкpипaч(236 знак., 23.06.2024 09:12)
- Никак нет, проектирование начинается с создания кирпичиков из
которых строится дом. Панельный дом собирается куда быстрее. Как
нумерация или название связано с битами показано прямо в сообщении
на которое вы отвечаете. И да все светодиоды ведут себя одинаково -
погашены, горят (с разной яркостью) или мигают. Пишете их поведение
один раз и больше туда не лазите. - VladislavS.(23.06.2024 09:23)
- У Nuvoton есть процы с глубокой спячкой и локом GPIO при проходе
через ресет при выходе из спячки. Так что не всегда при переходе на
вектор ресет имеем дефолтное состояние периферии. Деинит играет
новыми красками. И даже сам вопрос необходимости (или нет)
запускать инициализацию может повергнуть в уныние кишки самого кода
инициализации. Особенно если ретеншн есть на совсем небольшую часть
ОЗУ, или нужен более мелкожручий режим без ретеншна, т.е. даже
сохранять стек нет смысла Vit(1 знак., 23.06.2024 09:59)
- Светодиод должен обо всём этом знать? - VladislavS.(23.06.2024 10:08)
- Если будете писать конструктор, то должны будете знать. Светодиод
это рафинированный пример обернутого битового обращения от вас же.
Представьте себе, что это выключатель питания GSM-модуля. Всё тот
же GPIO, но с полной, а не с ограниченной отвественностью:) - Vit(23.06.2024 10:21)
- Ну если это выключатель GSM-модуля, то у него и логика будет не от
светодиода. А метод включения будет всё равно GSM::On(). И дёргать
ногой он будет точно так же через пин (gpio или расширителя -
пофиг) как и светодиод не думая об его портах и битах, ибо это не
его зона абстракции. - VladislavS.(23.06.2024 10:42)
- у него вводные условия появляются - прежде чем собственно поднять
ногу нужно осмотреться, а доступна ли она, а не получится ли вдруг
вступить в кучу:) - Vit(23.06.2024 10:48)
- Всегда есть космический крейсер, кореллийские лучи смерти,
галактическая чума, угрожающая погубить всю планету... И чтобы
обыватели не сошли с ума, они ничего не должны об этом знать! (c)
MiB - VladislavS.(23.06.2024 11:05)
- toggle выполняет действие со скрытым от юзера предыдущим
состоянием. иногда не пофигу результат. ЗЫ. если у класса GSM и
ключ, и светодиод, то и ключу нужен класс GPIO, и классу LED.
вывод: класс LED сам по себе не нужен:) - Vit(23.06.2024 11:38)
- Кто-то запрещает прочитать состояние, если это надо для работы
модуля? Класс LED нужен, иначе вы описываете логику его работы в
классе GSM, тем самым усложняя его и делая менее переносимым. - VladislavS.(23.06.2024 11:54)
- насчет запрещает - не совсем так, но почти, потому как глобальные
разрешения (снятие лока GPIO) это вопрос не одного класса. а насчет
класса LED - он по сути алиас для части GPIO. такое при построении
сверху вниз чаще не нужно как класс, ибо лишний уровень абстракции.
но в отдельной программе-тесте приходится затягивать из кода
приложений, и по сути ручками делается тот же класс. это хоть и
ручками, но не дольше, чем наоборот. - Vit(23.06.2024 13:02)
- Даже одна возможность того что светодиод может включаться 1 или 0
уже отличает его от простой ноги. Вот захардкодите вы дёргание
ноги, а завтра схему поменяют... - VladislavS.(23.06.2024 13:17)
- Не стесняюсь писать Up и Down, а в On и Off указывать вызовы,
соответствующие полярности. Бывало с рулением полярностью, но как
показала практика - скорее правится плата и появляется BSP для неё
в виде набора файлов, чем калечится предыдущий код путём вставок
ветвления. В приложении нужны On и Off, при миграции код приложения
остаётся. - Vit(23.06.2024 17:10)
- Никаких ветвлений в рантайме нет. Инверсия - константный пареметр.
Он на этапе компиляции работает. - VladislavS.(23.06.2024 17:26)
- Щщазз! Инверсия получается после чтения входа этого же gpio. В
качестве примера посмотрите strapping для любого ethernet phy как
там подключаются индикаторные светодиоды. - 3m(25.06.2024 17:49)
- Внимательно следим за руками. Определяю два светодиода - один с прямым включением, второй с инверсным. Делаем LED::On() обоим и смотрим что получается. VladislavS.(119 знак., 26.06.2024 15:31, картинка, картинка)
- даже на Си, если не на макросах, то если полярность указывается
константно, обычно мелкое инлайнится до отсутствия ветвления самим
компилятором - Vit(23.06.2024 17:41)
- Да не даже на С, а это любой компилятор должен константные данные
оптимизировать. Если ему руки всякими "отлаженными модулями" не
выкручивать. - VladislavS.(23.06.2024 18:21)
- насчет "любой" и "должен" я бы не был столь категоричен. хотя да,
это теперь скорее норма. только не говорите это мелкочипам - они
даже GCC так кастрировали, что это обобщение не к ним:) ЗЫ я
уверен, что вам не досталось счастья использовать "компилятор"
MPLAB C16. оно могло один оператор в строке и никаких структур... - Vit(23.06.2024 19:21)
- Возможно мне повезло, но моё мнение по выбору чипов всегда
учитывали. А я в свою очередь всегда учитывал наличие вменяемых
средств разработки. - VladislavS.(23.06.2024 19:39)
- это прям тост. категорически поддерживаю. Vit(396 знак., 23.06.2024 20:04)
- Возможно мне повезло, но моё мнение по выбору чипов всегда
учитывали. А я в свою очередь всегда учитывал наличие вменяемых
средств разработки. - VladislavS.(23.06.2024 19:39)
- За более чем тридцать лет в бизнесе, не припомню ни одного
договора, в котором бы оговаривался размер кода в байтах :) - Cкpипaч(23.06.2024 18:24)
- Зато я помню проекты, где сотни каналов АФАР нужно за микросекунды
перестроить. - VladislavS.(23.06.2024 18:37)
- такое делать без запаса по быстродействию с упором на одно
программирование не комильфо. полагаю, что выбор кремния был не
пальцем в небо. Vit(1032 знак., 23.06.2024 19:57)
- Естественно, программирование лишь часть проекта, без fpga такое не взлетает. А язык даёт выигрыш, опыт это подтверждает. Естественно, руками можно всё то же самое и на С написать. Но когда за тебя это делает компилятор работа быстрее идёт. - VladislavS.(23.06.2024 20:20)
- Ввиду полного отсутствия ограничений по ресурсам на стороне компилятора, какой-либо практической пользы в Си против Плюсов - не вижу.
Когда пишешь на Паскале, какой компилятор вообще похер.- Cкpипaч(23.06.2024 20:15)
- такое делать без запаса по быстродействию с упором на одно
программирование не комильфо. полагаю, что выбор кремния был не
пальцем в небо. Vit(1032 знак., 23.06.2024 19:57)
- Зато я помню проекты, где сотни каналов АФАР нужно за микросекунды
перестроить. - VladislavS.(23.06.2024 18:37)
- насчет "любой" и "должен" я бы не был столь категоричен. хотя да,
это теперь скорее норма. только не говорите это мелкочипам - они
даже GCC так кастрировали, что это обобщение не к ним:) ЗЫ я
уверен, что вам не досталось счастья использовать "компилятор"
MPLAB C16. оно могло один оператор в строке и никаких структур... - Vit(23.06.2024 19:21)
- Да не даже на С, а это любой компилятор должен константные данные
оптимизировать. Если ему руки всякими "отлаженными модулями" не
выкручивать. - VladislavS.(23.06.2024 18:21)
- Щщазз! Инверсия получается после чтения входа этого же gpio. В
качестве примера посмотрите strapping для любого ethernet phy как
там подключаются индикаторные светодиоды. - 3m(25.06.2024 17:49)
- Никаких ветвлений в рантайме нет. Инверсия - константный пареметр.
Он на этапе компиляции работает. - VladislavS.(23.06.2024 17:26)
- Не стесняюсь писать Up и Down, а в On и Off указывать вызовы,
соответствующие полярности. Бывало с рулением полярностью, но как
показала практика - скорее правится плата и появляется BSP для неё
в виде набора файлов, чем калечится предыдущий код путём вставок
ветвления. В приложении нужны On и Off, при миграции код приложения
остаётся. - Vit(23.06.2024 17:10)
- Даже одна возможность того что светодиод может включаться 1 или 0
уже отличает его от простой ноги. Вот захардкодите вы дёргание
ноги, а завтра схему поменяют... - VladislavS.(23.06.2024 13:17)
- насчет запрещает - не совсем так, но почти, потому как глобальные
разрешения (снятие лока GPIO) это вопрос не одного класса. а насчет
класса LED - он по сути алиас для части GPIO. такое при построении
сверху вниз чаще не нужно как класс, ибо лишний уровень абстракции.
но в отдельной программе-тесте приходится затягивать из кода
приложений, и по сути ручками делается тот же класс. это хоть и
ручками, но не дольше, чем наоборот. - Vit(23.06.2024 13:02)
- Кто-то запрещает прочитать состояние, если это надо для работы
модуля? Класс LED нужен, иначе вы описываете логику его работы в
классе GSM, тем самым усложняя его и делая менее переносимым. - VladislavS.(23.06.2024 11:54)
- toggle выполняет действие со скрытым от юзера предыдущим
состоянием. иногда не пофигу результат. ЗЫ. если у класса GSM и
ключ, и светодиод, то и ключу нужен класс GPIO, и классу LED.
вывод: класс LED сам по себе не нужен:) - Vit(23.06.2024 11:38)
- Всегда есть космический крейсер, кореллийские лучи смерти,
галактическая чума, угрожающая погубить всю планету... И чтобы
обыватели не сошли с ума, они ничего не должны об этом знать! (c)
MiB - VladislavS.(23.06.2024 11:05)
- у него вводные условия появляются - прежде чем собственно поднять
ногу нужно осмотреться, а доступна ли она, а не получится ли вдруг
вступить в кучу:) - Vit(23.06.2024 10:48)
- Ну если это выключатель GSM-модуля, то у него и логика будет не от
светодиода. А метод включения будет всё равно GSM::On(). И дёргать
ногой он будет точно так же через пин (gpio или расширителя -
пофиг) как и светодиод не думая об его портах и битах, ибо это не
его зона абстракции. - VladislavS.(23.06.2024 10:42)
- Если будете писать конструктор, то должны будете знать. Светодиод
это рафинированный пример обернутого битового обращения от вас же.
Представьте себе, что это выключатель питания GSM-модуля. Всё тот
же GPIO, но с полной, а не с ограниченной отвественностью:) - Vit(23.06.2024 10:21)
- Светодиод должен обо всём этом знать? - VladislavS.(23.06.2024 10:08)
- Так вы, коллега, "шататель основ"?! 8) Что-ж, не вы один такой,
вырывание из задачи кусков с последующим "к пуговицам претензии
есть?" - очень характерно для плюсовиков, видимо язык накладывает
отпечаток. - Cкpипaч(23.06.2024 09:52)
- Причём тут претензии? В области вашей работы всегда есть сущности,
которые вы используете из проекта в проект. Вполне логично написать
для них качественные классы, которые потом просто и быстро
использовать. В итоге вы просто занимаетесь прикладухой, а не
переписываете раз от раза метод включения светодиода. А ведь у него
ещё и метод выключения есть :) - VladislavS.(23.06.2024 10:15)
- Вообще-то, именно так. Переписываю. Порядка трети тикетов - перенос
уже отработанных прикладных алгоритмов на другой bsp (точнее,
укладка нескольких алгоритмов в один bsp). Он состоит в
переписывании двух десятков функций, большая часть из которых
состоит из одной строки - поднять или опустить где-то какой-то бит. - Cкpипaч(23.06.2024 10:23 - 10:40)
- Итить колотить! Вам больше заняться нечем, как сидеть и
переписывать функции? И эти люди запрещают мне ковырять в носу (с)
:) - VladislavS.(23.06.2024 10:40)
- Лол. Это приносит деньги фирме :) Причем в человеко-часах это
существенно эффективнее чем плодить классы, наследование и
вот-это-вот-всё. - Cкpипaч(23.06.2024 10:41 - 10:43)
- Могло бы приносить больше, если бы вы занимались делом, а не
переписыванием одного и того же. - VladislavS.(23.06.2024 10:43)
- Меньше. И не давите на меня, я - директор, я считал и сравнивал. - Cкpипaч(23.06.2024 10:45)
- та же фигня:) - Vit(23.06.2024 11:05)
- Меньше. И не давите на меня, я - директор, я считал и сравнивал. - Cкpипaч(23.06.2024 10:45)
- Могло бы приносить больше, если бы вы занимались делом, а не
переписыванием одного и того же. - VladislavS.(23.06.2024 10:43)
- Лол. Это приносит деньги фирме :) Причем в человеко-часах это
существенно эффективнее чем плодить классы, наследование и
вот-это-вот-всё. - Cкpипaч(23.06.2024 10:41 - 10:43)
- Итить колотить! Вам больше заняться нечем, как сидеть и
переписывать функции? И эти люди запрещают мне ковырять в носу (с)
:) - VladislavS.(23.06.2024 10:40)
- Вообще-то, именно так. Переписываю. Порядка трети тикетов - перенос
уже отработанных прикладных алгоритмов на другой bsp (точнее,
укладка нескольких алгоритмов в один bsp). Он состоит в
переписывании двух десятков функций, большая часть из которых
состоит из одной строки - поднять или опустить где-то какой-то бит. - Cкpипaч(23.06.2024 10:23 - 10:40)
- Причём тут претензии? В области вашей работы всегда есть сущности,
которые вы используете из проекта в проект. Вполне логично написать
для них качественные классы, которые потом просто и быстро
использовать. В итоге вы просто занимаетесь прикладухой, а не
переписываете раз от раза метод включения светодиода. А ведь у него
ещё и метод выключения есть :) - VladislavS.(23.06.2024 10:15)
- У Nuvoton есть процы с глубокой спячкой и локом GPIO при проходе
через ресет при выходе из спячки. Так что не всегда при переходе на
вектор ресет имеем дефолтное состояние периферии. Деинит играет
новыми красками. И даже сам вопрос необходимости (или нет)
запускать инициализацию может повергнуть в уныние кишки самого кода
инициализации. Особенно если ретеншн есть на совсем небольшую часть
ОЗУ, или нужен более мелкожручий режим без ретеншна, т.е. даже
сохранять стек нет смысла Vit(1 знак., 23.06.2024 09:59)
- Никак нет, проектирование начинается с создания кирпичиков из
которых строится дом. Панельный дом собирается куда быстрее. Как
нумерация или название связано с битами показано прямо в сообщении
на которое вы отвечаете. И да все светодиоды ведут себя одинаково -
погашены, горят (с разной яркостью) или мигают. Пишете их поведение
один раз и больше туда не лазите. - VladislavS.(23.06.2024 09:23)
- В прикладном коде вам нужно будет найти инициализацию объекта LED и исправить
там. А если окажется что еще и способ нужно поменять, то искать
"способ" придется уже где-то в другом месте. Два места вместо
одного, специально выделенного в отдельный модуль. Я это называю
"объектный спагетти-код". - Cкpипaч(23.06.2024 09:04)
- Зачем вы свои проблемы на меня перекладываете? Беру схему, в
заголовочном файле описываю (именно описываю) что куда подключено.
Для светодиода это пин и наличие инверсии, для eeprom порт i2c, для
синтезатора частот порт spi и пин gpio для контроля ФАПЧ и т.д. А
дальше забота компилятора всё это связать. Нет никаких двух и более
мест, по которым вы зачем-то рыскаете. - VladislavS.(23.06.2024 09:12)
- Эти идеальности не всех посещают. У меня вполне уживаются и светики
на GPIO, и светики, подключенные через I2C расширители. И для этой
группы устройств в базовом проекте туча таргетов для 6-и процов
(один кетайский), 2 типа ядер, 3 типа периферии проца, под
конкретные конфигурации плат (там есть несколько исполнений с тучей
разных интерфейсов и т.п.) с выбранной индикацией (со своими
разношерстными расширителями)... Сильно проще идти от прикладной
задачи, имея подготовленные Vit(3 знак., 23.06.2024 09:30)
- У вас же расширитель имеет интерфейс обычного порта и предоставляет
доступ к пинам так же как gpio контроллера? И повесить светодиод на
пин расширителя можно так же как на пин контроллера? - VladislavS.(23.06.2024 09:49)
- у меня расширители PCF8574/A и PCA9534/A с жесткой адресацией на
шине. естественно стоит автодедект. но в зависимости от варианта
аппаратной сборки подключается разный набор светодиодов (да и
некоторых ключиков питания). причем сами эти расширители имеют
внутри разную физически конфигурацию выводов - в PCF8574/A
неотключаемая подтяжка, а в PCA9534/A включаемая. для управления
ключиками это важно. светодиоды всегда можно погасить и тут же
зажечь как нужно (вспомная анекдот о Vit(114 знак., 23.06.2024 10:16)
- Сам бог велел спрятать всё это непотребство в класс расширителя и
выдать светодиоду интерфейс пина к которому он подключен. - VladislavS.(23.06.2024 10:26)
- Это впорос реализации, но не применения. У меня приложение вызывает
функцию управления функциональным узлом - светодиод обмена данными
включить. Под капотом оно и проверит, а инициализирован ли драйвер,
если нет, то запустит инициализацию, и другие проверки, ну или
просто дёрнет GPIO. Класс там у драйвера или модуль (как
идентифицированная единица компиляции) с набором функций - это не
суть важно. - Vit(23.06.2024 10:57)
- Всегда есть особенности реалищации, но не надо делать из этого
винегрет. Светодиод не должен заниматься проверкой инициализации
порта. Это дело самого порта. Если у вас такой хитрый порт, то и
наворачивайте его логику. Оставьте светодиоду светодидово. Так код
будет проше и понятней. - VladislavS.(23.06.2024 11:14)
- При чём тут винегрет? Да, есть драйвер I2C_GPIO, он сам себя
инициализирует, если до того не вызывали. Да, оно под капотом и
кишки наружу не торчат. Но функция включения светодиода в
приложении вызывает ручками вписанную (назначенную) функцию от
этого драйвера или от CPU_GPIO (драйвер, как ни странно, тоже
бывает нужен). И она действительно чихать хотела как оно
реализовано. В CPU_GPIO может быть bit banding, работа с Set/Reset
регистрами, может быть чтение-модификация запись Vit(890 знак., 23.06.2024 12:44)
- Вы всё красиво и правильно расписываете. Я лишь за то чтобы код
gsm-модуля ничего об этом не знал. - VladislavS.(23.06.2024 13:10)
- :) я ж вроде как за то же. - Vit(23.06.2024 17:13)
- Вы всё красиво и правильно расписываете. Я лишь за то чтобы код
gsm-модуля ничего об этом не знал. - VladislavS.(23.06.2024 13:10)
- Бугага! (только пожалуйста не обижайтесь, это не переход на
личности) А как насчет необходимости по-быстренькому подменить пару
входов заглушками, потому что в целевом bsp нет свободных? 8) Тоже
броситесь прикладной алгоритм переписывать? У вас это дешевле? :) Cкpипaч(176 знак., 23.06.2024 11:25 - 11:38)
- Когда вы принимаете решение использовать чужую библиотеку на
развитие которой не можете влиять, то приниманте на себя все риски.
Какая разница как она написана? Даже если вляпались в какашку,
кто-то держит пистолет у виска с требованием обновить её? - VladislavS.(23.06.2024 12:26)
- Мы живем не в стране розовых пони, вы забыли? :) - Cкpипaч(23.06.2024 12:29)
- В голове должно что-то срабатывать задолго до момента когда вы
решаетесь править чужие библиотеки. - VladislavS.(23.06.2024 12:42)
- Вы меня с кем-то перепутали. - Cкpипaч(23.06.2024 12:45)
- Не я предлагал gsm-библиотеку править. - VladislavS.(23.06.2024 12:51)
- И не я. Cкpипaч(86 знак., 23.06.2024 12:53)
- Значит показалось. А как вы вообще библиотеки делаете, если там
постоянно в функциях что-то переписывать приходится? Это то мне
хоть не показалось? - VladislavS.(23.06.2024 12:54)
- Нужно не путать библиотеки и модули. Есть собственно программа,
состоящая из дерева модулей и есть используемые библиотеки. Если
заказчику понадобилась хоть немного иная программа - дерево модулей
копируется в отдельный, новый проект. А библиотеки - нет. Cкpипaч(644 знак., 23.06.2024 13:29)
- Можно поподробней о разнице между библиотекой и модулем? И то и
другое переиспользуется в разных проектах, в чём разница то? - VladislavS.(23.06.2024 14:00)
- Django это библиотека, а алгоритм регулирования давления двумя
насосами на одном частотнике - модуль :) Cкpипaч(529 знак., 23.06.2024 14:15 - 14:34)
- Библиотека это цивилизованное переиспользование кода, а модуль
тупая копипаста из проекта в проект? Чёт сомнительно. - VladislavS.(23.06.2024 14:23)
- Несовсем копипаста, CVS-репозитарий никто не отменял, но в принципе - да. Самый короткий путь - прямой. - Cкpипaч(23.06.2024 14:29)
- Библиотека это цивилизованное переиспользование кода, а модуль
тупая копипаста из проекта в проект? Чёт сомнительно. - VladislavS.(23.06.2024 14:23)
- Django это библиотека, а алгоритм регулирования давления двумя
насосами на одном частотнике - модуль :) Cкpипaч(529 знак., 23.06.2024 14:15 - 14:34)
- Можно поподробней о разнице между библиотекой и модулем? И то и
другое переиспользуется в разных проектах, в чём разница то? - VladislavS.(23.06.2024 14:00)
- Нужно не путать библиотеки и модули. Есть собственно программа,
состоящая из дерева модулей и есть используемые библиотеки. Если
заказчику понадобилась хоть немного иная программа - дерево модулей
копируется в отдельный, новый проект. А библиотеки - нет. Cкpипaч(644 знак., 23.06.2024 13:29)
- Значит показалось. А как вы вообще библиотеки делаете, если там
постоянно в функциях что-то переписывать приходится? Это то мне
хоть не показалось? - VladislavS.(23.06.2024 12:54)
- И не я. Cкpипaч(86 знак., 23.06.2024 12:53)
- Не я предлагал gsm-библиотеку править. - VladislavS.(23.06.2024 12:51)
- Вы меня с кем-то перепутали. - Cкpипaч(23.06.2024 12:45)
- В голове должно что-то срабатывать задолго до момента когда вы
решаетесь править чужие библиотеки. - VladislavS.(23.06.2024 12:42)
- Мы живем не в стране розовых пони, вы забыли? :) - Cкpипaч(23.06.2024 12:29)
- Я не знаю что такое "в bsp нет свободных". У заглушки в любом
случае должен быть штатный интерфейс и вы его напишете. Какая
разница в модуле или классе? У меня, например, есть готовый
порт-пустышка. Светик будет думать что всё работает, а реально он
никуда не подключен. - VladislavS.(23.06.2024 11:40)
- Разница огромная. Если у вас есть функция, где происходит переход
от прикладного уровня к аппаратно-зависимому, то можно нужные две
строчки поставить там. Без (1) введения новых классов и
прочесывания прикладного кода, на предмет где подправить
инициализацию, и без (2) засорения библиотек, ради частных случаев
применения. - Cкpипaч(23.06.2024 11:41)
- Это потому что у вас спагетти-код и неправильное разделение на
абстракции. - VladislavS.(23.06.2024 12:03)
- Вам виднее :) *Именно на этом мы и зарабатываем деньги. - Cкpипaч(23.06.2024 12:14 - 12:55)
- . - VladislavS.(26.06.2024 23:06)
- Вам виднее :) *Именно на этом мы и зарабатываем деньги. - Cкpипaч(23.06.2024 12:14 - 12:55)
- Это потому что у вас спагетти-код и неправильное разделение на
абстракции. - VladislavS.(23.06.2024 12:03)
- Разница огромная. Если у вас есть функция, где происходит переход
от прикладного уровня к аппаратно-зависимому, то можно нужные две
строчки поставить там. Без (1) введения новых классов и
прочесывания прикладного кода, на предмет где подправить
инициализацию, и без (2) засорения библиотек, ради частных случаев
применения. - Cкpипaч(23.06.2024 11:41)
- Когда вы принимаете решение использовать чужую библиотеку на
развитие которой не можете влиять, то приниманте на себя все риски.
Какая разница как она написана? Даже если вляпались в какашку,
кто-то держит пистолет у виска с требованием обновить её? - VladislavS.(23.06.2024 12:26)
- При чём тут винегрет? Да, есть драйвер I2C_GPIO, он сам себя
инициализирует, если до того не вызывали. Да, оно под капотом и
кишки наружу не торчат. Но функция включения светодиода в
приложении вызывает ручками вписанную (назначенную) функцию от
этого драйвера или от CPU_GPIO (драйвер, как ни странно, тоже
бывает нужен). И она действительно чихать хотела как оно
реализовано. В CPU_GPIO может быть bit banding, работа с Set/Reset
регистрами, может быть чтение-модификация запись Vit(890 знак., 23.06.2024 12:44)
- Всегда есть особенности реалищации, но не надо делать из этого
винегрет. Светодиод не должен заниматься проверкой инициализации
порта. Это дело самого порта. Если у вас такой хитрый порт, то и
наворачивайте его логику. Оставьте светодиоду светодидово. Так код
будет проше и понятней. - VladislavS.(23.06.2024 11:14)
- Это впорос реализации, но не применения. У меня приложение вызывает
функцию управления функциональным узлом - светодиод обмена данными
включить. Под капотом оно и проверит, а инициализирован ли драйвер,
если нет, то запустит инициализацию, и другие проверки, ну или
просто дёрнет GPIO. Класс там у драйвера или модуль (как
идентифицированная единица компиляции) с набором функций - это не
суть важно. - Vit(23.06.2024 10:57)
- Сам бог велел спрятать всё это непотребство в класс расширителя и
выдать светодиоду интерфейс пина к которому он подключен. - VladislavS.(23.06.2024 10:26)
- у меня расширители PCF8574/A и PCA9534/A с жесткой адресацией на
шине. естественно стоит автодедект. но в зависимости от варианта
аппаратной сборки подключается разный набор светодиодов (да и
некоторых ключиков питания). причем сами эти расширители имеют
внутри разную физически конфигурацию выводов - в PCF8574/A
неотключаемая подтяжка, а в PCA9534/A включаемая. для управления
ключиками это важно. светодиоды всегда можно погасить и тут же
зажечь как нужно (вспомная анекдот о Vit(114 знак., 23.06.2024 10:16)
- У вас же расширитель имеет интерфейс обычного порта и предоставляет
доступ к пинам так же как gpio контроллера? И повесить светодиод на
пин расширителя можно так же как на пин контроллера? - VladislavS.(23.06.2024 09:49)
- Эти идеальности не всех посещают. У меня вполне уживаются и светики
на GPIO, и светики, подключенные через I2C расширители. И для этой
группы устройств в базовом проекте туча таргетов для 6-и процов
(один кетайский), 2 типа ядер, 3 типа периферии проца, под
конкретные конфигурации плат (там есть несколько исполнений с тучей
разных интерфейсов и т.п.) с выбранной индикацией (со своими
разношерстными расширителями)... Сильно проще идти от прикладной
задачи, имея подготовленные Vit(3 знак., 23.06.2024 09:30)
- Зачем вы свои проблемы на меня перекладываете? Беру схему, в
заголовочном файле описываю (именно описываю) что куда подключено.
Для светодиода это пин и наличие инверсии, для eeprom порт i2c, для
синтезатора частот порт spi и пин gpio для контроля ФАПЧ и т.д. А
дальше забота компилятора всё это связать. Нет никаких двух и более
мест, по которым вы зачем-то рыскаете. - VladislavS.(23.06.2024 09:12)
- У вас есть неявное предположение что все LED гарантировано ведут
себя одинаково. Я в таком случае введу прикладной номер LED, а то какой номер, к какому биту какого регистра
относится - спрячу внутри модуля bsp. Cкpипaч(236 знак., 23.06.2024 09:12)
- Гарантия одна, в методе включения светодиода не использовать ни имя
регистра, ни номер бита. Использовать абстракцию, я же приводил код
метода LED::On(); VladislavS.(123 знак., 23.06.2024 09:03)
- Я - буду. Поменяю имя регистра или номер бита, если нужно. А как вы
получили гарантию что не регистр, не не номер бита никогда не
изменится в вашем случае? - Cкpипaч(23.06.2024 08:41)
- Вы противоречите своему примеру идеалного метода включения диода в
который поместили работу с битами и регистрами конкретного
контроллера. Вы этот метод будете переписывать раз за разом, а я
нет. Битовая арифметика с регистрами на каком-то уровне всё равно
появится, но этот уровень ниже чем у вас. Gpio, spi, i2c, usb - это
всё должно быть прослойкой абстракциией, позволяющей писать
прикладной уровень не думая для какого контроллера ты пишешь.
Написана эта абстракция VladislavS.(97 знак., 23.06.2024 08:28 - 09:05)
- Перечитал ветку еще раз - мы говорим о разном и друг друга не
слышим. Cкpипaч(556 знак., 23.06.2024 07:39)
- Я максималист. И преждевременная оптимизация - моя слабость и смысл
жизни. К счастью, современные компиляторы позволяют расслабиться.
Уже можно не оптимизировать. И так получится хорошо... За
исключением простыней конфигураций ввода вывода и прочего
жонглирования битами. Абстракция позволяет тонко отделить
необходимость обращения к аппаратуре как указано, без оптимизации
самого обращения, от комбинирования данных при этом обращении.
Честно говоря, я до сих пор не программирую Nikolay_Po(75 знак., 22.06.2024 19:04)
- преждевременная оптимизация - смертный грех для инженера, прямиком
в ад. - General(22.06.2024 20:12)
- К счастью, благодаря прогрессу компиляторов, грешу всё меньше. - Nikolay_Po(22.06.2024 20:30)
- Вы меня не услышали. Операции с регистрами НЕ ДОЛЖНЫ БЫТЬ размазаны по прикладному коду. Настройка ли периферии, команды ли
в регистры общего назначения, они должны быть внутри функций,
реализующих (при взгляде снаружи) действия прикладного понятийного
уровня. Cкpипaч(576 знак., 22.06.2024 19:58)
- Ну да. И функции для управления периферией - тоже не должны "быть размазаны". Samx(288 знак., 10.07.2024 00:49)
- Возможно, вы сильно обобщаете. В конкретном коде с вводом-выводом,
я не припоминаю каких-то особых излишеств. Просто красиво
настраивается периферия. Без лишних повторных обращений к одним и
тем же регистрам, чем грешит, в частности, HAL STM. И защищаю плюсы
с этой точки зрения. Вроде, ничего там по прикладному коду не
размазывалось. - Nikolay_Po(22.06.2024 20:34)
- Есть такое, чрезмерное обобщение грех того же порядка что и преждевременная оптимизация :) - Cкpипaч(22.06.2024 20:39)
- преждевременная оптимизация - смертный грех для инженера, прямиком
в ад. - General(22.06.2024 20:12)
- А почему бы не экономить, особенно если это бесплатно делает
компилятор? И не преждевременно, а всегда и без устали. - VladislavS.(22.06.2024 22:49)
- Тут вот какая штука... Дополнительная абстракция бит, позволяет
оптимизировать код на этапе компиляции. Причём так, что
последовательность действий над волатильными регистрами аппаратуры
сохраняется, обеспечивая требуемые последовательности ввода-вывода.
И, при этом, биты разных объектов, принадлежащие одному регистру,
упаковываются в одну операцию, а не в последовательность. Nikolay_Po(107 знак., 22.06.2024 18:45)
- Т.е. желание впихуйнуть операции над битами в совершенно иной слой
абстракции - неистребимо. Принято. Лично я так делать не буду. И
подчиненным не позволю. - Cкpипaч(22.06.2024 18:27)
- Лишний слой абстракции - это как полиэтиленовый пакетик, в который
заворачивают пульт от ТВ, чтобы сохранить его первозданную красоту.
В растрёпанный от долгой эксплуатации полиэтиленовый пакетик.
Подсмотрено у старшего поколения :-) - SciFi(22.06.2024 16:01)
- Не надо думать о слоях и о том что лишнее, а что не лишнее. Главное
- написать решение задачи/алгоритма понятно (для людей) и в
терминах предметной области. Об эффективности компилятор и др.
позаботятся. - Costic(22.06.2024 16:42)
- Вредный совет detected. НУЖНО думать о слоях. НУЖНО проектировать
системы "сверху - вниз". НУЖНО изолировать аппаратно-зависимые слои
от чисто прикладных. Я потом объясню почему. - Cкpипaч(22.06.2024 18:00)
- Я выше написал про fread/fwrite. Никто же не думает о слое с секторами. И пользователи (программисты) socket'ов не думают как там PHY работает и какие регистры там нужны. И о socket-ах тоже не все хотят думать, т.к. есть классы-обёртки в том же Boost.Asio. - Costic(22.06.2024 19:00)
- Мы пробовали писать так, как рекомендует товарищ Costic. Мой коллега умышленно добавлял уровени абстракции везде, где ему
только показалось, что это может хоть когда-нибудь пригодиться. Я удивился. А он пояснил (не дословно, смысл): "Я не
знаю, как потом я буду развивать этот код дальше. Поэтому
предусматриваю эти абстракции, чтобы можно было удобно вмешаться на
любом уровне." На моё возражение, что, быстродействие может
пострадать, он ответил: "Какое у Nikolay_Po(870 знак., 22.06.2024 18:59)
- Ключевое: symbions(266 знак., 23.06.2024 13:08)
- Вот, на мой взгляд, неплохой пример класса, описывающего полностью всё семейство eeprom 24C. Можно ещё концептами обложить, но в угоду совместимости с отсталыми компиляторами это не сделано. VladislavS.(5 знак., 23.06.2024 08:59, ссылка)
- Я всегда ввожу уровень абстракции, если в этом месте может быть применена разная реализация. Тот же пин на котором висит светодиод может быть портом AVR или STM32 или быть проброшен по радиоканалу и включать шифрованными сообщениями "к чёрту подробности" на другом континенте. Код светодиода от этого не меняется, компилятор сам всё свяжет. - VladislavS.(22.06.2024 23:05)
- ЧИ-ТА-БЕЛЬ_НО-СТЬ! (орет) Мужики, вы издеваетесь?! Представьте, вы
пришли на новое место работы, получили в руки работающую систему и
несколько относительно несложных задач. Вопрос - сколько раз вы
скажите "спасибо" человеку, нагородившему сто-пятьсот промежуточных
классов и сотворившему форменный ооп-спагетти код?! Cкpипaч(375 знак., 22.06.2024 20:15)
- Человека, "нагородившего сто-пятьсот промежуточных классов и сотворившего форменный ооп-спагетти код", я пойму. И пойму его код. Или сделаю заново... - Nikolay_Po(22.06.2024 20:17)
- Вредный совет detected. НУЖНО думать о слоях. НУЖНО проектировать
системы "сверху - вниз". НУЖНО изолировать аппаратно-зависимые слои
от чисто прикладных. Я потом объясню почему. - Cкpипaч(22.06.2024 18:00)
- Не надо думать о слоях и о том что лишнее, а что не лишнее. Главное
- написать решение задачи/алгоритма понятно (для людей) и в
терминах предметной области. Об эффективности компилятор и др.
позаботятся. - Costic(22.06.2024 16:42)
- Всем нужна, все <gpio.h> используют. Но написать GPIO
толково на С++ пока никто не может. Средства С++ и современные IDE
имеют подсказки и помогают писать код. Т.е. на этапе написания кода
уже могут исключаться ошибки, т.к. IDE предложит только
ограниченное множество портов, пинов и иных объектов в зависимости
от контекста. Даже компилировать не надо, как у Владислава. А это
повышение производительности труда, которая тебе очень нравится. - Costic(22.06.2024 19:40)
- Этот код - демонстрация НЕ смешивания областей определения. Там где
определен Fucking_Silly_Led_On() не используются биты. Вообще. Ни в
явной форме, через ООП-прослойку. Cкpипaч(328 знак., 22.06.2024 18:27, ссылка)
- Ровно так и делаю.. Называю эту прослойку bsp, хотя может быть не
совсем корректно называю... POV(571 знак., 20.06.2024 22:35)
- Вы же понимаете, что светодиод это лишь затравка для обсуждения,
как самый примитивный объект. В действительности это достаточно
сложные сущности. А я никаких "bsp" не пишу. Просто указываю что
куда подключено по схеме. Это даже не код как таковой, а чисто
описание. Остаётся потом только логику работы изделия реализовать,
что достаточно просто, когда не надо думать о том как кирпичики
внутри работают. - VladislavS.(20.06.2024 23:07)
- У меня объект - коммутатор за 5М рублей. Более чем сложный с
объемной периферией. И он суко должен работать до списания не
выключаясь и без глюков. Нахер тут плюсы и многое другое. О
прекрасном я думаю на леваках, а в реальной задаче за зарплату -
только о стабильности решения и простоте отладки... POV(148 знак., 20.06.2024 23:53)
- То о чём вы пишете, это вопрос тестирования и объёма испытсний. - VladislavS.(21.06.2024 00:15)
- Вам [не] повезло. По каким-то причинам, две трети жизненного пути
того что вы пишите напрочь выпадает из вашего поля зрения. Cкpипaч(544 знак., 21.06.2024 07:31)
- А вам не приходило в голову, что вам кажется наркоманским код
только потому что вы не владеете языком? Я вот тоже по китайски
ничегошеньки не понимаю, но китайский же не стал от этого хуже. А
те кто изучал С++ свободно читают написанные на нём программы. И
даже исправляют и дорабатывают. Устрицы они такие... - VladislavS.(21.06.2024 07:51)
- Приходило. Флагманская система - на Питоне. Много смотрю чужого кода, на тех же Плюсах и Питоне. Так что за мой кругозор не переживайте :) Cкpипaч(117 знак., 21.06.2024 18:07)
- Да ..дь, тебе (и еще ряду категоричных персонажей) уже писали не раз - тут многие умеют в плюсы. Я например 15 лет писал на них. Свежий синтаксический сахар не знаю, но и не он же определяющий. Кто менее категоричен - использует много разных инструментов, более соответствующих задаче. - POV(21.06.2024 13:19)
- Так сказать, скинули проблему на отдел кадров. "Найдите мне ещё одного с таким же богатым внутренним миром". Есличо, кадровики будут крайние :-) - SciFi(21.06.2024 12:46)
- За один наркоманский cin-cout надо ...вывести в чисто поле,
поставить мордой к стенке, и пустить пулю в лоб, чтоб на всю жизнь
запомнил(С) Хорошо хоть в дуинах не стали это дерьмо прикручивать,
а вернулись к читаемым вариантам. Наверное потому что не смогли:) И
это же их и спасло от плюсов ради плюсов - Vit(21.06.2024 12:33)
- Специально для вас в стандарте появился std::print VladislavS.(68 знак., 21.06.2024 13:15, ссылка)
- Ура! Заживём! - Vit(21.06.2024 14:21)
- Специально для вас в стандарте появился std::print VladislavS.(68 знак., 21.06.2024 13:15, ссылка)
- А вам не приходило в голову, что вам кажется наркоманским код
только потому что вы не владеете языком? Я вот тоже по китайски
ничегошеньки не понимаю, но китайский же не стал от этого хуже. А
те кто изучал С++ свободно читают написанные на нём программы. И
даже исправляют и дорабатывают. Устрицы они такие... - VladislavS.(21.06.2024 07:51)
- ню-ню - POV(21.06.2024 00:43)
- Вам [не] повезло. По каким-то причинам, две трети жизненного пути
того что вы пишите напрочь выпадает из вашего поля зрения. Cкpипaч(544 знак., 21.06.2024 07:31)
- То о чём вы пишете, это вопрос тестирования и объёма испытсний. - VladislavS.(21.06.2024 00:15)
- У меня объект - коммутатор за 5М рублей. Более чем сложный с
объемной периферией. И он суко должен работать до списания не
выключаясь и без глюков. Нахер тут плюсы и многое другое. О
прекрасном я думаю на леваках, а в реальной задаче за зарплату -
только о стабильности решения и простоте отладки... POV(148 знак., 20.06.2024 23:53)
- Спасибо. А то я уже стал сомниваться, не свихнулся ли я сам. - Cкpипaч(20.06.2024 22:43)
- Не свихнулся. Но тем не менее, вы(мы) спорим о вкусе устриц с теми,
кто их ел :-) il-2(584 знак., 21.06.2024 06:01)
- Я - примерно также. И библиотеку манипулирования битами в регистрах писал, для того чтобы понять язык. И со скриптовыми DSL эксперементировал. Cкpипaч(76 знак., 21.06.2024 07:54)
- Например, в С++26 можно будет обратиться к элементу списка
параметров по индексу. Всё станет совсем просто и уже
метапрограммой то не назовёшь там где раньше пришлось бы изрядно
попотеть :) VladislavS.(58 знак., 21.06.2024 07:23)
- Чёртовы наркоманы :) - Cкpипaч(21.06.2024 08:12)
- Вы правы, в ранних стандартах метапрограммировпние было побочным
эффектом и доступно только индивидумам с вывернутым наизнанку
мозгом типа Александреску. В последних стандартах оно хоть и далеко
от идеала, но уже похоже на обычное программирование, и доступно
для понимания обычными программистами типа меня. Да, это всё ещё
зарядка для мозга, но уже доступная всем, а не только КМС. - VladislavS.(21.06.2024 06:51 - 06:58)
- Впрочем, 90-95% кода пишется без метапрограммирования. - VladislavS.(21.06.2024 06:54)
- Блин! Наконец-то :) То, с чего я начал: "90% кода пишется без
этого". И я ужесточил - и должно писаться без этого. Cкpипaч(227 знак., 21.06.2024 07:37)
- Что вы понимаете под ЭТИМ? Обычный шаблон это не метапрограмма.
Применение библиотечного кода, содержащего метапрограмму, это не
метапрограмма. А это и есть обычный повседневный код, понятный и
читаемый. Зубодробительные библиотеки пишутся не так часто. Зато
постоянно используются. - VladislavS.(21.06.2024 07:45)
- Чем реже будут писаться "зубодробительные" библиотеки, тем лучше.
Все что можно написать простым модулем, должно быть написанно
именно так. Cкpипaч(102 знак., 21.06.2024 07:48)
- Качественные библиотеки не могут быть простыми. А как вы судите о
том что проще использовать, если не умеете во второе? - VladislavS.(21.06.2024 07:55)
- Качественные библиотеки - просты. - Cкpипaч(21.06.2024 08:21)
- Качественные библиотеки не могут быть простыми. А как вы судите о
том что проще использовать, если не умеете во второе? - VladislavS.(21.06.2024 07:55)
- Чем реже будут писаться "зубодробительные" библиотеки, тем лучше.
Все что можно написать простым модулем, должно быть написанно
именно так. Cкpипaч(102 знак., 21.06.2024 07:48)
- Что вы понимаете под ЭТИМ? Обычный шаблон это не метапрограмма.
Применение библиотечного кода, содержащего метапрограмму, это не
метапрограмма. А это и есть обычный повседневный код, понятный и
читаемый. Зубодробительные библиотеки пишутся не так часто. Зато
постоянно используются. - VladislavS.(21.06.2024 07:45)
- Блин! Наконец-то :) То, с чего я начал: "90% кода пишется без
этого". И я ужесточил - и должно писаться без этого. Cкpипaч(227 знак., 21.06.2024 07:37)
- Впрочем, 90-95% кода пишется без метапрограммирования. - VladislavS.(21.06.2024 06:54)
- Не свихнулся. Но тем не менее, вы(мы) спорим о вкусе устриц с теми,
кто их ел :-) il-2(584 знак., 21.06.2024 06:01)
- Вы же понимаете, что светодиод это лишь затравка для обсуждения,
как самый примитивный объект. В действительности это достаточно
сложные сущности. А я никаких "bsp" не пишу. Просто указываю что
куда подключено по схеме. Это даже не код как таковой, а чисто
описание. Остаётся потом только логику работы изделия реализовать,
что достаточно просто, когда не надо думать о том как кирпичики
внутри работают. - VladislavS.(20.06.2024 23:07)
- Но это же ужасно. Во-первых, светодиод ничего не должен знать о том
на каком контроллере висит. Во-вторых, он не должен уметь управлять
ногами контроллера. А светодиод это просто бит. А если это
какой-нибудь синтезатор частот? Я напишу только класс, описывающий
его внутреннюю логику работы и параметром передам spi. Чтобы вообще
не думать на каком контроллере он будет работать. VladislavS.(372 знак., 20.06.2024 21:11 - 21:20)
- Предлагаю еще раз вернуться к сути - на прикладном уровне не должно
быть манипуляции битами. Cкpипaч(746 знак., 21.06.2024 08:11 - 22.06.2024 14:05)
- Именно операции над объектом barrier будут правильными! Costic(83 знак., 22.06.2024 15:11)
- Категоричненько :) А вы сколько лет СКУД занимаетесь? - Cкpипaч(22.06.2024 21:13)
- 0. :-) А вот языками занимался, особенно в институте. Считаю, что
флудить-теоретизировать имею право. ;-) Если уж очень хочется
открыть барьер, то только так: ErrorCode Open(Barrier
&barrier); - Costic(22.06.2024 22:03)
- Теория это очень интересно. Люблю теорию :) Вызов Open, как я понимаю, блокирующий? - Cкpипaч(19.07.2024 18:06)
- 0. :-) А вот языками занимался, особенно в институте. Считаю, что
флудить-теоретизировать имею право. ;-) Если уж очень хочется
открыть барьер, то только так: ErrorCode Open(Barrier
&barrier); - Costic(22.06.2024 22:03)
- Категоричненько :) А вы сколько лет СКУД занимаетесь? - Cкpипaч(22.06.2024 21:13)
- Именно операции над объектом barrier будут правильными! Costic(83 знак., 22.06.2024 15:11)
- "Светодиод ничего не должен знать". Не путайте интерфейс и
реализацию. ИНТЕРФЕЙС и не знает. Cкpипaч(345 знак., 20.06.2024 21:27)
- Вы это "самым прямым" способом делаете для каждой реализации
руками. А это легко и непринуждённо может делать компилятор. И он,
в отличии от вас, не ошибётся. Получается, что абстракции не
лишние, а позволяющие избавить вас от писанины, ошибок и
необходимости заглядывания внутрь. Что в конечном счёте повышает
качество кода и производительность вашей работы. - VladislavS.(20.06.2024 21:50)
- Да, именно так плюсовики всегда и говорят. Но правда состоит в том,
что вы тупо графоманы, без обид. Cкpипaч(401 знак., 20.06.2024 22:09)
- Плюсовики не сразу такими родились, а пришли к этому c опытом. Когда земля была чуть тёплая таких возможностей в языке не было. Могли бы всё по старинке и делать, если бы это было лучше. Тому что я рассказываю применительно к эмбэдду нигде не учат. - VladislavS.(20.06.2024 22:28)
- Сложность библиотечного кода на плюсах, естественно, выше. Именно
сложность, а не объём текста. Скорость набора текста никогда не
была ограничивающим фактором в программировании. Но зато и
возможности выше. Что в последствии даёт экономию в момент
применения. Класс пишешь один раз, а применяешь многократно. А в
месте применения всё сильно проще получается. - VladislavS.(20.06.2024 22:15)
- Ненужная. Сложность. - Cкpипaч(20.06.2024 22:23)
- Нет, это виноград кислый. - VladislavS.(20.06.2024 22:30)
- Это не виноград. И когда возникает потребность в (еще недавно)
работающей системе найти почему она стала "как-то странно работать"
(тм), то каждая лишняя абстракция как удар по печени. - Cкpипaч(20.06.2024 22:34)
- Мой опыт говоит об обратном. Качественно написанная и
оттестированная абстракция работает лучше и понятнее. Когда я
говорю "оно не может не работать" мне уже верят на слово и идут
исправлять у себя :) - VladislavS.(20.06.2024 22:48)
- "Качественно написанная и оттестированная..." любопытно, как вы
этого добиваетесь? Как умудряетесь проверить все варианты
использования, да еще на разном железе? А описание составляете, в
котором будут указаны ограничения по применению? AlexBi(412 знак., 21.06.2024 10:54)
- Ктулху запрещает посмотреть что делает метод LED::On() ? - VladislavS.(21.06.2024 11:09)
- На сколько я понял идею метапрограммирования на базе шаблонов
(возможно понял не правильно), там нет "программы"
(последовательность действий, как в С), там есть "правила" (как в
makefile), которые в итоге разворачиваются в текст программы.
Наверное приличная IDE может показать, что получится в итоге, но
без посторонней помощи разворачивать в голове цепочку правил не
просто. Или я ошибаюсь? - AlexBi(21.06.2024 11:20)
- Не совсем. Развернуть в текст программы это обычный препроцессор.
Метапрограмма на этапе компиляции генерирует некие константные
данные или конструирует типы из которых потом либо инстанцируются
шаблоны, либо просто формируются константные данные. - VladislavS.(21.06.2024 13:02)
- Макросы это уже мета- или еще нет? - ASDFS(21.06.2024 13:12)
- Не совсем. Развернуть в текст программы это обычный препроцессор.
Метапрограмма на этапе компиляции генерирует некие константные
данные или конструирует типы из которых потом либо инстанцируются
шаблоны, либо просто формируются константные данные. - VladislavS.(21.06.2024 13:02)
- На сколько я понял идею метапрограммирования на базе шаблонов
(возможно понял не правильно), там нет "программы"
(последовательность действий, как в С), там есть "правила" (как в
makefile), которые в итоге разворачиваются в текст программы.
Наверное приличная IDE может показать, что получится в итоге, но
без посторонней помощи разворачивать в голове цепочку правил не
просто. Или я ошибаюсь? - AlexBi(21.06.2024 11:20)
- Ктулху запрещает посмотреть что делает метод LED::On() ? - VladislavS.(21.06.2024 11:09)
- У каждого свой опыт. Мой - за 2023й больше половины переделок в коде нашей SCADA было вызвано минорными изменениями в коде сторонних библиотек и веб-броузеров. - Cкpипaч(21.06.2024 07:44)
- Мне верят с сишником - я тоже не подвожу. Это не имеет никакого
отношения к инструменту в случае опытного и аккуратного
исполнителя. - POV(20.06.2024 22:55)
- Пардон, это Скрипач себе не верит. :) - VladislavS.(20.06.2024 23:12)
- Тут недавно давали сцылочку на статью, про то, что константа, по
умолчанию, это double. Чувак искал такие неявные присвоения и
находил их дажэ в проверенных либах. Типа, вместо хардверного
float, поднимался софтверный double, с соотвецтвующим
быстродействием. "Верить, в наше время, нельзя никому..." - mse homjak(20.06.2024 23:22)
- Тем более, стоит выбирать языки с более строгим контролем типов и
наличием механизма проверки и ограничея типов (концепты). - VladislavS.(21.06.2024 00:18)
- Т.е. Ц и ЦПП не роялят? - mse homjak(21.06.2024 18:34)
- У одного из них нет ни первого, ни второго. - VladislavS.(21.06.2024 23:53)
- Зато у другого-то есть. А тем не менее, разницы нет. - mse homjak(22.06.2024 19:57)
- Так не воспользовались механизмом. - VladislavS.(23.06.2024 08:27)
- Зато у другого-то есть. А тем не менее, разницы нет. - mse homjak(22.06.2024 19:57)
- У одного из них нет ни первого, ни второго. - VladislavS.(21.06.2024 23:53)
- т.е. Delphi 12? - POV(21.06.2024 00:44)
- Он умеет в эмбедде? Тогда почему бы и да. - VladislavS.(21.06.2024 15:19)
- Т.е. Ц и ЦПП не роялят? - mse homjak(21.06.2024 18:34)
- Тем более, стоит выбирать языки с более строгим контролем типов и
наличием механизма проверки и ограничея типов (концепты). - VladislavS.(21.06.2024 00:18)
- Тут недавно давали сцылочку на статью, про то, что константа, по
умолчанию, это double. Чувак искал такие неявные присвоения и
находил их дажэ в проверенных либах. Типа, вместо хардверного
float, поднимался софтверный double, с соотвецтвующим
быстродействием. "Верить, в наше время, нельзя никому..." - mse homjak(20.06.2024 23:22)
- Пардон, это Скрипач себе не верит. :) - VladislavS.(20.06.2024 23:12)
- "Качественно написанная и оттестированная..." любопытно, как вы
этого добиваетесь? Как умудряетесь проверить все варианты
использования, да еще на разном железе? А описание составляете, в
котором будут указаны ограничения по применению? AlexBi(412 знак., 21.06.2024 10:54)
- Мой опыт говоит об обратном. Качественно написанная и
оттестированная абстракция работает лучше и понятнее. Когда я
говорю "оно не может не работать" мне уже верят на слово и идут
исправлять у себя :) - VladislavS.(20.06.2024 22:48)
- Это не виноград. И когда возникает потребность в (еще недавно)
работающей системе найти почему она стала "как-то странно работать"
(тм), то каждая лишняя абстракция как удар по печени. - Cкpипaч(20.06.2024 22:34)
- Нет, это виноград кислый. - VladislavS.(20.06.2024 22:30)
- Ненужная. Сложность. - Cкpипaч(20.06.2024 22:23)
- Да, именно так плюсовики всегда и говорят. Но правда состоит в том,
что вы тупо графоманы, без обид. Cкpипaч(401 знак., 20.06.2024 22:09)
- Вы это "самым прямым" способом делаете для каждой реализации
руками. А это легко и непринуждённо может делать компилятор. И он,
в отличии от вас, не ошибётся. Получается, что абстракции не
лишние, а позволяющие избавить вас от писанины, ошибок и
необходимости заглядывания внутрь. Что в конечном счёте повышает
качество кода и производительность вашей работы. - VladislavS.(20.06.2024 21:50)
- Да. Именно так. Потому что это - читабельно. Cкpипaч(112 знак., 20.06.2024 21:18)
- Это не читабельно, а сто раз писабельно. Вместо того чтобы один раз
написать универсальный метод, который ещё и автоматически
оптимизироваться будет. Ведь управлять ногой, на которой висит
светодиод, можно разными способами. Можно рассказать компилятору
как это сделать лучше и он будет делать это сам. - VladislavS.(20.06.2024 21:28)
- Насрать на "писабельность". Cкpипaч(189 знак., 20.06.2024 21:38)
- А мне не приходится. Я всегда знаю, что мой класс делает только то
что положено объекту который он описывает. Синтезатор частот
рассчитывает делители и грузит регистры. И делает это одинаково на
любом контроллере. Чего туда заглядывать то? - VladislavS.(20.06.2024 21:54)
- Я - наладчик. Вы - писатель (пожимает плечами) - Cкpипaч(20.06.2024 22:02)
- Я не понимаю что такое наладчик. А я программист и мой подход очень
часто позволяет запустить проект с листа, если он собран из ранее
использовавшихся составляющих. Просто описываю что на каком
порту/интерфейсе висит и оно сразу работает без переписываний
внутренностей. - VladislavS.(20.06.2024 22:16)
- Можно конкретику? Пример кода? А то срётесь, а чего срётесь - не
понимаю. И еще... Как классифицирется случай, когда один и тот же
человек в одном проекте "наладчик", а в другом "программист"? - VLLV(21.06.2024 08:21)
- КМК, вопрос в том, что Motor_LED_On() (ну или, например,
Motor->LED->On()) относится к прикладному ПО. В то же
время страдания на тему LED::On() относятся к системному, и там, не
имея привязки к приложению можно аж добавить свойство а-ля Red
и/или какой-то поряковый номер со схемы электрической. В прикладной
части важно чтобы сама функция была обеспечена системной частью, но
головное - конечное документированное расположение на морде. При
миграции код Vit(114 знак., 23.06.2024 10:59)
- Все же мы большей частью болтаемся в низкоуровнем эмбеддерстве, и
для меня вопрос скорее не про прикладной/системный уровни, а такой
- или однослойные макросы, как в примере Скрипача, или с
прокладочкой с элементами абстракции типа таблички с распределением
выводов. Окупается ли эта прокладочка? Если же все-таки про
прикладной/системный ... Когда "дерганье вывода" требует больше
интеллекта, для меня это однозначно прикладной уровень. Как раз
сейчас отбиваюсь от проекта с VLLV(114 знак., 24.06.2024 02:24)
- С расширителями вывод приходится делать через чтение-модификация-запись (обычно заводится буфер). Соответственно уже возникает прокладка. Не вижу как без неё. - Vit(24.06.2024 08:16)
- Прокладочка КМК нужна обязательно. Но относить ее нужно к прикладной программе, а не к железу. Таблички? Предпочитаю явный if-elsif. Cкpипaч(342 знак., 24.06.2024 08:00)
- Все же мы большей частью болтаемся в низкоуровнем эмбеддерстве, и
для меня вопрос скорее не про прикладной/системный уровни, а такой
- или однослойные макросы, как в примере Скрипача, или с
прокладочкой с элементами абстракции типа таблички с распределением
выводов. Окупается ли эта прокладочка? Если же все-таки про
прикладной/системный ... Когда "дерганье вывода" требует больше
интеллекта, для меня это однозначно прикладной уровень. Как раз
сейчас отбиваюсь от проекта с VLLV(114 знак., 24.06.2024 02:24)
- КМК, вопрос в том, что Motor_LED_On() (ну или, например,
Motor->LED->On()) относится к прикладному ПО. В то же
время страдания на тему LED::On() относятся к системному, и там, не
имея привязки к приложению можно аж добавить свойство а-ля Red
и/или какой-то поряковый номер со схемы электрической. В прикладной
части важно чтобы сама функция была обеспечена системной частью, но
головное - конечное документированное расположение на морде. При
миграции код Vit(114 знак., 23.06.2024 10:59)
- Можно конкретику? Пример кода? А то срётесь, а чего срётесь - не
понимаю. И еще... Как классифицирется случай, когда один и тот же
человек в одном проекте "наладчик", а в другом "программист"? - VLLV(21.06.2024 08:21)
- Я не понимаю что такое наладчик. А я программист и мой подход очень
часто позволяет запустить проект с листа, если он собран из ранее
использовавшихся составляющих. Просто описываю что на каком
порту/интерфейсе висит и оно сразу работает без переписываний
внутренностей. - VladislavS.(20.06.2024 22:16)
- Я - наладчик. Вы - писатель (пожимает плечами) - Cкpипaч(20.06.2024 22:02)
- А мне не приходится. Я всегда знаю, что мой класс делает только то
что положено объекту который он описывает. Синтезатор частот
рассчитывает делители и грузит регистры. И делает это одинаково на
любом контроллере. Чего туда заглядывать то? - VladislavS.(20.06.2024 21:54)
- Насрать на "писабельность". Cкpипaч(189 знак., 20.06.2024 21:38)
- Это не наследование, а параметризация. Собрать всё воедино - работа
компилятора. И он сделает лучше, чем вы руками. - VladislavS.(20.06.2024 21:23)
- Я не против. Но прочитать, до уровня полного понимания что происходит, мой вариант на
порядок проще. - Cкpипaч(20.06.2024 21:29)
- Уровень полного понимания должен заканчиваться на знании, что этот
метод включает светодиод (или устанавливает частоту в случае
синтезатора). Как он это делает для понимания знать не надо. Вы
что, не доверяете своему коду? Но даже если решите посмотреть, то
куда понятнее увидеть в методе включения светодиода команду
установки (или сброса) порта, а не манипуляцию непонятными битами
регистров (поди ты вспомни их во всём этом зоопарке). VladislavS.(443 знак., 20.06.2024 21:43 - 22:55)
- Я не доверяю никому и ничему. Я - наладчик :) - Cкpипaч(20.06.2024 21:43)
- Уровень полного понимания должен заканчиваться на знании, что этот
метод включает светодиод (или устанавливает частоту в случае
синтезатора). Как он это делает для понимания знать не надо. Вы
что, не доверяете своему коду? Но даже если решите посмотреть, то
куда понятнее увидеть в методе включения светодиода команду
установки (или сброса) порта, а не манипуляцию непонятными битами
регистров (поди ты вспомни их во всём этом зоопарке). VladislavS.(443 знак., 20.06.2024 21:43 - 22:55)
- Я не против. Но прочитать, до уровня полного понимания что происходит, мой вариант на
порядок проще. - Cкpипaч(20.06.2024 21:29)
- Это не читабельно, а сто раз писабельно. Вместо того чтобы один раз
написать универсальный метод, который ещё и автоматически
оптимизироваться будет. Ведь управлять ногой, на которой висит
светодиод, можно разными способами. Можно рассказать компилятору
как это сделать лучше и он будет делать это сам. - VladislavS.(20.06.2024 21:28)
- Предлагаю еще раз вернуться к сути - на прикладном уровне не должно
быть манипуляции битами. Cкpипaч(746 знак., 21.06.2024 08:11 - 22.06.2024 14:05)
- Этот код гавно, и я поясню почему. Costic(1098 знак., 22.06.2024 15:25)
- Если нет никакого смысла ковыряться, то плюсы не нужны! SciFi(3 знак., 20.06.2024 09:16)
- Лично меня товарищ VladislavS. вполне убедил. Поищите его сообщения на тему плюсов. Познавательно и, на мой взгляд, убедительно. Думаю, к его мнению стоит прислушиваться. - Nikolay_Po(20.06.2024 20:40)
- Нужны. Они позволяют сделать множнство проверок и оптимизаций на этапе компиляции при переходе на более высокий уровень абстракций. И сам переход на более высокий уровень сильно проще. - VladislavS.(20.06.2024 09:31)
- Правы оба, но у чужих библиотек есть фатальный недостаток: их писал
кто-то другой. - Boвa(20.06.2024 09:12)
- +100500! - Cкpипaч(20.06.2024 14:53)
- Ваша позиция правильна. Эх, опустился норот без розовыхЪ членов
сообщества. Скоро под себя ходить будет. Никаких 1< < не
должно быть нигде в .с файлах. В одном лишь конфиг-хидере все
выводы описываются. - RED_LED(20.06.2024 23:49, )