-
- У меня написаны классы для GPIO-портов старых STM32 типа F1, новых
STM32, Миландра MDR1986, Cамописного порта для Microblaze,
Dummy-порта (виртуального). VladislavS.(3532 знак., 12.01.2022 16:04)
- Извините, но ответ меня не удовлетворяет. Я интересовался про
"разные типы". Имелись ввиду типы данных, а вы мне про разные
контроллеры. Т.е. у вас шаблон имеет единственное применение - к
Пину. Опровергните? Costic(276 знак., 12.01.2022 16:25)
- Я не понимаю вопрос. Класс принимает на вход GPIO-порты разных
типов (разных контроллеров, реальные, виртуальные). Почему он
должен принимать что-то другое? Он для этого предназначен. Сам же
он агрегируя другие порты ведёт себя как порт. Его можно передавать
в другие классы дальше точно так же как порты и пины. VladislavS.(111 знак., 12.01.2022 17:05)
- Например, шаблоны min и max принимают любые объекты, для которых определён оператор сравнения. Любые, а не
только int, uint16_t. У вас только 1 (единственный) тип - порт/пин. - Costic(13.01.2022 12:04)
- Вы глубоко заблуждаетесь. Каждый пин это ДРУГОЙ ТИП, каждый порт
это ДРУГОЙ ТИП, каждый список пинов это ДРУГОЙ тип. Даже один и тот
же пин с разным режимом работы это ДРУГОЙ ТИП, не говоря уже об их
комбинациях. VladislavS.(319 знак., 13.01.2022 13:26 - 15:26, картинка)
- А нужно это, что-бы не хранить в полях служебную информацию -
адрес, номер бита и пр., а извлекать всё непосредственно из типа, я
правильно понимаю? - =AlexD=(13.01.2022 14:07)
- Совершенно верно. Все свойства объекта (порт, пин, режим)
"хранятся" в его типе. Сам объект не будет занимать память, даже
если я создам его. И он умеет выполнять действия, присущие этому
типу (или объекту). VladislavS.(464 знак., 13.01.2022 15:19)
- Т.е. вы используете шаблоны как (супер-)препроцессор, для генерации
и проверки кода статического во время компиляции. Тут кто-то свой
пример кольцевого буфера на препроцессоре с "##"-директивами кидал.
Суть, примерно та же, но за много лет такая генерация кода не очень
распространена. Впрочем, я благодарен вам за ответы и дискуссию. - Costic(13.01.2022 16:53)
- Я бы не называл это генерацией кода. Это скорее сочетание двух вещей: VladislavS.(1564 знак., 14.01.2022 08:16)
- Не, создание объекта по любому резервирует минимум 1 байт памяти,
потому что у объекта должен быть уникальный адрес. - =AlexD=(13.01.2022 16:46)
- Объект пустой, адрес его я не использую. Оптимизатор его чики-чики. VladislavS.(235 знак., 13.01.2022 17:07)
- если я правильно понял: экземпляр объекта "размазывается по
исполняемому коду" столько раз сколько упоминается (типо inline). В
обычных Си экземпляр объекта занимает память "один раз", а его
функции вызываются столько раз сколько надо. - Zoro(13.01.2022 17:17)
- У этих объектов нечем занимать память, переменных членов класса в них нет. Статические методы вырождаются в обычные функции, которые обладают свойством хорошо инлайниться, так как определены в описании класса. Точно так же как и в С они могут быть один один раз в коде и вызываться из разных мест. Это уже на усмотрение оптимизатора. На самом деле, нет никакой необходимости вообще создавать эти объекты. Это я пример просто для понимания сути происходящего привёл. Намного VladislavS.(288 знак., 13.01.2022 17:57)
- если я правильно понял: экземпляр объекта "размазывается по
исполняемому коду" столько раз сколько упоминается (типо inline). В
обычных Си экземпляр объекта занимает память "один раз", а его
функции вызываются столько раз сколько надо. - Zoro(13.01.2022 17:17)
- Объект пустой, адрес его я не использую. Оптимизатор его чики-чики. VladislavS.(235 знак., 13.01.2022 17:07)
- Вот это я понимаю, вот с этого и надо было начинать агитировать :) symbions(83 знак., 13.01.2022 15:38)
- С литературой сложно. Применительно к эмбедду вообще всё по нулям.
Я начинал с Г.Шилдта, но он уж очень устарел. Если только совсем
никаких знаний по С++ нет, то можно по нему основы изучить. Но
потом С++17 и С++20 придётся самостоятельно подтягивать. Сейчас
много докладов с разных тематических конференций на тытрубе
выкладывают, особенно после выхода новых стандартов. Попадаются
очень интересные. Но это надо увлекаться этим, иначе тяжело. - VladislavS.(13.01.2022 16:14)
- Вот Евгений список выложил symbions(35 знак., 13.01.2022 20:16, ссылка)
- Нет литературы - тогда не взлетит - 3m(13.01.2022 16:53)
- С литературой сложно. Применительно к эмбедду вообще всё по нулям.
Я начинал с Г.Шилдта, но он уж очень устарел. Если только совсем
никаких знаний по С++ нет, то можно по нему основы изучить. Но
потом С++17 и С++20 придётся самостоятельно подтягивать. Сейчас
много докладов с разных тематических конференций на тытрубе
выкладывают, особенно после выхода новых стандартов. Попадаются
очень интересные. Но это надо увлекаться этим, иначе тяжело. - VladislavS.(13.01.2022 16:14)
- Т.е. вы используете шаблоны как (супер-)препроцессор, для генерации
и проверки кода статического во время компиляции. Тут кто-то свой
пример кольцевого буфера на препроцессоре с "##"-директивами кидал.
Суть, примерно та же, но за много лет такая генерация кода не очень
распространена. Впрочем, я благодарен вам за ответы и дискуссию. - Costic(13.01.2022 16:53)
- Совершенно верно. Все свойства объекта (порт, пин, режим)
"хранятся" в его типе. Сам объект не будет занимать память, даже
если я создам его. И он умеет выполнять действия, присущие этому
типу (или объекту). VladislavS.(464 знак., 13.01.2022 15:19)
- А нужно это, что-бы не хранить в полях служебную информацию -
адрес, номер бита и пр., а извлекать всё непосредственно из типа, я
правильно понимаю? - =AlexD=(13.01.2022 14:07)
- Вы глубоко заблуждаетесь. Каждый пин это ДРУГОЙ ТИП, каждый порт
это ДРУГОЙ ТИП, каждый список пинов это ДРУГОЙ тип. Даже один и тот
же пин с разным режимом работы это ДРУГОЙ ТИП, не говоря уже об их
комбинациях. VladislavS.(319 знак., 13.01.2022 13:26 - 15:26, картинка)
- Например, шаблоны min и max принимают любые объекты, для которых определён оператор сравнения. Любые, а не
только int, uint16_t. У вас только 1 (единственный) тип - порт/пин. - Costic(13.01.2022 12:04)
- Я не понимаю вопрос. Класс принимает на вход GPIO-порты разных
типов (разных контроллеров, реальные, виртуальные). Почему он
должен принимать что-то другое? Он для этого предназначен. Сам же
он агрегируя другие порты ведёт себя как порт. Его можно передавать
в другие классы дальше точно так же как порты и пины. VladislavS.(111 знак., 12.01.2022 17:05)
- Извините, но ответ меня не удовлетворяет. Я интересовался про
"разные типы". Имелись ввиду типы данных, а вы мне про разные
контроллеры. Т.е. у вас шаблон имеет единственное применение - к
Пину. Опровергните? Costic(276 знак., 12.01.2022 16:25)
- У меня написаны классы для GPIO-портов старых STM32 типа F1, новых
STM32, Миландра MDR1986, Cамописного порта для Microblaze,
Dummy-порта (виртуального). VladislavS.(3532 знак., 12.01.2022 16:04)