Bare-Bones mit GCC und C++

1.006 Aufrufe

Veröffentlicht am

Objektorientierte Entwicklung mit C++ findet auch auf Embedded Systems immer mehr Anhänger. Vielfach bestehen allerdings Vorurteile, dass C++ zu komplex für den Einsatz auf Mikrocontrollern sei. Mit GCC steht ein kostenloser Compiler bereit, der alle gängigen Plattformen unterstützt. Der Einsatz auf einem Mikrocontroller stellt den Entwickler vor Herausforderungen, weil die Laufzeitumgebung mit ihrer Fülle von Features nicht für geringen Speicherbedarf optimiert ist, und daher die Vorurteile zu bestätigen scheint. Dieser Vortrag zeigt, dass der Einsatz von C++ und GCC mit ein paar Tricks auch auf kleinsten Mikrocontrollern möglich ist. Verschiedene Sprachfeatures werden auf ihre Kompatibilität mit Embedded Systems untersucht. Auf die Lizenzen von GCC und dazugehöriger freier Software – ein weiteres zu entkräftendes Vorurteil – wird ebenfalls kurz eingegangen.

Veröffentlicht in: Software
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.006
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
31
Aktionen
Geteilt
0
Downloads
5
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Bare-Bones mit GCC und C++

  1. 1. © Zühlke 2014 Bare-Bones mit GCC und C++ Bare-Bones mit GCC und C++ | Frank Pilhofer 2. Dezember 2014 Folie 1
  2. 2. © Zühlke 2014 Bare-Bones 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 2
  3. 3. © Zühlke 2014 UART C++ 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 3 Serial Communication UART USB VCP Protocol Handler Unit Test Mock
  4. 4. © Zühlke 2014 GCC 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 4 A Bold GNU Head © Free Software Foundation Used under CC ASA 2.0 License http://directory.fsf.org/wiki/License:CC_ASA2.0
  5. 5. © Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Bare-Bones mit GCC und C++ Folie 5 Auch nicht unwichtig Fokus dieses Vortrags Teil dieses Vortrags
  6. 6. © Zühlke 2014 Hello World! 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 6
  7. 7. © Zühlke 2014 Die Bausteine • GNU Tools for ARM Embedded Processors – Toolchain von ARM für ARM – Für Cortex-M und Cortex-R – „nano“ Specs für Embedded, „nosys“ Specs für Bare-Bones • Red Hat Newlib – Implementierung der Standard-C Bibliothek für Embedded – Kleiner, weniger Abhängigkeiten als GNU libc • Contiki e_stdio – Noch kleinere Implementierung der I/O-Funktionen • Open On-Chip Debugger – Verbindung zwischen GDB und Hardware – Unterstützt viele JTAG oder SWD-Adapter 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 7
  8. 8. © Zühlke 2014 Ein erster Versuch #include <stdio.h> int main(void) { printf("Hello World!n"); return 0; } 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 8 arm-none-eabi-gcc -mthumb -mcpu=cortex-m0 --specs=nosys.specs -o hello.elf hello.c
  9. 9. © Zühlke 2014 Bare-Bones, Bottom Up 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 9
  10. 10. © Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 10 Disclaimer
  11. 11. © Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Board Support Package Folie 11 BSPGCC Newlib Linker Script MCU TRM ELF
  12. 12. © Zühlke 2014 Der erste Schritt 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 12 extern void start(void) __attribute__((naked, noreturn)); static uint8_t stack[256]; static const void * vector_table[] __attribute__((section(".vector_table"))) = { /* Stack pointer. */ &stack[sizeof(stack)-1]), /* Reset vector. */ start }; void start(void) { ... main( ); } ENTRY(start) /* Only relevant when loaded by debugger. */ MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8K } SECTIONS { .text : { KEEP(*(.vector_table)) . . . } > FLASH . . . } GNU C Compiler GNU Linker ELF
  13. 13. © Zühlke 2014 C-Laufzeitumgebung 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer extern uint8_t __bss_start__, __bss_end__; extern uint8_t __data_load__, __data_start__, __data_end__; void start(void) { . . . memset( &__bss_start__, 0, &__bss_end__ - &__bss_start__); memcpy( &__data_start__, &__data_load__, &__data_end__ - &__data_start__); . . . } SECTIONS { .data : { __data_load__ = LOADADDR (.data); __data_start__ = .; *(.data*) __data_end__ = .; } > SRAM AT>FLASH .bss : { __bss_start__ = .; *(.bss*) *(COMMON) __bss_end__ = .; } > SRAM } GNU C Compiler GNU Linker Folie 13 ELF Vorsicht, Stack!
  14. 14. © Zühlke 2014 Weitere Initialisierung • _mainCRTStartup() (aus newlib) – hardware_init_hook(); – Hier kann das BSP die Hardware initialisieren – software_init_hook(); – Initialisiert C++-Objekte (Konstruktoren) – main(); 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 14 void start(void) { . . . _mainCRTStartup( ); } SECTIONS { .text : { __preinit_array_start = .; KEEP (*(.preinit_array)) __preinit_array_end = .; __init_array_start = .; KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) __init_array_end = .; } >FLASH }
  15. 15. © Zühlke 2014 Newlib „Nosys“ OS Interface 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer static void uart_put(char c); int _write(int fd, char *ptr, int len) { int c = len; while (c-- > 0) { while (USART1->SR & USART_SR_TXE); USART1->DR = *ptr++; } return len; } Folie 15
  16. 16. © Zühlke 2014 Objektkosten 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 16
  17. 17. © Zühlke 2014 C++ Sprachfeatures 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 17 Feature Kosten (Speicher) Kosten (Laufzeit) Namespaces 0 0 Templates 0 0 Einfachvererbung 0 0 Virtuelle Funktionen Wenige Bytes pro Objekt 1 Indirektion Mehrfachvererbung Wenige Bytes pro Objekt 1-2 Indirektionen RTTI (dynamic_cast<>) Ca. 100 Bytes pro Klasse 0 Exceptions Ca. 15% Ca. 5% Quelle: Technical Report on C++ Performance ISO/IEC TR 18015:2006 ~10 kB einmalige Abhängigkeiten
  18. 18. © Zühlke 2014 C++ Bibliotheksfunktionen 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Feature Kosten (Speicher) Iostreams > 100 kB std::string Ca. 10 kB std::vector Ca. 2 kB std::map Ca. 4 kB Algorithms (z.B. std::for_each) ~ 100 Bytes Folie 18 Stack- und Heap- Bedarf beachten!
  19. 19. © Zühlke 2014 Teurer Terminator … manchmal hilft nur noch „Use the Source“ 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 19 namespace __gnu_cxx { void __verbose_terminate_handler() { for (;;); } } Spart 50 kB
  20. 20. © Zühlke 2014 Das Drumherum 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 20
  21. 21. © Zühlke 2014 Debugging 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 21 MCU Debug Adapter JTAG / SWD OpenOCD GDB GDB Server USB (Windows)
  22. 22. © Zühlke 2014 Das Urheberrecht 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 22 Software Lizenz Bedeutung GCC GPL Open Source Newlib (C Runtime) BSD Muss in Dokumentation erwähnt werden libstdc++, libgcc GPL / GCC Runtime Library Exception Kommerzielle Verwendung erlaubt Contiki BSD Muss in Dokumentation erwähnt werden OpenOCD GPL Open Source Qt Creator GPL+LGPL / Kommerziell Open Source Support verfügbar Eclipse EPL Open Source winIDEA Open Kommerziell Kostenlos, keine Weitergabe, kein Support • „Open Source“ – Freie interne Verwendung – Weitergabe in unveränderter Form – Beschränkungen bei Integration in eigene Produkte
  23. 23. © Zühlke 2014 Fazit 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 23
  24. 24. © Zühlke 2014 Bare-Bones mit GCC und C++ • Objektorientierte Softwareentwicklung ist auch auf Mikrokontrollern sinnvoll • C++ passt auch in wenig RAM und ROM • GCC funktioniert • Manche essentiellen Informationen findet man nur im Quelltext oder bei Google • Die ganzen Details passen nicht in eine Präsentation • Mehr Informationen und alle Links im Artikel im Tagungsband – „Director‘s Cut“ per E-Mail 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 24
  25. 25. © Zühlke 2014 Fragen? Frank.Pilhofer@zuehlke.com 2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 25

×