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

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

On 7/15/2024 at 11:35 AM, EdgeAligned said:

Да, это такой упоротый синтаксис, называется

Обфускация :sarcastic:

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


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

В 15.07.2024 в 12:04, dimka76 сказал:

Обфускация :sarcastic:

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

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

Иначе как умище-то показать.

В 15.07.2024 в 11:35, EdgeAligned сказал:

вон те скобочки [](){} означают запись лямбда-функции.

Спасибо за наводку. Примерно так и думал. Но в физику процесса надо ещё погрузиться.

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


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

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

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

Это ещё ничего. Хуже, когда подхватываемый проект написан в виде классической си-лапши с тоннами копипасты и глобальных переменных. Вот это да, вот это смешно:)

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


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

В 15.07.2024 в 15:36, AHTOXA сказал:

Это ещё ничего. Хуже, когда подхватываемый проект написан в виде классической си-лапши с тоннами копипасты и глобальных переменных. Вот это да, вот это смешно:)

Плавали в таком, знаем )

На прошлой работе досталась в наследство линейка приборов, разработанная за 20 лет тремя поколениями разработчиков.

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

По результатам полного игнора со стороны руководства написал заявление в день рождения начальника ) (случайно совпало)

image.thumb.png.56d59f4948cf98c2c980266956316b14.png

Прошу прощения за злостный оффтоп, больше не буду.

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


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

Началось в колхозе утро..

undefined reference to `vtable for SomeClassName

В прошлый раз помогло virtual ~SomeClassName() = default;
Сейчас что-то другое. Были подозрения, что .cpp не собирается, но нет, объектник лежит на месте.

С какого конца можно это расколупать? 

#

что характерно, в .map есть vtable для базового абстрактного класса с адресом и упоминание для нужного производного класса, но уже без адреса.

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


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

On 7/29/2024 at 1:13 PM, MrYuran said:

Началось в колхозе утро..

https://stackoverflow.com/questions/3065154/undefined-reference-to-vtable

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


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

On 7/15/2024 at 1:06 PM, MrYuran said:

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

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

Иначе как умище-то показать.

Спасибо за наводку. Примерно так и думал. Но в физику процесса надо ещё погрузиться.

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

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


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

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

virtual ~SomeClassName()

Когда виртуальный деструктор есть, но не реализован, такая проблема и будет появляться. То есть, виртуальный деструктор должен быть либо реализован здесь, либо переопределен в классе-наследнике. Если класса-наследника нет, то компилятор ищет реализацию деструктора в этом классе, но он - не реализован, только объявлен.

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


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

Когда в виртуальном деструкторе (или вообще, виртуальном методе) пишите = default, это означает, что этот деструктор будет сгенерирован автоматически. То есть, равносильно тому, что если бы воообще его не писали.

Если деструктор или конструктор не написать в классе явно, то сгенерируется конструктор (деструктор) по-умолчанию. Этот default как раз и дает принудительно такую команду.

Виртуальный деструктор следует применять при наследовании классов, в которых производились операции с динамическим выделением памяти, дабы правильно освободить эту память.

 

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


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

Здесь все объекты - статические во флеш-памяти, то есть деструктор не имеет физического смысла.

Тем не менее, убрал virtual, и одной ошибкой стало меньше.

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


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

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

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


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

08:55:40 Build Finished. 0 errors, 21 warnings. (took 17s.695ms)

Отбой, дело было не в бобине.

Там ещё отдельный траходром с системой сборки meson.

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


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

https://habr.com/ru/articles/819499/

Очередная статья про применение плюсов для управления лапками пинами.

Начало было бодрым, закончили, как обычно, за упокой.

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


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

Пролистал - ничего интересного, какой-то очередной велосипед на треугольных колесах. В начале статьи - вообще картинка не от STM32, а от Rasberry Pico. Дальше автор долго рассказывает, из чего состоят порты в STM32, что такое операция &=. И в довершение - зачем-то начал разбирать, что такое HSE, HSI. Как оное относится к портам - ваще хрен пойми.

В общем, пролистав больше половины портянки, плюнул на это дело. Понятно только одно - писал ту портяну начинающий, который еще вчера сам познакомился с STM32.

Лично я для себя пока что остановился на такой конструкции, которая неплохо себя показала в деле:

class GpioA {
public:
	template<uint16_t value>
	static void SetPins()
	{
		GPIOA->BSRR = value;
	}
      // все остальное
};

template<typename TPort, uint8_t PinPos>
class Pin {
public:
	static void High()
	{
		TPort::template SetPins<1 << PinPos>();
	}
      // все остальное
};
	Pin<GpioA, 2>::High();

и это генерирует вот такой листинг:

2000014c:   movs    r2, #4
2000014e:   ldr     r3, [pc, #4]    ; (0x20000154 <main()+8>)
20000150:   str     r2, [r3, #16]

Возможно, в последствии найду что-то более интересное. Но пока что, на мой взгляд, это - максимум, что даёт уровень развития языка С++ как такового, по балансу между числом букв при написании и результативностью получаемого эффекта.
Я не  люблю тратить много букв при написании кода. А чем старше редакция С++, тем больше букв вводится в него.

 

PS. Полистав снизу вверх ту портянку, я понял - автор пошел по изъезженной тропке - попытке переписать поставляемый сишный заголовочник на самоделку с описанием битов и регистров в стиле С++. Не знаю, кому как, но лично по мне - это огромная потеря времени. Потому как в современных тяжеловесных МК типа STM32H743 заголовочник имеет десятки тысяч строк, а помимо этого еще несколько массивных файлов с описанием ядра. И их все надо переписать, иначе не получится использовать ресурсы. 
Даже в рассматриваемом там STM32F0 заголовочник имеет несколько тысяч строк. И сколько времени уйдет на их переписывание? Учитывая, что С++ гораздо многословнее Си.
Автор пошел по вот такому пути:

struct GPIO_BSRR {
	static constexpr cpp_register::Field<decltype(GPIOF->BSRR), (1UL << 16), cpp_register::AccessMode::W, 1, 16> BR{};
	static constexpr cpp_register::Field<decltype(GPIOF->BSRR), (1UL << 0), cpp_register::AccessMode::W, 1, 16> BS{};

и это должно быть написано для КАЖДОГО регистра. В том же H743 их - сотни!
Автор той статьи ратует за то, что описания битов в С++ виде имеют более красивую подсветку синтаксиса. Но тут дело вкуса. Лично я считаю, что лучше написать уровень Hardvare Abstraction Level, чем всё время пялиться на разноцветные буковки синтаксиса.
До тех пор, пока производитель не представит готовый вариант заголовочника в С++ виде, нет смысла переписывать его самостоятельно. Огромная потеря времени и сомнительный профит. Поскольку нормальные IDE давно уже предлагают автозаполнение и варианты при написании текста. Ошибиться можно разве что слепому или специально.
Тем более, что нынче мало кто пользуется именно "регистрами", используют во основном кодогенераторы и готовые библиотеки абстракции.

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

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


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

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

и это должно быть написано для КАЖДОГО регистра. В том же H743 их - сотни!

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

13205.jpg

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


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

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

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

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

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

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

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

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

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

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