Предисловие

Вокруг C++ много мифов, но важно здесь не то, кто что говорит и даже не производительность. С ростом мощностей всегда будут выбирать удобство оптимальности. Кого-то удивит 200-400 МГц тактовой частоты МК? Да, для 8-битного МК с частотой 1 МГц C++, наверное, не лучшее решение, но, во-первых, C++ не так страшен, как его малюют, а во-вторых, это лишь инструмент, который должен быть использован для адекватных ему задач (т.е. для 8-битного МК он скорее не нужен, чем наоборот).

Не стоит однако, думать, что C++ будет хорош в любой достаточно производительной системе. Ниже приведён отрывок из письма Линуса Торвальдца о применимости его к ядру ОС:

In fact, in Linux we did try C++ once already, back in 1992.

It sucks. Trust me - writing kernel code in C++ is a BLOODY STUPID IDEA. // https://lkml.org/lkml/2004/1/20/20


В действительности, в 1992 году мы уже пробовали C++ для Линукс.

Полный отстой. Поверь мне — писать код ядра на C++ это крайне идиотская идея.

В 1969 году, когда начали разрабатывать язык Си, первый человек ступил на Луну. Программа Аполлон вряд ли бы увенчалась успехом без программного обеспечения (написанного на ассемблере). В то время не было даже понимания что спрашивать на собеседовании – брали всех, кто был знаком с синтаксисом языка для нужных машин1. Сложно быть первым, особенно в чём-то не известном. Как лучше построить процесс программирования вычислительно машины? Это не тривиальный вопрос. Я хочу лишь подвести к мысли, что язык, как и всё сущее, подвержено эволюции. Что сегодня представляется совершенным, завтра уже таковым может не являться.

Подумайте, как на языке Си сделать так, чтобы поменять значения a и b местами. Можно выделить код в функцию, а можно этого не делать. Можно использовать дополнительную переменную, а можно поменять значения прибегнув к арифметическим операциям, учитывая при этом пределы заданного типа данных. Вам нужно принять несколько решений и хорошенько подумать, как это реализовать без ошибок. На Python всё намного проще.

Данная операция предусмотрена языком. Для Python, пожалуй, ещё время не пришло, а вот C++ может составить конкуренцию Си, предлагая по цене сравнимой производительности большую экспрессию и поддерживаемость кода.

Неявный критерий: нужно писать меньше кода2, который делает тоже самое.

Основная цель книги — привнести абстракции, которых не хватало в «Си для встраиваемых систем». Нужно сделать два важных замечания. Во-первых, подразумевается, что вы знаете Си на достаточно глубоком уровне, поэтому некоторые вещи будут опускаться. Во-вторых, не стоит воспринимать эту книгу как учебник по C++. Она не им не является. Очень много возможностей языка не будет рассмотрено , так как они не применимы к встраиваемым системам.

Под встраиваемыми системами здесь рассматриваются устройства с микроконтроллером, то, что не работает на Linux или Windows.

Мы будем использовать последнюю доступную версию стандарта в Atollic TrueStudio (C++14 with GNU extentions) и микроконтроллер stm32f407vg / stm32f103c8. Рассмотрение C++ будет идти через призму понимания языка Си.


1 Согласно интервью в подкасте 13 Minutes to the Moon.
2 Хотя с C++ это вряд ли получится (: