Embedded C++ für Fortgeschrittene: Objektorientierte Programmierung für Mikrocontroller mit C++/EC++

21.02.2019

27.01.2020 - 31.01.2020

Veranstaltungsort: München, MicroConsult

Embedded C++ für Fortgeschrittene: Objektorientierte Programmierung für Mikrocontroller mit C++/EC++

Sie sind in der Lage, über die Verwendung dieser Konstrukte in Ihrer Applikation fundiert zu entscheiden. Sie können Patterns (State-Pattern, Singleton-Pattern, Observer-Pattern, Smart-Pointer-Pattern und Layer-Pattern) auf Ihre Applikationen hin adaptieren und dort implementiere

Die steigende Komplexität in Embedded-Softwareapplikationen und die immer leistungsfähigere Hardware erlauben inzwischen, C++ in steigendem Maße auch in Embedded-Systemen einzusetzen. Dabei sind abhängig von der Applikation Qualitätsmerkmale wie Sicherheit (Safety und Security), Performance, Ressourcenverbrauch und andere zu berücksichtigen. Sie kennen die Anwendung und die Effizienz fortgeschrittener C++ Konstrukte (Namespaces, Templates, Exception Handling, Runtime Type Identification, New Style Casts, Mehrfachvererbung, Speichermanagement). Sie haben einen Überblick über die Elemente und Mechanismen der STL (Standard Template Library) und können diese bereits einsetzen.

Inhalt

C++ für Embedded-Applikationen

  • Historie
  • Empfehlungen und Regelwerke
  • C++ Compiler-Prinzipien
  • Praxistipp mit wichtigen Referenzen

 

Zusammenfassung grundlegender C++ Konstrukte mit Effizienzbetrachtungen

  • Klasse und Objekt
  • Bestandteile von Klassen
  • Modifizierer für Daten, Funktionen und Objekte
  • Klassenrelationen (Assoziation, Aggregation, Komposition und Vererbung)
  • Virtuelle Funktionen und Interfaces

 

Namespaces mit Effizienzbetrachtungen

  • Verwendung von Namespaces im Programmcode
  • Namespace Alias, anonymer Namespace, Koenig-Lookup
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Anwendungsbeispiele in der Embedded-Software
  • Übung: Basierend auf der Architektur arbeiten Sie Namespaces in den bestehenden Programmcode ein

 

Einfachvererbung und Mehrfachvererbung mit Effizienzbetrachtungen

  • Programmierung der Einfach- und Mehrfachvererbung (mit Interfaces)
  • Problemsituationen und Lösungen bei der Mehrfachvererbung
  • Virtuelle Vererbung
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Anwendungsbeispiele in der Embedded-Software
  • Übung: Sie verwenden und programmieren die Mehrfachvererbung, wahlweise virtuell

 

Exception Handling mit Effizienzbetrachtungen

  • Erläuterung und Programmierung Exception Handling
  • Exception-Klassen und -Hierarchien
  • Benutzer-Exceptions
  • C++ Standard-Exceptions
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Anwendungsbeispiele in der Embedded-Software
  • Übung: Sie binden Exception Handling in die bestehende Applikation ein

 

Speichermanagement mit Effizienzbetrachtungen

  • Speichersegmente (BSS, Stack, Heap) für Objekte im Vergleich
  • Dynamisches Speichermanagement mit new und delete
  • Operatorüberladung mit new und delete
  • Risiken und Stolpersteine vermeiden
  • Placement new
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Anwendungsbeispiele in der Embedded-Software
  • Übung: Sie erzeugen und löschen Objekte dynamisch auf dem Heap

 

Runtime Type Identification (RTTI)

  • Erläuterung und Programmierung von RTTI
  • type_info Klasse
  • Konsequenzen beim Einsatz
  • Bezug zu Exception Handling
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Übung: Sie verwenden RTTI zur Klassenidentifikation zur Laufzeit

 

Typkonvertierung mit New Style Casts mit Effizienzbetrachtungen

  • Static, dynamic, const und reinterpret Cast
  • Die richtige Wahl beim Einsatz
  • Bezug zu RTTI und Exception Handling
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Anwendungsbeispiele in der Embedded-Software

 

Templates

  • Template-Funktionen
  • Template-Klasse und -Objekt
  • Template-Parameter
  • Vererbung und Interfaces mit Template-Klassen
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Praxistipps: Statische versus dynamische Polymorphie
  • Anwendungsbeispiele in der Embedded-Software

 

C++ Bibliotheken, sinnvoller Einsatz und Effizienzbetrachtungen

  • C++ String Klasse
  • Input/Output Stream Library (I/O Stream)
  • Stringstreams
  • Standard Template Library (STL)
  • Container, Iteratoren, Adapter, Algorithmen
  • Funktionsobjekte
  • Smart Pointer (intelligente Zeiger)
  • Assembler-, Speicher- und Laufzeit-Analysen und -Optimierungen
  • Anwendungsbeispiele in der Embedded-Software
  • Übung: Sie verwenden die String-Klasse in der Applikation und implementieren Container-basierend das Observer-Pattern

 

Zustandsautomaten Implementierung und Effizienzbetrachtungen

  • Prinzipielle Möglichkeiten der objektorientierten Implementierung und Modellierung
  • Implementierung auf Basis von switch-case / if-else Konstrukt
  • Implementierung auf Basis von Tabellenabarbeitung
  • Implementierung auf Basis des State-Patterns und Singleton-Patterns
  • Vergleich und Bewertung der verschiedenen Implementierungsarten
  • Vererbung von Zustandsfolgeautomaten
  • Praxistipp: Framework zur Zustandsautomaten-Implementierung

 

Besonderheiten bei der Programmierung von (quasi) paralleler Software

  • Race Conditions
  • Ressourcen-Management, Semaphore, Mutex
  • Problemsituationen und Lösungen
  • Granularität von Ressourcen
  • Thread-safe Programmierung
  • Praxistipp: Risiken erkennen und Stolpersteine vermeiden

 

Betriebssystem-Abstraktion (OSAL Operating System Abstraction Layer) mit C++

  • Nutzendarstellung, Vorteile, Nachteile
  • Einsatz von C++
  • Praxisbeispiel mit FreeRTOS™

 

Hardware-Abstraktionen, Hardware-Treiber und Interrupts mit C++

  • Software-Qualitätsmerkmale
  • Layer-Pattern und Anwendungsbeispiele in Embedded-Software
  • Layer-Kommunikation und Callback-Mechanismen
  • Objektorientierte Konzepte und Programmierung von Standard-Peripherietreibern
  • Objektorientierte Konzepte und Programmierung von Interrupt-Behandlungen
  • Kommunikation und Protokolle
  • Übung: Sie binden einen Treiber und Interrupt-Service in die Applikation ein

 

Praktische Übungen im Workshop

  • Für die durchgängige Übung (Uhrenapplikation) verwenden Sie das Arm Keil MDK (Microcontroller Development Kit) zusammen mit einer realen Hardware basierend auf einem Arm Cortex™-M3 Mikrocontroller.