Automotive Embedded Systeme - Effizfientes Framework - Vom Design zur Implementierung

von: Joachim Wietzke, Manh Tien Tran

Springer-Verlag, 2006

ISBN: 9783540283058 , 445 Seiten

Format: PDF, OL

Kopierschutz: Wasserzeichen

Windows PC,Mac OSX geeignet für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Online-Lesen für: Windows PC,Mac OSX,Linux

Preis: 20,67 EUR

Mehr zum Inhalt

Automotive Embedded Systeme - Effizfientes Framework - Vom Design zur Implementierung


 

Vorwort

6

Inhaltsverzeichnis

8

Die Listings

16

Abbildungsverzeichnis

22

1 Einleitung

25

Teil I Bausteine eines Embedded Frameworks

29

2 Ein Infotainment-System

31

2.1 Die Headunit

32

2.1 Die Headunit

32

2.2 Geräte/Devices im System

33

2.3 Begriffsklärung: Was ist ein Framework

34

2.4 Fokus unserer Framework-Betrachtungen

35

3 Anforderungen an ein Embedded Automotive Framework

37

3.1 Verteilte Entwicklung

37

3.2 MVC, Organisationen

37

3.3 Speicheranforderungen

39

3.4 Startzeiten

39

3.5 Menüwechselzeiten

40

3.6 Konfiguration versus Dynamik

40

3.7 Datenfluss/Kontrollfluss/Zustandssteuerung

40

4 Betriebssysteme

41

4.1 Prozesse, Tasks, Threads

42

4.2 Der Scheduler

43

4.2.1 Präemptive Prioritätssteuerung

43

4.2.2 Round-Robin

43

4.2.3 Prioritäts-Inversion, Prioritäts-Vererbung

43

4.2.4 Task-Switch, Kontextwechsel

44

4.3 Zusammenspiel mit der MMU

44

5 Design-Rules und Konventionen

45

5.1 Namenskonventionen

46

5.2 Shared-Verzeichnisse, Libraries

46

5.3 Eigene Definitionen im Shared

46

5.3.1 Standard-Typen

46

5.3.2 Alignment

47

5.3.3 Little-Endian, Big-Endian

48

5.3.4 Zahlengrenzen

49

5.3.5 Const Definitionen

49

5.3.6 Eigene Assertions

50

5.3.7 Exceptions und Signale

51

5.3.8 Eigene Ausgaben

51

6 Speicherverwaltung

53

6.1 Statische Speicherverwaltung

55

6.2 Dynamische Speicherverwaltung

55

6.3 Start-Up-Strategien

57

6.4 Speicherbedarf und kleine Pittfalls

57

6.4.1 Welche Variable wo?

57

6.4.2 Alternative Strategie 1: Späte Konstruktion

60

6.4.3 Alternative Strategie 2: Späte Initialisierung

62

6.4.4 Alternative Strategie 3: Lokale statische Variablen

63

6.4.5 Speicherort von Konstanten

64

6.4.6 Speicherbedarf eines einfachen Objekts

67

6.4.7 Speicherbedarf eines einfachen Objekts mit virtueller Methode

68

6.4.8 Speicherbedarf eines Objekts einer abgeleiteten einfachen Klasse

70

6.4.9 Speicherbedarf eines Objekts einer abgeleiteten Klasse mit virtueller Methode

72

6.4.10 Speicherbedarf eines Objekts einer abgeleiteten Klasse mit virtueller Basis-Methode

74

6.4.11 Mehrfachvererbung und Pittfall

76

6.4.12 Speicherbedarf dynamischer Variablen

79

6.4.13 Schlechte Parameterübergabe

80

6.4.14 Probleme mit dem Kopierkonstruktor

81

6.4.15 Probleme mit dem Zuweisungsoperator

81

6.4.16 Schlechte Rückgaben

81

6.4.17 Padding-Probleme

83

6.4.18 Alignment-Probleme, Endian-Probleme

84

6.4.19 Speicherfragmentierung

84

6.4.20 Vektoren, STL

85

7 Embedded Speicherkonzepte, spezielle Muster

87

7.1 Statische Variablen

87

7.1.1 Reihenfolge der Konstruktoren

87

7.2 Quasi-statische Allokation aus festem Pufferspeicher

90

7.2.1 Anlegen eines statischen Puffers

91

7.2.2 Placement-new

91

7.2.3 Makros zur Allokation

92

7.3 Allokator

94

7.3.1 Statische Allokation

97

7.3.2 Dynamische Allokation mit temporärem Heap

99

7.3.3 Object-Pool-Allokation

102

7.4 Datencontainer

106

7.5 Gemeinsam benutzte Objekte (Shared-Objects)

106

7.6 Referenzzähler (reference counting)

107

7.7 Garbage-Collection

109

7.8 Die Captain-Oates Strategie

109

7.9 Speicherlimit

110

7.10 Partieller Fehler (Partial Failure)

111

7.11 Fazit

111

8 Prozesse und POSIX-Threads

113

8.1 Prozesse

114

8.1.1 Der Lebenszyklus eines Prozesses

114

8.1.2 Prozesszustände

115

8.1.3 Zombies

116

8.1.4 Bestandteile

116

8.1.5 Prozess mit fork erzeugen

117

8.1.6 Prozess mit exec erzeugen

118

8.1.7 Prozess mit spawn erzeugen

120

8.1.8 Prozessvererbung

121

8.1.9 Prozessattribute

121

8.1.10 Über Prozessgrenzen hinweg

122

8.2 Threads

123

8.2.1 Erzeugung von POSIX-Threads

123

8.2.2 Allgemeine Gestaltung eines Threads in eingebetteten Anwendungen

124

8.2.3 Thread-Attribute

125

8.2.4 Über Threadgrenzen hinweg

128

8.2.5 Thread-spezifische Daten

130

8.2.6 Thread-Träger und Thread-Objekte

132

8.3 Designentscheidung

142

9 Inter-Prozess-Kommunikationskanäle, IPC

145

9.1 Pipe

145

9.2 FIFO, Named-Pipe

149

9.3 Socket, local

149

9.4 Socket-Verbindung zwischen Prozessoren

151

9.5 Message-Queues

158

9.5.1 System V Message-Queues

158

9.5.2 POSIX Message-Queues

158

9.6 QNX-Message

161

9.7 Shared-Memory

161

9.8 Shared-Memory gegen Überschreiben sch utzen

168

9.9 Zeitverhalten

173

9.10 Designentscheidung und prinzipielle Implementierung

174

10 Gemeinsame Nutzung von Code

175

10.1 DLLs

175

10.2 Shared-Code

175

10.3 Designentscheidung und prinzipielle Implementierung

176

11 Synchronisierungsmechanismen für Prozesse und Threads

177

11.1 Semaphore

177

11.2 Unbenannter Semaphor

181

11.3 Benannter Semaphor

184

11.4 Mutex, rekursiver Mutex

185

11.5 Mutex-Guard

191

11.6 Signale

192

11.7 Bedingungsvariablen (Condition Variables)

192

11.8 Zeitverhalten

201

11.9 Deadlock, Livelock und Prioritätsinversion

201

11.10 Zusammenfassung

206

12 Kommunikation per Events

207

12.1 Wichtige Event-Typen

208

12.1.1 Signal-Events

208

12.1.2 Events mit Cookies

209

12.1.3 Call-Events

209

12.1.4 Timer-Events

209

12.1.5 Change-Events (Notifikation - Das Hollywood-Prinzip)

210

12.2 Realisierungen von Events

210

12.2.1 Einfache Events

210

12.2.2 C-Strukturen

211

12.2.3 Funktionszeiger

213

12.2.4 Event-Klassen und Objekte

214

12.2.5 Zeiger auf Event-Objekte verschicken

216

12.2.6 Events am Beispiel von MOST

219

12.3 Designentscheidung und prinzipielle Implementierung

220

13 Event-Verarbeitung

221

13.1 Queues

221

13.1.1 Externe Queue

223

13.1.2 Interne Queue

228

13.1.3 System-Queue

229

13.1.4 Queue mit verbesserter Inversions-Eigenschaft

229

13.2 Dispatcher

235

13.2.1 Der System-Dispatcher

235

13.2.2 Der lokale Dispatcher

236

13.2.3 Signalisation im Dispatcher

237

13.2.4 Registrierung im Dispatcher

237

13.3 Synchrone Events

238

14 Zustandsautomaten

239

14.1 Motivation

239

14.2 Kommunikation

240

14.3 Automaten

241

14.4 Statechart-Elemente

241

14.5 Probleme mit Statecharts und Ersatzl osungen

245

14.6 Implementierung dynamischen Verhaltens

247

14.6.1 Definition der Events

248

14.6.2 Implementierung der Aktionen

249

14.7 Implementierung der Statecharts

250

14.7.1 Implementierung durch Aufzählung für Zustände und Unterzustände

250

14.7.2 Zustandsmuster (State-Pattern)

255

14.7.3 Verbesserte Aufzählungsmethode

264

14.8 Implementierung nach Samek

270

15 Externer Kommunikationskanal: MOST-Bus

277

15.1 Der synchrone Kanal

278

15.2 Der asynchrone Kanal

279

15.3 Der Kontrollkanal

279

15.4 Geräte/Devices im Framework

279

15.4.1 Logische Geräte, Modelle

281

15.4.2 Methoden

282

15.4.3 Properties

282

15.4.4 MOST-Adressierung

283

15.4.5 Adressierungsbeispiele

289

15.4.6 MOST-Events, prinzipielle Dekodierung des Headers

290

15.4.7 MOST-Events, prinzipielle Dekodierung der Daten

292

15.4.8 MOST-Konstanten

293

15.4.9 MOST-Probleme

295

Teil II Das Framework

298

16 Das Framework

299

17 OS-Grundmechanismen

301

18 Komponentenarchitektur

303

18.1 Event-Handler und Event-Formate

305

18.2 Implementierung von Schnittstellen, Proxy und Handler

309

18.3 Komponentenarchitektur

311

18.3.1 Komponentenkontext und Daten im Shared-Memory

312

18.3.2 Erzeugung der Kontexte

319

18.3.3 Main-/Admin-Task

324

18.3.4 Signale, Mechanismen über den Kontext

326

18.3.5 Komponenten-Dispatcher

332

18.3.6 Softtimer und Timer-Manager

334

18.3.7 Registrierung

342

18.3.8 Die Basisklasse AComponentBase und das Zusammenspiel mit der Umgebung

343

18.4 Zusammenfassung

351

19 Main-Dispatcher-Komponente

355

19.1 Dispatcher-Receiver

355

19.2 Dispatcher-Main-Thread

360

20 Modell-Komponenten, logische Geräte

365

20.1 Aufgaben des logischen Geräts

366

20.2 Was erwartet die HMI von einem logischen Gerät?

367

20.3 Zustände des Geräts

369

20.4 Gültigkeit der Daten

370

20.5 Kommunikationsanforderung

371

20.6 Struktur eines logischen Geräts

371

20.7 Datencontainer versus Event-Prinzip

371

20.8 Architektur eines Datencontainers

373

20.8.1 Struktur des Datencontainers

374

20.8.2 Lesezugriffe der HMI

380

20.8.3 Versenden eines HMI-Befehls

381

20.8.4 Menge der erlaubten High-Level-Aktionen

382

20.8.5 Abstrakte Klasse ADataContainerAccessor

383

20.9 MOST-Codec

387

20.9.1 Vorbereitung

387

20.9.2 Einfache Implementierung eines MOST-Decoders

391

20.9.3 Objektorientierter Ansatz

394

20.9.4 Objekte zur Kompilierzeit

396

20.9.5 Konstante Objekte zur Dekodierung der MOST-Nachrichten

398

20.10 Zusammenfassung

411

21 HMI-Komponente

413

22 Persistenz-Controller und On/Off-Konzepte

415

23 Codegenerierung

419

23.1 Erstellen der XML-Eingabe-Dateien

419

23.2 Erzeugen des Quellcodes

421

23.3 Übersicht der erzeugten Dateien

422

23.4 Übersetzen des Quellcodes

428

24 Sonstige Aspekte

429

24.1 Internes non-MOST-Device, Beispiel Mediaplayer

429

24.2 Internes MOST-Device, Beispiel Tastatur

429

24.3 Treiber im Framework

430

24.4 Einfaches Debugging-Konzept

430

24.5 Überlastverhalten des Systems

432

24.6 Anmerkungen zur Komplexität und zum Testing

433

25 Anhang

435

25.1 Timer und Zeitmessung

436

25.1.2 Timeout

438

25.2 Socket

438

25.2.1 InetAddr

438

25.2.2 CSockAcceptor

439

25.2.3 CSockConnector

442

25.2.4 CSockStream

444

25.3 Keyboard

446

25.4 Shared-Memory

448

25.5 CBinarySemaphore

456

25.6 Extern const

463

Literatur

465

Index

467