Перейти к содержанию
    

Плавный переход C -> C++ под МК

Хорошо, что запустили в отладчике 🙂 А обоснование как раз и даст понимание происходящему на простом примере. Потому что более сложные примеры - это контейнеры типов с сортировкой на основе как раз рассматриваемого простого примера.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте например сходу обосновать то, что происходит вот тут:

template<typename A, typename B, typename... C>
struct L<A, Collection<B, C...>> {
    using Result = typename K<B, typename L<Q, Collection<C...>>::Result>::Result;
};

 если не знаете, как работает предыдущий пример, то в этом месиве букв фиг разберетесь 🙂 

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, EdgeAligned сказал:

Так что рано ногодрыг списывать со счетов.

Ну, не знаю. Один раз написал и отладил драйвер всех внешних лампочек и кнопок, и наружу выдал API их управления - дальше, на высоком уровне, можно уже что угодно делать.

2 минуты назад, EdgeAligned сказал:

Попробуйте например сходу обосновать то, что происходит вот тут:

template<typename A, typename B, typename... C>
struct L<A, Collection<B, C...>> {
    using Result = typename K<B, typename L<Q, Collection<C...>>::Result>::Result;
};

🙂

Даже вчитываться не буду)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А номера пинов и имена портов как задавать?

7 минут назад, Arlleex сказал:

Даже вчитываться не буду)

🙂 Логично. Хотя там написано ровно то же самое (по принципу), что и в примере выше, просто букв больше.

Беда в том, что на вот этой многобуквенной собачьей хрени построена STL - стандартная библиотека шаблонов - всякие там векторы, контейнеры, итераторы и проч.лабуда. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, EdgeAligned сказал:

А номера пинов и имена портов как задавать?

Через дефайны или вовсе гвоздями прибить... Практика такова, что от проекта к проекту все равно невольно приходится просматривать исходники на предмет косяков. А задать даже гвоздями прибитые номера пинов - дело пары минут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, EdgeAligned said:

А номера пинов и имена портов как задавать?

Буквамии и цифрами. Без всего этого геморроя с С++

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во, я раньше так и делал! 🙂 Прибивал гвоздями. И меня всегда это раздражало или немного... ээээ... неудовлетворяло, скажем так. И это было одним из поводов начать проработку С++. На ++ тоже опробовал несколько вариантов и довольно быстро пришел к варианту с using DC = Pin<GpioA, 6>; DC::Low(); и передачей пинов в классы через шаблоны. Затем потребовалось создавать группы пинов и пришлось вплотную засесть за изучение контейнеров типов. Пишется не сильно сложно, хотя синтаксис черезжопный, чего уж скрывать.
Итог - теперь не надо прибивать гвоздями и править в драйвере.
Аналогично поступать и со всякими там SPI, через создание псевдонимов шаблонных классов.

Переписывать заголовочник МК для этого не нужно.

Впрочем, я нисколько не настаиваю. Я просто описываю то, что я делал и почему, по каким причинам. Вы конечно же вольны делать по-своему, я ничуть не против 🙂 Кое-кто вон например вообще имеет 20-летний стаж погромирования и собаку съел на нем, я тут даже вообще не берусь судить, он просто Мега-Мастер (ыгыгы) 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, EdgeAligned сказал:

Итог - теперь не надо прибивать гвоздями и править в драйвере.

И переходим на другой контроллер со своими тараканами и хитрожопыми регистрами, допускающими какой-то уникальный способ инициализации всяких пинов через какой-то хитрый регистр, и вся эти мутотень в виде отлаженных трехэтажных шаблонов летит в помойку... и все по новой.

От плюсов в МК до сих пор использую лишь пространства имен и иногда шаблоны структур - но не в драйверах железа, а на чуть более высоком уровне. Там в них смысла больше.

А работа с регистрами сводится к тому, чтобы не ошибиться записать нужное число в нужное битовое поле регистра. Поэтому без всяких плюсов я себе наклепал горстку упрощающих жизнь макросов, обычных Сишных. Зато сразу понятно, что они делают, и от перехода на новый стандарт хоть плюсов, хоть Си, не зудит в одном месте - будет ли работать очередная хитрая конструкция в виде 100500 шаблонов или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ровно то же самое в этом случае вы будете делать и с "прибитыми гвоздями" дефайнами/макросами - менять их. Так что 1:1, ничья 🙂 

Еще раз повторюсь, что я никого ни в чем не убеждаю, вы все тут мастера с большой буквы П, и вольны делать так, как привыкли. Я лишь описываю свой "путь воина". Мне уровня написания некоторых ассов как до китая итди. Чтоб я так начал писать на их уровне, это ж мне надо бутылки две водяры замахнуть 🙂 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, EdgeAligned сказал:

Ровно то же самое в этом случае вы будете делать и с "прибитыми гвоздями" дефайнами/макросами - менять их. Так что 1:1, ничья 🙂 

Еще раз повторюсь, что я никого ни в чем не убеждаю, вы все тут мастера с большой буквы П, и вольны делать так, как привыкли. Я лишь описываю свой "путь воина". Мне уровня написания некоторых ассов как до китая итди. Чтоб я так начал писать на их уровне, это ж мне надо бутылки две водяры замахнуть 🙂 

Ну а зачем пытаться вникать в трехэтажную наскальную живопись плюсов, которая работает в C++17, но не работает в 11, но частично работает в 20, а в следующих версиях вовсе сделали улучшение и теперь все предыдущие способы расцениваются гурами как говнокод?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Arlleex said:

И переходим на другой контроллер со своими тараканами и хитрожопыми регистрами, допускающими какой-то уникальный способ инициализации всяких пинов через какой-то хитрый регистр, и вся эти мутотень в виде отлаженных трехэтажных шаблонов летит в помойку... и все по новой.

Никаких проблем с этим нет, по крайней мере у меня. Просто под каждый камень нужно сделать свой набор "драйверов", а интерфейс одинаковый (практически), поэтому user код понятия не имеет на каком камне запущен.

Проблема с переносимостью решена, читаемость - отличная, цена - немного больше расход озу, в производительности потери нет, т.к. работа идет фактически с регистрами через готовый h-файл проца, который дает производитель.

Посмотрите для примера как это сделано на ардуино, видимо его авторы в свое время ставили именно такую задачу - отвязаться от разношерстного железа, тем самым снизить порог вхождения. Свою задачу они решили.

Я пошел таким же путем, т.к. этот путь был уже пройден и показал свою эффективность, соотв. тоже и достиг аналогичных результатов и своих целей.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Об этом и говорю! В "помойку" летит лишь самый нижний "этаж", а вся остальная надстройка остается нетронутой.
Тем более, что замута с шаблонами как раз и призвана недопустить перерасхода ресурсов МК. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Forger сказал:

Никаких проблем с этим нет, по крайней мере у меня. Просто под каждый камень нужно сделать свой набор "драйверов", а интерфейс одинаковый (практически), поэтому user код понятия не имеет на каком камне запущен.

Какая разница, обложить функцию InitGPIO() плюсовыми фишками всяких там шаблонных штук, которые при смене МК придется переписать, или переписать сам InitGPIO() напрямую?

В текущем проекте мне было совершенно некогда заниматься созерцанием, поэтому я воспользовался своими отлаженными макросами для модификации битовых полей в регистрах

UPD_BIT(GPIOA->PUPDR,   RST(GPIO_PUPDR_PUPD12_Msk | GPIO_PUPDR_PUPD11_Msk),
                        SET(0x1 * (GPIO_PUPDR_PUPD12_0 | GPIO_PUPDR_PUPD11_0)),
                        INV(0));
UPD_BIT(GPIOA->AFR[1],  RST(GPIO_AFRH_AFSEL12_Msk | GPIO_AFRH_AFSEL11_Msk),
                        SET(0x9 * (GPIO_AFRH_AFSEL12_0 | GPIO_AFRH_AFSEL11_0)),
                        INV(0));
UPD_BIT(GPIOA->MODER,   RST(GPIO_MODER_MODER12_Msk | GPIO_MODER_MODER11_Msk),
                        SET(0x2 * (GPIO_MODER_MODER12_0 | GPIO_MODER_MODER11_0)),
                        INV(0));
UPD_BIT(GPIOA->OTYPER,  RST(GPIO_OTYPER_OT12_Msk),
                        SET(0),
                        INV(0));
UPD_BIT(GPIOA->OSPEEDR, RST(GPIO_OSPEEDR_OSPEED12_Msk),
                        SET(0x2 * GPIO_OSPEEDR_OSPEED12_0),
                        INV(0));


Читаемо? Ну, мне понятно - хотя и тут можно все эти чиселки и гвоздеприбитые определения вытащить в один хедер, где определить пины в виде #define CAN_RX A, 10 и т.д. Не охота.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Arlleex сказал:

и теперь все предыдущие способы расцениваются гурами как говнокод?

Ну, это уже издержки 🙂 Хотя, ядро языка то не меняется, меняются надстройки, которые во многом являются расширением STL.

И лично я пишу лично для себя, поэтому не обращаю внимание, если кому-то покажется, что я недостаточно современно выполнил говнокод. Главное, что я достиг поставленной цели. Меня не устраивали некоторые моменты и я их решил. Ну а то, что в последствии это будет выглядеть устаревшим - ну дак всё течет, всё меняется. Я раньше вообще на ассемблере писал, а щас на него скажут - че за архаизм.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...