#cpp #avr_gcc #микроконтроллеры
Подскажите пожалуйста, можно ли использовать C++ для программирования микроконтроллеров?
Есть ли при этом какие либо ограничения для языка C++?
Ответы
Ответ 1
использовать часто можно, но нужно смотреть на конкретную реализацию. К примеру,
может не быть исключений.
С другой стороны, с++ приносит определенный оверхед, а на микроконтроллерах часто
бывает важный каждый байт, это не java c большими серверами, где можно докупить планку-другую.
Но микроконтроллеры не стоят на месте и развиваются, как собственно и компиляторы.
Возможно, для Вашего контроллера и Вашего случае С++ - лучший вариант.
Ответ 2
На самом деле никаких ограничений нет, просто нужен правильный скрипт линковщика
с соответствующими секциями для поддержки исключений и виртуальных методов, а так-же
релизация аллокаторов/деаллокаторов и STL (конечно это роскошь?). Найти какой скрипт
в сети не сложно...
Ответ 3
C++ не только можно, но и нужно использовать для программирования микроконтроллеров.
Как тут писалось, никаких исключений и операторов new. Для отмены исключений есть даже
флаг компилятора, специально для нас.
Чем С++ лучше си:
Строгая типизация. Если что-то не так, получите ошибку при компиляции, а не поиск
её в отладке. Наглядный пример, если в функцию передаётся тип перечисления, а вы в
си вписали что-то не то (int, к примеру), то в си вы пройдёте компиляцию, в C++ получите
ошибку компиляции.
Ссылки. Философия С++: "не плати за то, что тебе не нужно". Ссылки не занимают место
в памяти, код с ссылками смотрится аккуратнее, чем код с указателями. Всегда можно
забыть поставить * или &.
Классы (структуры). Банально удобно описывать не только саму структуру, но и действия
с ней. Каждый регистр можно обернуть в классовую обёртку с методами, которые своим
названием указывают, что вы делаете. Если код необходимо много комментировать, то это
плохой код.
Объекты. В функцию (класс, метод класса) можно передать ссылку на объект вывода микроконтроллера,
а не писать кучу дефайнов всех регистров (легко ошибиться, много исправлять, особенно
для всяких stm32).
Шаблоны. Забудьте про многострочные макросы, ошибки в которых отладить крайне сложно,
дебагер в них просто не войдёт. Шаблоны куда лучше препроцессора.
Оверхеда нет. Это распространённый миф. Грамотный код, написанный на с++ даёт меньший
объём бинарников, натыкался на исследования, даже ролики с конференций есть на ютьюбе.
(полагаю всему виной ссылки вместо указателей и оптимизация шаблонов).
Ответ 4
Посмотрите на язык Wiring, используемый в Arduino.
Это C++ без стандартной библиотеки и исключений, со своей специальной библиотекой.
Компилируется он, кстати, упомянутым у вас в тегах avr-gcc.