189 похожих чатов

Всем привет. Если я буду писать код на С++ для

контроллеров, то какие подводные камни меня ожидают? Всю жизнь пишу на чистом си, но думаю мож зря я так и современные компиляторы не рождают мамонтов. Речь идет про труевые плюсы с перегрузками, классами, шаблонами и прочий плюсовый "треш". Еще в голове не уживается то, что куча библиотек на чистом си написана. Тот же фрииртос как себя будет чувствовать с плюсами?

6 ответов

26 просмотров

Я ненастоящий сварщик, а так, любитель. Поэтому про то, что знаю/слышал. Проблемы обычно начинаются там, где начинается динамическое выделение памяти. В основном потому, что RAM мало. Поэтому все стандартные функции, использующие динамику есть смысл избегать. Также и во фриртос, есть смысл использовать статическую модель, если можно обойтись без динамики. Шаблоны - норм вариант. У меня есть ощущение, что они раздувают флэш, правда это только ощущение. Но время компиляции по сравнению с СИ точно увеличится. Ещё будут всякие неочевидные штуки, связанные с тем, что языки разные. Там из-за ссылок или инициализации по умолчанию, наличия конструкторов. Фриртос нормально работает. Приходится цпп оборачивать в extern C. Поскольку я пишу редко понемногу и для себя, то с проблемами почти не сталкиваюсь. И в принципе могу себе позволить стандартный printf или string. Но понимаю, что большой проект может не влезть в камень из-за таких вольностей. Поэтому функции вывода в основном самописные, cstring и редко sprintf. Вообще, когда на плюсах удобнее и приятнее. Но в при таких ограничениях получается, что это просто си с классами, шаблонами, итераторами, lambda, inline, constexpr и auto. Хотя есть примеры, где плюсы в полный рост и всё работает. Мне один программист утверждал, что под МК он писал такой же c++, как сейчас пишет в амазоне. Не верю. Мб поэтому за ним всё переписали :).

Для фриртоса на гите свободно ищутся врапперы.плюсы хороши,когда проект большой,и много разных структур данных.к слову,есть etl,которая сделана на статике.для 8 битных камней все это не имеет особого смысла,а для 32 битных-вполне себе применяемо

Konstantin Zo
Я ненастоящий сварщик, а так, любитель. Поэтому пр...

Проблемы работы с динамической памятью в МК не столько в том, что ее мало, сколько в контроле ее использования. Важно не допустить переполнения и фрагментации. Если хочется уверенности в том, что контроллер не использует динамическую память, или очень хочется усилить контроль, можно перегрузить new/delete и прилинковать к проекту свой malloc/free. Проекты, которые используют только статическую память, хороши тем, что уже на этапе компиляции есть 100% уверенность в том, что проект влез в камень. Насколько это нужно в каждом конкретном случае - второй вопрос. При острой нехватке оперативной памяти мы вполне можем захотеть разделить ее между несколькими пользователями. Каждое инстанцирование шаблона класса в класс требует памяти для хранения кода этого класса. Это нормально, у нас же цель сделать нашу же работу чуть удобнее, а не с экономить несколько сот байт флешки :). В конце концов, большому проекту - большой камень. С код отлично работает в С++ приложениях. С++ позволяет лучше изолировать код за счет классов. А с хорошо изолированным кодом гораздо приятнее работать. Начиная с того, что бизнес-логику приложения можно со 100% гарантией оторвать от конкретной платы и переиспользовать ее во всех нужных местах, заканчивая покрытия кода тестами. Еще из плюсов стоит добавить стандартную библиотеку шаблонов или ее аналог, которая, при правильном использовании, позволяет не городить велосипеды для стандартных контейнеров и алгоритмов. Получилось немного скомкано, но тема довольно большая. На хабре есть пара хороших статей про то, как правильно прикрутить С++ к проекту для микроконтроллеров.

Vasiliy Pastushak
Проблемы работы с динамической памятью в МК не сто...

не скомкано. кратко и по делу. только я не пойму - почему отличием С++ от С названа динамическая память ? Динамическая память есть и в С.

Peter Moroz
не скомкано. кратко и по делу. только я не пойму -...

Все верно, это никакое не отличие :) Это больше про стандартные библиотеки.

Konstantin Zo
Я ненастоящий сварщик, а так, любитель. Поэтому пр...

Если выпилить богопротивное RTTI и исключения, то плюсы вполне ок

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта