bare-bones mit gcc und c++

25
© Zühlke 2014 Bare-Bones mit GCC und C++ Bare-Bones mit GCC und C++ | Frank Pilhofer 2. Dezember 2014 Folie 1

Upload: zuehlke

Post on 11-Jul-2015

421 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Bare-Bones mit GCC und C++

© Zühlke 2014

Bare-Bones mit GCC und C++

Bare-Bones mit GCC und C++ | Frank Pilhofer 2. Dezember 2014 Folie 1

Page 2: Bare-Bones mit GCC und C++

© Zühlke 2014

Bare-Bones

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 2

Page 3: Bare-Bones mit GCC und C++

© Zühlke 2014

UART

C++

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 3

SerialCommunication

UART USBVCP

ProtocolHandler

Unit TestMock

Page 4: Bare-Bones mit GCC und C++

© 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

Page 5: Bare-Bones mit GCC und C++

© 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

Page 6: Bare-Bones mit GCC und C++

© Zühlke 2014

Hello World!

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 6

Page 7: Bare-Bones mit GCC und C++

© 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

Page 8: Bare-Bones mit GCC und C++

© 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

Page 9: Bare-Bones mit GCC und C++

© Zühlke 2014

Bare-Bones, Bottom Up

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 9

Page 10: Bare-Bones mit GCC und C++

© Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 10

Disclaimer

Page 11: Bare-Bones mit GCC und C++

© Zühlke 20142. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer

Board Support Package

Folie 11

BSPGCC

Newlib

Linker Script MCU

TRM

ELF

Page 12: Bare-Bones mit GCC und C++

© 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

Page 13: Bare-Bones mit GCC und C++

© 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!

Page 14: Bare-Bones mit GCC und C++

© 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}

Page 15: Bare-Bones mit GCC und C++

© 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

Page 16: Bare-Bones mit GCC und C++

© Zühlke 2014

Objektkosten

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 16

Page 17: Bare-Bones mit GCC und C++

© 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

Page 18: Bare-Bones mit GCC und C++

© 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!

Page 19: Bare-Bones mit GCC und C++

© 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

Page 20: Bare-Bones mit GCC und C++

© Zühlke 2014

Das Drumherum

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 20

Page 21: Bare-Bones mit GCC und C++

© 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)

Page 22: Bare-Bones mit GCC und C++

© 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

Page 23: Bare-Bones mit GCC und C++

© Zühlke 2014

Fazit

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 23

Page 24: Bare-Bones mit GCC und C++

© 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

Page 25: Bare-Bones mit GCC und C++

© Zühlke 2014

[email protected]

2. Dezember 2014Bare-Bones mit GCC und C++ | Frank Pilhofer Folie 25