Як застосувати парадигму об'єктно-орієнтованого програмування при розробці вбудованих пристроїв за допомогою C++, з практичним прикладом на ESP-IDF.
Оригінал опубліковано португальською на Embarcados.
Зображення, згенероване AI
Вступ
Наразі більшість вбудованих систем і розробницьких плат підтримують програмування через структуровані мови, такі як C або Python, або навіть символічні мови, як-от Assembly (розробники-ветерани можуть згадати BASIC Stamp або Pascal на деяких мікроконтролерах).
Проте корпоративні додатки, системи баз даних або графічні інтерфейси операційних систем і смартфонів зазвичай пишуться з використанням більш високорівневих парадигм програмування, таких як об'єктно-орієнтоване програмування (OOP), через мови, як-от Java, Kotlin, Swift, C#, або C++, серед інших.
Ця стаття має на меті описати застосування об'єктно-орієнтованого програмування (OOP) при розробці проектів для вбудованих пристроїв за допомогою мови C++, а також порівняти переваги та недоліки цього підходу порівняно з класичним структурованим програмуванням на C.
Крім того, представлено практичний проєкт для розробницької плати Espressif ESP32 з використанням фреймворку ESP-IDF.
Парадигма об'єктно-орієнтованого програмування
Мови програмування можна класифікувати за їхніми парадигмами або концептуальними основами.
Дві найбільш популярні парадигми програмування — це процедурна, яка ґрунтується на функціональних блоках коду, що є багаторазовими і чітко визначеними за своїми обов'язками, здатні обробляти параметри (або змінні) і, можливо, повертати результати; та об'єктно-орієнтована, яка ґрунтується на взаємодії між окремими елементами, що інкапсулюють свої власні дані (атрибути або властивості) та поведінку (методи).
Більшість мов об'єктно-орієнтованого програмування (OOP) базуються на концепції екземплярів класів.
Класи визначають властивості та їхні типи, а також поведінку (методи), яка буде присутня у всіх об'єктах, створених з одного класу.
У процедурному програмуванні кожна процедура (функція) отримує дані як параметри, обробляє їх і може повернути результат викликаючій процедурі. Відповідальність за збереження даних між викликами процедур лежить на викликаючій процедурі (і глобальній функції), яка використовує змінні (локальні та глобальні).
На відміну від цього, класи OOP визначають відповідальність своїх створених об'єктів, і кожен об'єкт має свої власні дані в приватному просторі пам'яті. Запланована взаємодія між об'єктами та визначена передача даних між ними складають цілу систему.
Поява OOP стала еволюцією в організації та структуризації коду, спрощуючи моделювання складних систем. Ключові концепції OOP включають:
- Інкапсуляція: це здатність приховувати внутрішні деталі об'єкта і відкривати тільки те, що необхідно для його використання.
Це досягається за допомогою модифікаторів доступу (наприклад, public, private та protected), які контролюють видимість даних і методів об'єкта. - Абстракція: включає спрощення складних об'єктів шляхом відкриття лише основних деталей і приховування непотрібної складності. Це покращує розуміння коду і його підтримку, дозволяючи розробникам зосередитися на найбільш важливих аспектах проблеми.
- Наслідування: дає змогу класу (підкласу) успадковувати властивості та методи від іншого класу (батьківського класу). Це сприяє повторному використанню коду та створює ієрархію між класами, полегшуючи створення нових функціональностей на основі існуючих реалізацій.
- Поліморфізм: відноситься до здатності різних класів розглядатися як екземпляри одного класу через спільні інтерфейси або базові класи.
Поліморфізм дозволяє викликати перевантажені методи загальним чином, що підвищує гнучкість і розширюваність коду.
Рисунок 1 — Стійки ООП — Джерело: https://commons.wikimedia.org/wiki/File:4pillars.webp
Популярні мови, що підтримують ООП, включають Java, Kotlin, C++, Python і C#. Кожна з мов реалізує принципи ООП трохи по-різному, але всі вони мають спільні основні концепти, описані вище.
Запровадження ООП принесло численні переваги, такі як модульність, яка дозволяє розробляти незалежні та повторно використовувані компоненти; простота обслуговування та розвитку програмного забезпечення, оскільки зміни в одному класі не впливають безпосередньо на інші частини системи; а також можливість працювати з абстракціями, ближчими до реального світу, що полегшує спілкування між розробниками та зацікавленими сторонами.
Процедурне проти
Об'єктно-орієнтоване програмування
Багато авторів вважають парадигму ООП переважною порівняно з процедурним програмуванням з кількох причин:
- Інкапсуляція підвищує надійність програмного забезпечення, гарантуючи, що зміни в одній частині не впливають на інші.
- Невизначена послідовність розвитку дозволяє паралельно розробляти різні компоненти.
- Обслуговування спрощується завдяки зменшенню надмірності коду, і зміни в одній частині можуть принести вигоду всім залежним частинам.
- Програмне забезпечення стає розширюваним, здатним еволюціонувати без необхідності змінювати існуючий код чи робити його статичним.
- Підсистеми або вся система стають багаторазово використовуваними.
- Програмне забезпечення стає більш природним, оскільки воно розробляється на основі функціональності, а не деталей реалізації.
Однак є й помітні недоліки:
- Низька продуктивність: Порівняно з чисто процедурними системами або тими, що програмуються на Assembly, модель ООП вводить складність через уявлення класів і включає більше гілкувань.
Однак, з сучасними пристроями, які мають високу інтеграцію, потужність обробки та пам'ять, ця сприймана повільніша робота є незначною, якщо тільки не орієнтуватися на мікроконтролери з обмеженою ОЗУ, повільною обробкою або критичними місіями, де перевагу набуває Assembly. - Більше використання пам'яті: Порівняно з процедурними системами або Assembly, ООП розподіляє відповідальність, що призводить до розподілених областей пам'яті. Процедурні системи (або Assembly) з їх централізованими та послідовними областями пам'яті є більш ефективними. Однак, для сучасних пристроїв, де пам'ять менш критична, ця різниця компенсується перевагами ООП, такими як повторне використання та інкапсуляція.
Рисунок 2 — Структуроване програмування vs. ООП — Джерело: https://devopedia.org/object-oriented-programming-concepts
Більше того, порівняння парадигм є справедливим та змістовним лише при оцінці двох нативно скомпільованих мов високої продуктивності (наприклад, C та C++).
Мови програмування, що інтерпретуються, такі як Python чи JavaScript, за своєю природою мають гіршу швидкість виконання та вищі вимоги до пам'яті, незалежно від вибраної парадигми. Аналогічно, мови, скомпільовані для виконання на віртуальних машинах (наприклад, Java, Kotlin або C#), демонструють проміжну продуктивність і значне використання пам'яті через накладні витрати віртуальної машини.
Основні відмінності між C та C++
Мови програмування C та C++ є одними з найбільш впливових та широко використовуваних у розробці програмного забезпечення. Хоча C++ спочатку була похідною від C, вона включає низку покращень та додаткових функцій, які значно відрізняють її від попередника. У цьому розділі розглядаються основні відмінності між C та C++.
Парадигма програмування
C є мовою процедурного програмування, що означає, що вона базується на викликах функцій та структурах керування для управління потоком програми.
Код організовано в процедури або функції, які працюють з даними.
C++, з іншого боку, є багатопарадигмальною мовою програмування, яка перш за все відома своєю підтримкою об'єктно-орієнтованого програмування (OOP). Це дозволяє моделювати задачі як колекції взаємодіючих об'єктів, що сприяє управлінню складними системами та повторному використанню коду.
Типізація та безпека типів
C надає гнучку і менш сувору типізацію, що може призвести до проблем з безпекою типів, таких як помилки неявного перетворення типів.
C++ вводить більш надійну і безпечну систему типів, включаючи шаблони та перевантаження операторів/функцій, що забезпечує більшу гнучкість і безпеку при використанні типів.
Управління пам'яттю
C використовує функції, такі як malloc()
та free()
для динамічного розподілу та звільнення пам'яті.
Управління пам'яттю є ручним, що може призводити до проблем, таких як витоки пам'яті і висячі вказівники.
C++ вводить оператори new
та delete
для розподілу та звільнення пам'яті, а також підтримку конструкторів та деструкторів, що спрощують управління ресурсами та підвищують безпеку і ефективність пам'яті.
Стандартні бібліотеки
Стандартна бібліотека C надає базові функціональності для маніпулювання рядками, вводу/виводу та управління пам'яттю.
Стандартна шаблонна бібліотека (STL) C++ значно багатша, включаючи підтримку універсальних колекцій, алгоритмів, ітераторів та інших утиліт, що полегшують універсальне та об'єктно-орієнтоване програмування.
Підтримка класів та об'єктів
C не має рідної підтримки OOP. Імітація OOP у C часто призводить до складнішого та менш читабельного коду, наприклад, за допомогою structs
та вказівників.
C++ вводить концепцію класів та об'єктів, що дозволяє інкапсуляцію даних і функцій, наслідування та поліморфізм.
Це підтримує моделювання складних систем і повторне використання коду.
Управління потоком та структури даних
C надає базові структури управління, такі як if
, for
, while
та структури даних, такі як масиви та structs
, без інкапсуляції або наслідування.
C++ розширює ці можливості, додаючи підтримку класів та об'єктів, що дозволяє створювати складні структури даних з відповідними поведінками. Крім того, C++ пропонує обробку виключень за допомогою try-catch
, що спрощує управління помилками.
Висновок: C чи C++?
Хоча C та C++ мають багато схожих синтаксичних та концептуальних аспектів, відмінності в парадигмах програмування, типізації, управлінні пам'яттю, стандартних бібліотеках та підтримці класів і об'єктів роблять C++ більш потужною та гнучкою мовою для розробки складних систем.
З іншого боку, C залишається широко використовуваним у низькорівневих застосунках і системах з обмеженою пам'яттю та обчислювальними потужностями завдяки своїй простоті та ефективності.
Об'єктно-орієнтоване програмування (C++) в вбудованих системах
Об'єктно-орієнтоване програмування (OOP) у C++ довело свою ефективність як потужний і ефективний підхід для розробки вбудованих систем. Вбудовані системи — це пристрої, які поєднують апаратне і програмне забезпечення для виконання конкретних функцій в межах більшої системи. Такі системи можуть варіюватися від малих пристроїв керування, таких як мікроконтролери в побутових приладах, до більш складних систем в автомобілях і медичному обладнанні.
Переваги OOP у C++ для вбудованих систем
Використання OOP (особливо з C++) при програмуванні вбудованих систем має кілька переваг:
-
Модульність і повторне використання коду: OOP дозволяє організовувати код у класи та об'єкти, що сприяє модульності.
Це дозволяє повторно використовувати програмні компоненти в різних частинах системи або в інших проєктах, що зменшує час розробки та витрати. -
Інкапсуляція: В вбудованих системах, де безпека і надійність є критичними, інкапсуляція допомагає захистити внутрішні дані об'єктів. Це знижує ризик помилок, спричинених несанкціонованим доступом або змінами.
-
Обслуговування та еволюція: Спадкування та поліморфізм дозволяють додавати нові функції до існуючої системи без значних змін в уже наявному коді. Це особливо корисно для вбудованих систем, які повинні еволюціонувати з часом, додаючи нові функціональності або покращуючи наявні.
-
Аберстракція апаратного забезпечення: C++ дозволяє створювати класи, які безпосередньо абстрагують апаратні компоненти, такі як датчики, актуатори та інтерфейси зв'язку.
Це призводить до чистішого та зрозумілішого коду, спрощуючи розробку та налагодження. -
Наявність фреймворків та бібліотек C++: Деякі спеціалізовані бібліотеки, написані на C++ (наприклад, графічний фреймворк Qt), доступні для певних апаратних платформ (наприклад, деякі модулі одноплатних комп'ютерів), що сприяє реалізації розширених функціональностей, таких як графічні інтерфейси користувача на LCD екранах.
Рисунок 3 — Інтерфейс користувача, побудований за допомогою C++ у вбудованій системі — Джерело: https://www.toradex.cn/blog/running-qt-without-gpu
Виклики використання ООП в C++ для вбудованих систем
Незважаючи на свої переваги, програмування вбудованих систем за допомогою ООП має певні труднощі, серед яких:
-
Використання ресурсів: Вбудовані системи часто працюють з обмеженими ресурсами, такими як пам'ять та потужність обробки. Навантаження, пов'язане з ООП, таке як динамічне виділення пам'яті та використання стандартних бібліотек, може бути проблемним.
Розробникам потрібно бути обережними, щоб не знизити продуктивність та ефективність. -
Час виконання: У реальному часі, наприклад, у системах управління моторами або навігаційних системах, важлива передбачуваність і низька затримка. ООП може спричинити деяку непередбачуваність часу виконання через виклики віртуальних методів та інші динамічні особливості.
-
Складність: Абстракція та модульність, які забезпечує ООП, іноді можуть додавати складність до проєктування системи та налагодження.
Для досягнення балансу між абстракцією та простотою необхідно уважно підходити до реалізації.
Стратегії реалізації
Ось кілька запропонованих стратегій для програмування вбудованих систем за допомогою ООП (на C++):
- Обмежене використання динамічних можливостей: Мінімізуйте динамічне виділення пам'яті (через
new
іdelete
) і віддавайте перевагу статичному або стековому виділенню, яке є більш передбачуваним і ефективним. - Програмування під час компіляції: Використовуйте шаблони C++ та інші можливості компіляції для виконання операцій під час компіляції, що дозволяє зменшити накладні витрати під час виконання.
- Оптимізовані бібліотеки: Використовуйте бібліотеки, спеціально оптимізовані для вбудованих систем, такі як спрощені версії STL.
- Ефективний об'єктно-орієнтований дизайн: Приймайте ефективні практики проєктування, такі як використання базових класів та чітко визначених інтерфейсів, уникаючи складних структур множинного успадкування.
Приклади застосувань
Ось кілька можливих застосувань вбудованих систем, програмованих за допомогою ООП/C++:
- Автомобілі: Системи управління двигуном, мультимедійні системи та електронні контрольні блоки (ECU) часто використовують C++ для управління складністю та взаємодії між підсистемами.
- Медичні пристрої: Обладнання, таке як монітори серця та інсулінові помпи, виграє від модульності та безпеки ООП, що дозволяє здійснювати ефективні та безпечні оновлення програмного забезпечення.
- Споживча електроніка: Пристрої, як смарт-ТВ, ігрові консолі та аудіо системи, використовують C++ для реалізації інтерфейсів користувача та розширених функцій управління.
- Авіаційна промисловість: Системи управління польотами, навігації та моніторингу, що вимагають високої надійності та швидких часів відгуку, використовують ООП в C++ для управління складністю та взаємодією модулів.
- Промислова автоматизація: Машини та контрольні системи на виробничих лініях виграють від ООП в C++ для розробки модульного та гнучкого програмного забезпечення, яке легко оновлюється та підтримується.
Міркування щодо використання ООП/C++ у вбудованих системах
Впровадження об'єктно-орієнтованого програмування (ООП) на C++ для вбудованих систем має значні переваги, такі як модульність, інкапсуляція, зручність обслуговування та абстракція апаратного забезпечення.
Однак, для забезпечення ефективності та надійності фінальної системи важливо подолати вроджені виклики, такі як обмежені ресурси та підвищену складність.
Практична реалізація вбудованих систем за допомогою C++
Цей розділ представляє практичний приклад реалізації вбудованої системи за допомогою ООП та мови C++, зокрема, застосування до модулів ESP32 від Espressif.
Що таке ESP32?
ESP32 — це універсальна та потужна платформа для розробки вбудованих систем, яка пропонує підключення Wi-Fi та Bluetooth в одному чіпі, розроблена компанією Espressif Systems. Підтримуючи різні мови програмування та фреймворки, такі як ESP-IDF для C та C++ і NuttX для RTOS, ESP32 є ідеальним вибором для широкого спектру IoT-застосунків.
Підтримка від Espressif та активна спільнота розробників роблять ESP32 відмінним вибором для вбудованих проектів завдяки його універсальності, підключенню, обчислювальній потужності та низькій вартості.
Рис. 4 — Плата Espressif ESP32-C6 — Джерело: https://www.espressif.com
Espressif Systems — це компанія-виробник напівпровідникових чіпів, розташована в Шанхаї, Китай, відома своїми чіпами для бездротового зв'язку. Окрім ESP32, компанія прославилася своїм попередником ESP8266, який був дуже популярним перед ESP32.
Модулі ESP32 упаковують чіп ESP32, флеш-пам'ять та інші необхідні компоненти для роботи, спрощуючи процес розробки. Популярними прикладами є ESP-WROOM-32 та ESP32-S2-WROOM. Ці модулі широко використовуються в пристроях IoT, починаючи від систем автоматизації будинків до портативних пристроїв.
Серцем модулів ESP32 є серія чіпів ESP32, до якої входять варіанти такі як ESP32-D0, ESP32-D2, ESP32-S0, ESP32-S2, ESP32-C3 та ESP32-C6.
Ці чіпи мають один або два ядра Tensilica Xtensa LX6 (деякі моделі базуються на RISC-V), що працюють на частотах до 240 МГц (з доступними більш швидкими та енергоефективними моделями). ESP32 включає різноманітні периферійні пристрої, такі як АЦП, ЦАП, SPI, I2C, I2S, UART, PWM, таймери та ємнісні сенсори дотику, крім функціональностей Wi-Fi та Bluetooth.
ESP32 широко використовується в проектах Інтернету речей (IoT) завдяки здатності підключатися до мереж Wi-Fi та Bluetooth. Приклади застосувань:
- Автоматизація будинку: Управління освітленням, термостати, камери спостереження та інше.
- Портативні пристрої: Розумні годинники, фітнес-трекери та подібні пристрої.
- Програмне забезпечення для промислових систем: Моніторинг і контроль промислових процесів.
- Носимі пристрої: Пристрої для моніторингу фізичної активності та здоров'я.
Програмування ESP32
ESP32 можна програмувати за допомогою різних інструментів та мов.
Два поширених варіанти — це Arduino IDE (який використовує скетчі на основі Wiring) та ESP-IDF.
ESP-IDF
ESP-IDF (Espressif IoT Development Framework) — це офіційне середовище розробки від Espressif для ESP32. Воно надає набір API та інструментів для створення надійних додатків для ESP32. Написаний на мові C, ESP-IDF підтримує розширені функції, такі як Wi-Fi, Bluetooth та периферійні пристрої.
Кроки для початку роботи з ESP-IDF:
- Інсталяція: ESP-IDF є кросплатформенним і може бути встановлений на Windows, macOS та Linux. Espressif надає інсталятор з усіма необхідними залежностями.
- Налаштування середовища: Після інсталяції налаштуйте середовище розробки та вкажіть шлях до ESP-IDF.
- Приклади коду: ESP-IDF включає різноманітні приклади для швидкого початку роботи, такі як проекти з підключення до Wi-Fi та управління GPIO.
ESP-IDF підтримує як C, так і C++.
Хоча C ідеально підходить для низькорівневої розробки з точним контролем за апаратним забезпеченням, використання C++ дозволяє застосовувати принципи ООП, роблячи код більш модульним і таким, що повторно використовуваний.
Рисунок 5 — Приклад проекту з ESP-IDF — Джерело: https://www.espressif.com
Програмування з NuttX
NuttX — це легка та високо конфігурована операційна система реального часу (RTOS), яку також можна використовувати з ESP32. Вона відома своєю сумісністю з POSIX, що сприяє портативності додатків.
З NuttX можна програмувати ESP32 на будь-якій мові, яка підтримує POSIX і має компілятор для цільової платформи.
Серед підтримуваних мов програмування C++ можна використовувати з NuttX.
Щоб використовувати C++ з NuttX на ESP32:
- Конфігурація NuttX: Налаштування NuttX для ESP32 передбачає вибір необхідних драйверів і модулів.
- Розробка: Розробка додатків на C++ в NuttX дозволяє використовувати функціональність RTOS, таку як потоки, семафори та черги, поряд з об'єктно-орієнтованим програмуванням (OOP).
- Компіляція та завантаження: Скомпілюйте та завантажте прошивку на ESP32 за допомогою інструментів, таких як
esptool.py
.
Для отримання додаткової інформації рекомендується звертатися до документації проекту NuttX.
Розробка проекту на C++
Ось приклад проекту, розробленого на C++ з використанням ESP32 та фреймворку ESP-IDF.
Як передумова, необхідно налаштувати середовище розробки ESP-IDF відповідно до офіційної документації ESP-IDF.
1.
Створення нового проекту
Створіть нову директорію для вашого проекту та перейдіть до неї. Виконайте наступну команду, щоб налаштувати структуру нового проекту:
idf.py create-project
Базова структура проекту ESP-IDF для C++ виглядає ось так:
my_project/
├── CMakeLists.txt
├── components/
├── main/
│ ├── CMakeLists.txt
│ ├── main.cpp
├── Makefile
└── sdkconfig
2. Редагування вихідних файлів
У директорії main/
відредагуйте файл CMakeLists.txt
, щоб включити:
# CMakeLists.txt
idf_component_register(SRCS "main.cpp" INCLUDE_DIRS ".")
Далі створіть або відредагуйте файл main.cpp
наступним чином.
Цей приклад ініціалізує Wi-Fi в режимі станції та підключається до мережі:
// main.cpp
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "nvs_flash.h"
#include "esp_event.h"
static const char *TAG = "wifi_station";
extern "C" void app_main();
class WiFi {
public:
WiFi(const char* ssid, const char* password)
: ssid_(ssid), password_(password) {}
void init() {
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_config_t wifi_config = {};
strcpy((char*)wifi_config.sta.ssid, ssid_);
strcpy((char*)wifi_config.sta.password, password_);
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "Ініціалізація Wi-Fi завершена.");
}
void connect() {
ESP_ERROR_CHECK(esp_wifi_connect());
ESP_LOGI(TAG, "Підключення до %s...", ssid_);
}
private:
const char* ssid_;
const char* password_;
};
extern "C" void app_main() {
ESP_LOGI(TAG, "Приклад WiFi станції для ESP32");
WiFi wifi("your_ssid", "your_password");
wifi.init();
wifi.connect();
while (true) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
**3.
Компіляція та завантаження мікропрограми
Для компіляції та завантаження мікропрограми на ESP32 виконайте наступні команди:
idf.py build
idf.py flash
idf.py monitor
Ці команди компілюють код, завантажують мікропрограму на ESP32 та відкривають серійний монітор для спостереження за журналами.
Цей приклад демонструє, як використовувати C++ з ESP-IDF для ініціалізації та підключення Wi-Fi на ESP32. Додаткові класи можна створювати для керування конкретними функціональностями, реалізації бізнес-логіки та абстрагування низькорівневих апаратних компонентів, що робить процес розробки більш модульним та масштабованим для складних проєктів.
Висновок
Застосування принципів об'єктно-орієнтованого програмування (OOP) в вбудованих системах, особливо з використанням C++, є вигідним підходом для сучасної розробки вбудованого програмного забезпечення.
Через OOP можливо проектувати системи, які є більш модульними, багаторазовими та легкими в обслуговуванні — це ключові характеристики для складних та довготривалих проєктів.
OOP дозволяє моделювати системи через класи та об'єкти, полегшуючи інкапсуляцію даних, абстракцію та організовану реалізацію конкретних функціональностей. Вибір OOP для вбудованих систем не тільки сприяє повторному використанню коду через успадкування та поліморфізм, але й підвищує безпеку та надійність програмного забезпечення через використання шаблонів, універсального програмування та обробки виключень. Крім того, вже існуючі фреймворки та бібліотеки, що підтримують OOP, забезпечують надійну основу для розробки вбудованих систем з розширеними функціями.
Хоча існують певні виклики, такі як потенційне збільшення споживання ресурсів у порівнянні з процедурним програмуванням, переваги OOP — такі як ясність у моделюванні проблем та легкість у обслуговуванні — переважають недоліки в багатьох сценаріях.
Отже, OOP, особливо з використанням C++, доводить свою ефективність як потужний інструмент для розробки ефективного та масштабованого вбудованого програмного забезпечення.
Список літератури
Booch, G. Object-Oriented Analysis and Design with Applications (3-е видання). 2007. Addison-Wesley.
Bloch, J. Effective Java (3-е видання). 2018. Addison-Wesley.
Embedded. Nuts to OOP!. 1999. Доступно за посиланням: https://www.embedded.com/nuts-to-oop.
Espressif Systems. ESP32 Series Datasheets. 2016. Доступно за посиланням: https://www.espressif.com/sites/default/files/documentation/esp32datasheeten.pdf.
Espressif Systems. ESP-IDF Programming Guide. 2016. Доступно за посиланням: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/index.html.
Gamma, E., Helm, R., Johnson, R., & Vlissides, J.
Design Patterns: Elements of Reusable Object-Oriented Software. 1994. Addison-Wesley.
Hunt, A., & Thomas, D. The Pragmatic Programmer: Your Journey to Mastery (20th Anniversary Edition). 2019. Addison-Wesley.
International Organization for Standardization. ISO/IEC 9899:2018: Information technology — Programming languages — C. Geneva, Switzerland. 2018. Доступно за посиланням: https://www.iso.org/standard/74528.html.
International Organization for Standardization. ISO/IEC 14882:2020: Programming languages — C++. Geneva, Switzerland. 2020. Доступно за посиланням: https://www.iso.org/standard/79358.html.
Josuttis, N. M. The C++ Standard Library: A Tutorial and Reference (2-е видання). 2012. Addison-Wesley.
Kernighan, B. W., & Ritchie, D. M. The C Programming Language (2-е видання). 1988. Prentice Hall.
Lippman, S. B., Lajoie, J., & Moo, B. E. C++ Primer (5-е видання). 2012. Addison-Wesley.
Martin, R.
C. Clean Code: A Handbook of Agile Software Craftsmanship. 2008. Prentice Hall.
Meyers, S. Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3-тє видання). 2005. Addison-Wesley.
NuttX Project. Документація NuttX. 2020. Доступно за посиланням: https://nuttx.apache.org/docs/latest/.
Python Software Foundation. Офіційний сайт Python. 2001. Доступно за посиланням: https://www.python.org/.
Qt Group. Qt Framework. 1995. Доступно за посиланням: https://www.qt.io/product/framework.
Stackoverflow. Чи є об'єктно-орієнтоване програмування шкідливим для вбудованих систем, і чому? [закрито]. 2010. Доступно за посиланням: https://stackoverflow.com/questions/3274445/is-object-orientation-bad-for-embedded-systems-and-why.
Stroustrup, B. Мова програмування C++ (4-те видання). 2013. Addison-Wesley.
Toradex.
Одноплатні комп'ютери (SBC). 2003. Доступно за посиланням: https://www.toradex.com.
Vaughan-Nichols, S. J. Розробка для IoT з ESP32 (1-ше видання). 2020. Apress.
Перекладено з: Programming Embedded Devices with Object-Oriented Programming in C++