C++ Embedded
426 subscribers
2 photos
16 videos
3 files
14 links
Леденящие душу прохладные истории про С++ в embedded проектах. Зарисовки из разработки встраиваемых систем.
Download Telegram
Channel created
Channel name was changed to «C++ Embedded»
Привет! На самом деле не хотел ничем делиться, но меня заставили
Media is too big
VIEW IN TELEGRAM
Одно из первых просмотренных по теме видео 2016 года с канала The Linux Foundation. Харизматичный и задорный Thiago Macieira (Intel) расскажет, почему не стоит бояться разрабатывать для embedded на C++. в 2022 году это кажется очевидным, но так было не всегда. Очень хорошее интро для начинающих.
Докладчик покажет какие особенности языка могут сделать программное обеспечение более безопасным и как такое программное обеспечение может быть даже более эффективно, чем написанное на C. Какие темы тут раскрыты:
- Myth or fact about C++
- Removing some C++ language overhead
- Compiler and standard library on regular linux
- Missing prototypes is an error
- Stricter type safety
- Improve code: overloads
- Achievement unlocked: destructors
- RAII
- Containers
- Error checking and exceptions
- Range for
- A lot more coming (да уже есть, видео же древнее)
👍2
Media is too big
VIEW IN TELEGRAM
В 2018 году на канале NDC Conferences вышло видео, где сам создатель C++ Бьерн Страуструп высказался в пользу использования своего языка в embedded разработке. Не могу сказать, что наш Бьерн фантастический докладчик, но послушать стоит. Новичкам особенно. Ведь как еще узнать, что С++ это не просто ценный мех, то есть, С с присыпочкой, но и бесценные абстракции, эффективное использование оборудования, управление ресурсами, надежность и способность поддерживать огромную кучу кода.
Раскрыты темы:
- What is "embedded system programming"
- Complexity
- C++ Background
- C++ machine model. Primitive operations maps to machine instructions
- Abstractions
- Constrains on "embedded systems code" differ
- Zero-overhead (classes vs structs)
- Constant expressions
- Compile-time computation
- Why type-reach code
- Resource Management
- We need error-code and exceptions
- RAII without exceptions
- Keep simple things simple!
Cheap-to-copy или expensive-to-copy?

Если кому-то в его проекте повезло работать по стандарту AUTOSAR, тот уже знает что это такое. Остальным же стоит знать, что передавать мелкокалиберный аргумент по ссылке нельзя, смертный грех! Как и тяжелый аргумент передавать через копирование. Но что уже можно считать достаточно весомым аргументом? Где граница?
Так вот, все зависит от размера указателя. Если размер аргумента больше, чем двойной размер указателя, то это expensive-to-copy.
На основе этого можно изобрести небольшой type traits класс
template <class T>
struct is_cheap_to_copy {
static constexpr std::size_t kCheapCoef {2U};
static constexpr bool value {sizeof(T) <= (sizeof(void*) * kCheapCoef)};
};
Теперь могу использовать это в своих тщетных попытках метапрограммировать 🤥
std::cout<<"is int cheap to copy? "<< std::boolalpha<<is_cheap_to_copy<int>::value<<std::endl;
👍2
Media is too big
VIEW IN TELEGRAM
Раз уж речь зашла о метапрограммировании, то совершено невозможно обойти вниманием выступления Walter E. Brown. Знаете cbegin/cend или common_type, заголовки random и ratio? Это его рук дело. В 2014 году он уже рассказывал нам как делать правильно, жаль, я не слушал. Итак, доклад "Modern Template Metaprogramming: A Compendium, Part I". Этот солидный мужчина рассказывает много и хорошо, поэтому в нескольких частях.
Что тут есть:
- What is template metaprogramming?
- How to shift work to compile-time
- A metafunction can take a type as a parameter/argument (result)
- C++11 library metafunction conventions
- Compile-time decision-making
- A single-type variation on conditional
- SFINAE in use
- A taste of the future
- Some integral_constant conveniences
Media is too big
VIEW IN TELEGRAM
Не расходитесь, куда вы?! Вот и вторая часть доклада Walter E. Brown "Modern Template Metaprogramming: A Compendium, Part II". Тут будет еще интереснее, солидный мужчина поведает нам о void_t и как его готовить.
Продолжаем:
- Using inheritance + specialization together
- Aliasing == delegation + binding
- Dispatching to best-performing algorithm
- Using a parameter pack in a metafunction
- Unevaluated operands
- Proposed new type trait void_t
- The idiom need not depend on void_t
- Summary of techniques and tools
Modern_Template_Metaprogramming_A_Compendium_Walter_E_Brown_CppCon.pdf
831.1 KB
Презентация к докладу CppCon 2014: Walter E. Brown "Modern Template Metaprogramming: A Compendium"
Решил однажы разработчик разбавить скучный код шаблонами. Преобрел не только красивый код, но и головную боль через AUTOSAR. Все дело опять в expensive-to-copy и cheap-to-copy типах.
template <class T>
void Action(T const t) { std::ignore = t; }

Что не так с аргументом? Непонятно, то за тип T, какого он размера? Если вы уверены, что для этого шаблона никогда не будет использован большой и красивый тип, то можно смело оставить как есть. Только бы еще static_assert вставить для душевного спокойствия. Если же вероятность использования expensive-to-copy ненулевая, то надо предусмотреть передачу через ссылку.
template <typename T>
struct _arg_helper {
using base = std::decay_t<T>;
using by_const_value = std::add_const_t<base>;
using by_const_ref = std::add_lvalue_reference_t<by_const_value>;
using type = std::conditional_t<is_cheap_to_copy<base>::value, by_const_value, by_const_ref>;
};
template <typename T>
using arg_t = typename _arg_helper<T>::type;

Как это применить? Легко, если у нас шаблонный класс
template <class T>
struct Test {
static void Action(arg_t<T> t) { std::ignore = t; }
};

В случае шаблонной функции, все сложнее. Компилятор не сможет вывести тип на лету, его нужно указать явно. Сразу скажу, что дополнительная функция с perfect forwarding не поможет, такой аргумент никогда не схлопнется в передачу через копию. Выход есть, но не факт, что вам понравится.
template <class T, std::enable_if_t<is_cheap_to_copy<T>::value, bool> = true>
void Action(T const t) { DoAction<T>(t); }

template <class T, std::enable_if_t<!is_cheap_to_copy<T>::value, bool> = false>
void Action(T const &t) { DoAction<T>(t); }

Да, вот как люди без концептов страдали.
Media is too big
VIEW IN TELEGRAM
Michael Caisse в 2018 году сделал как минимум 2 обстоятельных доклада о современном C++ для встроенных систем. Что такое встроенные системы, как обычно идет разработка, что придется использовать. Неудивительно, дядька работает более 35 лет со всякими микроконтроллерами и может рассказать нам о позорных плюсовиках, которые пыжатся написать хоть какое-то firmware.
Полученные знания применимы ко многим встраиваемым проектам (голое железо и малые ОС). Все, кто посмотрят, получат не только мотивацию для использования C++ во встраиваемых проектах, но и советы, о том как заставить инструменты работать, образцы языковых функций и идиом, которые улучшают качество конечного продукта.
Что есть:
- Embedded world hates C++
- What is the zero-cost abstraction
- Static Polymorphism - CRTP
- Devirtualization
- Compiler Explorer
- Optimization
- Correctness
- State Machine Library
- Features