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

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

6 часов назад, AHTOXA сказал:

Если нужно, чтобы это всё реализовывалось за одну RMW операцию с регистром, то делаем через вспомогательную переменную, и убираем volatile в параметрах функций apply():

Очень похоже на то, что я хотел, да. Я поразбираюсь, хотя выглядит очень все туманно))

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


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

1 час назад, Arlleex сказал:

Очень похоже на то, что я хотел, да. Я поразбираюсь, хотя выглядит очень все туманно))

Да там всё просто, кроме магии с распаковкой пакета параметров. Но она тоже постижима 🙂

template <typename ... Operations>  // здесь список типов произвольной длины
void modifyReg(volatile uint32_t& reg, Operations&& ... ops)  // здесь список параметров, каждый параметр имеет тип из списка типов
{
    auto val = reg;
    (..., (void)ops.apply(val));   // а вот это - распаковка. оператор "запятая" поочерёдно применяется к результату вызова функции apply() для каждого объекта из списка ops
    reg = val;
}

 

Можно ещё через лямбды (wandbox), но этот способ мне меньше нравится.

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


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

1 час назад, AHTOXA сказал:

Да там всё просто, кроме магии с распаковкой пакета параметров. Но она тоже постижима 🙂

Благодарю!:hi: Иногда возникает чувство, что это не C++ уже вовсе)))

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


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

В 17.01.2024 в 21:22, Arlleex сказал:

Благодарю!:hi: Иногда возникает чувство, что это не C++ уже вовсе)))

It's a kind of magic

Но в реальной работе лучше обойтись без чудес. Чтобы не было мучительно больно

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


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

Однако, стоит ли игра свеч, когда уже есть простой способ? Ведь посмотрите, сколько строчек нужно исписать, чтобы заставить работать так же, как уже было написано ранее в трех строчках? Эт называется "оверинжениринг", когда простая задача решается "через Чукотку" 

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


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

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

Сейчас у меня этот файл состоит из #define определений (макрос-функций). Поэтому меня интересовал вопрос улучшения имеющегося на C++.

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

Макрос MODIFY_REG (или как он там?) - не совсем стандартный CMSIS, STM их пишет, в файле GD уже их нет. Каждый раз править заголовочный производителя - не мой путь.

Мой путь - всегда иметь свой файл с такими определениями. Вот у меня и есть такой файл. Только он состоит не тупо из стыренных решений, а стилистически прилизан и уже выверен до идеала (насколько это возможно).

А еще я таскаю этот файл для разных проектов с разными МК (8 и 32 битными). Поэтому удобство точно есть🙂

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


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

Ну тут уж на вкус и цвет все буквы разные. Кто как хочет, тот так и дро... ээммм, пишет 🙂 Единых расово-верхных стандартов нету на этот счет. CMSIS - это только лишь способ описания регистрово-битовой части периферии, причем в инструментах языка Си, а не С++.

А еще... да, еще есть некоторые "упертые", пытающиеся один и тот же файлик нацепить на любой вид железа, от PIC16 до Broadcom BCMxxx 🙂 

 

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


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

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

Однако, стоит ли игра свеч, когда уже есть простой способ? Ведь посмотрите, сколько строчек нужно исписать, чтобы заставить работать так же, как уже было написано ранее в трех строчках? Эт называется "оверинжениринг", когда простая задача решается "через Чукотку" 

Речь идёт не о замене трёх строчек, а о

В 17.01.2024 в 01:09, Arlleex сказал:

Весьма сложная для понимания макросная кухня Си, для упрощения поста, не приводится

Причём всё это, как правильно написал @Arlleex, пишется один раз, потом выносится в заголовочный файл, и в дальнейшем просто используется.

 

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


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

Вот я об этом же и говорю! Либо написать три строчки и использовать в дальнейшем, просто подключая этот заголовочный файл. Либо написать овер-дофига строчек и тоже использовать в дальнейшем. "А если нет разницы, зачем платить больше?"(С). 🙂 

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


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

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

Ну тут уж на вкус и цвет все буквы разные. Кто как хочет, тот так и дро... ээммм, пишет 🙂

Да всегда так было)) И ничего - наука процветает, караван идет. Или как там.

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

"А если нет разницы, зачем платить больше?"(С). 🙂 

Дело в моральном устаревании макросов и сложной адаптации их к другим конструкциям языка, которые уже издавна завязаны на... не на макросы, короче))

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


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

Подскажите, пожалуйста, можно ли как-то определять функции, принадлежащие namespace-у, синтаксически "не всовывая" тело функции в этот namespace?

Т.е. вместо

namespace nsA {
  void func() {
    ...
  }
}

писать сразу что-то наподобие

void nsA::func() {
  ...
}

?

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

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


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

9 минут назад, Сергей Борщ сказал:
namespace nsA {
  void func();
}


void nsA::func() {
  ...
}

Угу. Не красиво, ибо дублирование. Думал, есть какая-то пуля, которую я не видел.

Пытался хотя б сократить вложенные спейсы:

namespace nsA::nsB::nsC {
  void f() {
  }
}

а это оказывается расширение, и то, начиная с C++17:sad:

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


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

5 minutes ago, Arlleex said:

а это оказывается расширение, и то, начиная с C++17

значит пришло время слазить с "устаревших" 14 и тем более 11 :dirol:

 

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


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

Кстати, правила форматирования текста - они настраиваются в IDE. Можно же сделать, чтобы блок namespace не сдвигал табуляцию.

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


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

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

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

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

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

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

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

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

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

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