bare-bones mit gcc und c++
TRANSCRIPT
© Zühlke 2014
Bare-Bones mit GCC und C++
Bare-Bones mit GCC und C++ | Frank Pilhofer 2. Dezember 2014 Folie 1
© Zühlke 2014
Bare-Bones
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 2
© Zühlke 2014
UART
C++
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 3
SerialCommunication
UART USBVCP
ProtocolHandler
Unit TestMock
© 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 Licensehttp://directory.fsf.org/wiki/License:CC_ASA2.0
© 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
© Zühlke 2014
Hello World!
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 6
© 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
© 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
© Zühlke 2014
Bare-Bones, Bottom Up
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 9
© Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 10
Disclaimer
© Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer
Board Support Package
Folie 11
BSPGCC
Newlib
Linker Script MCU
TRM
ELF
© 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 = 64KSRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8K
}
SECTIONS {.text : {
KEEP(*(.vector_table)). . .} > FLASH. . .
}
GNU C Compiler GNU Linker
ELF
© 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
ELFVorsicht,Stack!
© 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}
© 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
© Zühlke 2014
Objektkosten
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 16
© 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
© 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!
© 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 (;;);}
}
Spart50 kB
© Zühlke 2014
Das Drumherum
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 20
© 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)
© 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 RuntimeLibrary Exception Kommerzielle Verwendung erlaubt
Contiki BSD Muss in Dokumentation erwähnt werden
OpenOCD GPL Open Source
Qt Creator GPL+LGPL / Kommerziell
Open SourceSupport 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
© Zühlke 2014
Fazit
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 23
© 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
© Zühlke 2014
2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 25