Zum Inhalt springen

Entscheidungsregister / Projekt 2 · Entscheidungsübersicht

Entscheidungsprotokoll & Projekterkenntnisse28 Entscheidungen: 12 ADRs + 16 aus Projekterkenntnissen

12 Architekturentscheidungen und 16 Projekterkenntnisse zeigen, was entschieden wurde, warum Alternativen ausschieden und was sich nach den Tests änderte.

Zuerst lesen / So lesen Sie diese Seite

Die 12 Architekturentscheidungen sind nach Wirkung bewertet. Diese Seite fasst 12 der 14 ADRs aus dem Quellprotokoll zusammen. Die 16 Projekterkenntnisse zeigen den Ausgangspunkt und die daraus abgeleitete Entscheidung. Öffnen Sie einen Eintrag für Details.

Entscheidungen gesamt: 28
Architektur-ADRs: 12 (bewertet)
Entscheidungen aus Erkenntnissen: 16 (4 Kategorien)

Architekturentscheidungen

12 ADRs

3 Architecture | 5 Design | 4 Process

Aus Lessons Learned

16 Entscheidungen

Safety | Infra | Testing | Process

Scoring-Modell

Cost | Time | Safety | Relevance

1-3 each, total /12

Top Score

ADR-005: 10/12

STM32G474RE MCU platform choice

Architekturentscheidungen

Nach Tier filtern:
T45/12ADR-001: Dokumentstruktur nach ASPICE-Prozessbereichen

Cost 1 | Time 1 | Safety 1 | Relevance 2

Entscheidung: Dokumentation unter docs/aspice/ nach Prozessbereich organisieren

Warum sie gewinnt: Dateibasiertes ALM in Git bietet assessor-freundliche Struktur ohne Kosten mit voller Versionskontrolle.

T44/12ADR-002: Master-Plan als Quell-Baseline beibehalten

Cost 1 | Time 1 | Safety 1 | Relevance 1

Entscheidung: Master-Plan als einzigen strategischen Plan beibehalten, ASPICE-Ausführungspläne als operative Aufschlüsselung

Warum sie gewinnt: Der Master-Plan liefert strategischen Kontext (Architektur, BOM, Demos), den Ausführungspläne nicht abdecken.

T44/12ADR-003: Zentrales docs/research/ Repository erstellen

Cost 1 | Time 1 | Safety 1 | Relevance 1

Entscheidung: Alle externen Referenzen und Recherche-Notizen in docs/research/ zentralisieren

Warum sie gewinnt: Das Git-versionierte Rechercheprotokoll hält Quellen und Quellcode zusammen. Es ist durchsuchbar und prüfbar.

T45/12ADR-004: MAN.3 Live-Tracking-Set hinzufügen

Cost 1 | Time 1 | Safety 1 | Relevance 2

Entscheidung: Fortschrittsübersicht, Problemprotokoll, Entscheidungsprotokoll und Checkliste zur Freigabereife zu MAN.3 hinzufügen

Warum sie gewinnt: Markdown-Tracking-Dateien im Repo erfüllen ASPICE-Nachweisanforderungen und werden mit dem Code baselined.

T110/12ADR-005: STM32G474RE Nucleo für 3 Zonen-ECUs

Cost 2 | Time 2 | Safety 3 | Relevance 3

Entscheidung: 3x STM32G474RE Nucleo-64 Boards für CVC, FZC und RZC Zonensteuergeräte. 3x FDCAN, 5x ADC, CORDIC+FMAC, 170 MHz Cortex-M4F.

Warum sie gewinnt: Gewinnt CAN-FD, extra ADCs für Dual-Sensor-Plausibilität und HW-Beschleuniger vs F446RE. Arduino Mega disqualifiziert (8-bit/8KB/kein CAN).

T19/12ADR-006: AUTOSAR Classic geschichtetes BSW

Cost 1 | Time 2 | Safety 3 | Relevance 3

Entscheidung: Eigenes AUTOSAR-Classic-inspiriertes BSW: MCAL, EAL, Services, RTE — 16 Module, ~5.000 LOC geteilt über 3 STM32 ECUs.

Warum sie gewinnt: Deckt über 16 etablierte Automotive-Konzepte ab, Konformität mit ASPICE SWE.2/SWE.3 und Hardwareabstraktion für SIL-Tests. Höchste Branchenrelevanz gegenüber einem reinen Bare-Metal-Entwurf.

T27/12ADR-007: POSIX SocketCAN für simulierte ECU MCAL

Cost 1 | Time 2 | Safety 1 | Relevance 3

Entscheidung: POSIX SocketCAN API als MCAL-Schicht für 3 simulierte ECUs in Docker — 100% Code-Wiederverwendung zwischen physischen und simulierten ECUs.

Warum sie gewinnt: Einzige Option mit 100% Code-Wiederverwendung. Python-can zerstört die AUTOSAR-Portabilitätsgeschichte. Vector CANoe kostet $10K+.

T26/12ADR-008: BMW vsomeip für SOME/IP Demo

Cost 1 | Time 1 | Safety 1 | Relevance 3

Entscheidung: vsomeip (COVESA/BMW) für serviceorientierte Kommunikation zwischen simulierten ECUs und Pi Gateway.

Warum sie gewinnt: 4-7 Tage für funktionierendes SOME/IP Demo mit BMW/COVESA-Kredibilität. Eigene Reimplementierung verschwendet 4-8 Wochen.

T25/12ADR-009: Docker-Container für die Laufzeit simulierter Steuergeräte

Cost 1 | Time 1 | Safety 1 | Relevance 2

Entscheidung: Drei simulierte Steuergeräte (BCM, ICU, TCU) in Docker-Containern mit virtuellen CAN-Schnittstellen (vcan/vxcan) ausführen.

Warum sie gewinnt: Ähnlicher Aufwand wie systemeigene Prozesse, aber mit Isolation, Reproduzierbarkeit und Portabilität in CI/CD. QEMU benötigt deutlich mehr Einrichtungsaufwand.

T27/12ADR-010: Unity, CCS und pytest für automatisierte Tests

Cost 1 | Time 1 | Safety 3 | Relevance 2

Entscheidung: Unity (ThrowTheSwitch) für C-Unit-Tests, integrierte CCS-Tests für TMS570 und pytest für Python-Gateway und Cloud verwenden.

Warum sie gewinnt: Reines C und kurze Einrichtung gegenüber gtest. CMock erzeugt Mocks automatisch; CUnit wird nicht mehr gepflegt.

T17/12ADR-011: CAN 2.0B bei 500 kbps (kein CAN FD)

Cost 1 | Time 1 | Safety 3 | Relevance 2

Entscheidung: CAN 2.0B bei 500 kbps für gesamte Inter-ECU-Kommunikation. TMS570 DCAN erfordert klassisches CAN. 24% Busauslastung im ungünstigsten Fall — kein Bandbreitendruck.

Warum sie gewinnt: Null-Kosten-Baseline. CAN FD fügt 8-13 Tage für nicht benötigte Bandbreite hinzu. Ethernet erfordert 3 neue MCU-Boards + 6-10 Wochen.

T26/12ADR-012: AWS IoT Core + Timestream + Grafana

Cost 1 | Time 1 | Safety 1 | Relevance 3

Entscheidung: AWS IoT Core (MQTT), Amazon Timestream und Grafana für Cloud-Telemetrie verwenden; Nachrichten für die kostenlose Stufe bündeln.

Warum sie gewinnt: Geringe monatliche Kosten und hohe Relevanz im Automotive-Umfeld. Azure wäre deutlich teurer; reiner Eigenbetrieb zeigt weniger Cloud-Integration.

Entscheidungen aus Lessons Learned

Nach Kategorie filtern:
SafetyLL-001: Security Hardening in strikter Phasenreihenfolge ausführen

Entscheidung: Immer in Reihenfolge härten: Notfall-Fixes → Auth/Missbrauchsschutz → Zugriffskontrolle → API-Härtung → Monitoring → Verifikations-Gate. Nie zu erweiterten Features springen bevor Basics gesichert.

Was wir gelernt haben: Sprung zu OAuth und reCAPTCHA vor solidem Auth, Rate Limiting und CSRF verursachte erhebliche Nacharbeit über 10 Phasen.

  • Fail-Closed-Pattern: bei fehlender Config ablehnen, nie Auth still überspringen
  • Generisches SMTP von Anfang an — Vendor-SDK-Lock-in (Resend) kostete mehrere Phasen zum Entfernen
  • Marketing-Claims gegen Code prüfen VOR Launch — Zahlen veralten, Absolutaussagen sind falsch
InfrastrukturLL-002: CI-Tool-Version zuerst testen, nicht lokale

Entscheidung: Immer gegen die CI-Tool-Version (cppcheck 2.13) validieren bevor lokale Ergebnisse (2.17) als gültig angenommen werden. Tool-Versionen in CI-Config pinnen.

Was wir gelernt haben: cppcheck 2.13 (CI/Ubuntu apt) vs 2.17 (lokal/pip) hatte 6 Inkompatibilitäten die erst in CI nach Push auftraten.

  • Keine #-Kommentare in suppressions.txt — cppcheck 2.13 kann sie nicht parsen
  • .gitignore blockiert suppressions.txt — !-Ausnahme verwenden bei Directory-Pattern-Ignores
  • 1.536 auf 0 Violations an 1 Tag mit systematischer Triage: mandatory zuerst, required danach, advisory zuletzt
TestingLL-003: stdint.h-Typen in Host-Tests verwenden, nicht Plattformtypen

Entscheidung: stdint.h Fixed-Width-Typen (uint32_t) in allem host-kompiliertem Testcode verwenden. Nie auf AUTOSAR-Plattformtypen vertrauen die ILP32 annehmen.

Was wir gelernt haben: LP64 (Host) vs ILP32 (Target): uint32 mappte auf unsigned int am Target aber unsigned long am Host, verursachte 99 Type-Mismatch-Fehler in CI.

  • Source-Inclusion-Pattern für Unity-Tests — .c-Dateien includen, nicht linken; Standard Embedded TDD
  • Mock-State muss in setUp() gelöscht werden — ALLE Mock-Globals nullen, keine Ausnahmen
  • Header-Guard-Kollisionen über Testdateien (DEM_H, E2E_H) — Guards mit TEST_-Namespace prefixen
InfrastrukturLL-004: 4-bit modulare Arithmetik für Heartbeat Alive Counter verwenden

Entscheidung: Heartbeat Alive-Counter wrapt bei 4-bit (0-15) gemäß AUTOSAR E2E Profil 1, nicht 8-bit. Modulare Arithmetik und einzelner Monitor pro ECU verwenden.

Was wir gelernt haben: Doppelte Heartbeat-Monitore und 8-bit-Wrap-Annahme verursachten persistentes UI-Flackern im SIL-Demo-Dashboard.

  • Docker Compose v2: 'docker compose' (Leerzeichen) nicht 'docker-compose' (Bindestrich) — bricht Scripts still
  • NET_RAW-Capability für CAN in Containern erforderlich — aus Fehlermeldungen nicht ersichtlich
  • RTE_MAX_SIGNALS zu klein verursacht stillen Init-Fehler — Signalanzahl beim Start validieren
ProzessLL-005: Single Source of Truth für dokumentübergreifende Parameter

Entscheidung: Jeden geteilten Parameter (CAN-Bit-Timing, Sensor-Specs, Pin-Zuweisungen) in genau einem kanonischen Dokument definieren. Alle anderen Docs referenzieren, nie kopieren.

Was wir gelernt haben: CAN-Bit-Timing (87,5% vs 80% Abtastpunkt) war inkonsistent über 4 Dokumente. ACS723-Empfindlichkeit war in 5 Stellen falsch.

  • CAN-IDs am meisten duplizierte Daten — projektweites Grep nach jeder Änderung um Mismatches zu finden
  • MG996R Servo: 180 Grad, nicht 360 Grad (Amazon BOM-Listing-Fehler) — immer Datenblatt prüfen
  • Cross-Doc-Review-Checkliste findet was Einzel-Review verpasst
TestingLL-006: Test-First mit Pre-Commit-Hook für alle BSW-Module erzwingen

Entscheidung: Schreibzugriffe auf Firmware-.c-Quelldateien blockieren wenn keine entsprechende test_*.c existiert. AUTOSAR BSW Schicht-Bauordnung erzwingen: MCAL, ECUAL, Services, RTE.

Was wir gelernt haben: Ohne Erzwingung überspringen Entwickler Tests unter Zeitdruck. Hook-erzwungenes TDD produzierte 16 Module mit 212 Unit-Tests und null übersprungene Module.

  • Table-driven State Machines und Dual-Sensor-Plausibilität über alle BSW-Module bewährt
  • E2E als standalone Modul: abhängigkeitsfrei, wiederverwendbar über physische und simulierte ECUs
  • Phasenbasierte Ausführung mit Status-Tabelle hält Momentum und verhindert Scope Creep
ProzessLL-007: HITL-LOCK-Marker für Mensch-AI-Co-Development-Reviews verwenden

Entscheidung: Menschlich verfasste Review-Kommentare mit HITL-LOCK-Markern schützen. Why/Tradeoff/Alternative-Struktur verwenden. Jeden Review-Kommentar für CM-Nachvollziehbarkeit datieren.

Was wir gelernt haben: AI hat menschliche Review-Kommentare ohne Marker umformatiert und verschoben. 443+ HITL-Kommentare über 29 Docs wären ohne Schutz nicht verwaltbar.

  • HITL-LOCK-Marker sind unveränderlich nach Setzen — AI darf gesperrte Inhalte nie bearbeiten
  • Anforderungsbezogene Lessons-Learned-Dateien (SYS-NNN) halten Erkenntnisse mit ihrer Quelle verknüpft
  • Konsolidierter Lessons-Learned-Ordner besser als verstreute Einzel-Doc-Dateien
ProzessLL-008: Dateibasiertes ALM statt Schwergewicht-Tools verwenden

Entscheidung: Git + Markdown deckt 90% der DOORS/Polarion/Jama-Funktionalität bei 0% Lizenzkosten. ADR-Format mit 4-Dimensionen-Scoring ermöglicht entscheidungsübergreifenden Vergleich.

Was wir gelernt haben: 7-ECU-Hybrid-Architektur (4 Hardware-Ziele + 3 simuliert, bisher im SIL ausgeführt) ist so ausgelegt, dass der CAN-Bus Hardware nicht von Docker unterscheidet — dateibasierte Tools skalieren genauso.

  • Decision-Audit-Script findet undokumentierte Entscheidungen via heuristisches Grep
  • Tier-Zuordnung (T1-T4) folgt aus Scores, nicht willkürlicher Klassifizierung
  • Zonale Architektur aus Branchenrelevanz und Lernwert gewählt, nicht nur aus technischen Gründen
SafetyLL-009: Nur GND-Fault-Injection für Budget-HIL-Setups verwenden

Entscheidung: VBAT-Fault-Injection bei Budget-Hardware überspringen — nur GND + Open-Circuit deckt ~70% der Fehlermodi sicher ab. Präventiven Zener-Schutz auf jedem Kanal.

Was wir gelernt haben: VBAT-Fault-Injection auf ungeschützten Nucleo-Boards riskiert MCU-Zerstörung. Eine EUR 0,10 Zener-Diode verhindert EUR 16 Board-Ersatz.

  • DIY HIL ist legitim über Hobby-Niveau — eine 7-ECU-AUTOSAR-Plattform mit über 1.000 automatisierten Tests ist industrierelevant
  • Relais-basierte Fault-Injection-Matrix: MUX-Topologie reduziert Relaisanzahl von N*M auf N+M
  • Nadelbett-Adapter-Pattern von professionellen HIL-Bänken skaliert auf Budget-Hardware herunter
SafetyLL-010: Geteilten SPI-Bus als CCF in Abhängigkeits-Fehleranalyse dokumentieren

Entscheidung: 1oo2D auf geteiltem SPI-Bus akzeptabel wenn Erkennungspfad existiert (CRC + Plausibilität → sicherer Zustand). Geteilter Bus-Ausfall ist erkannter Multi-Point-Fault. Immer in DFA dokumentieren.

Was wir gelernt haben: Initialer Entwurf nahm SPI-Bus-Unabhängigkeit an. HITL-Review deckte auf dass geteilter SPI ein Common Cause Failure ist der explizit analysiert werden muss.

  • Beide CRCs gleichzeitig fehlerhaft = erkannter Fehler, nicht unerkannt — stärkt das Safety-Argument
  • DMA/Treiber-Komplexität kein gültiges Argument gegen SPI1+SPI2 — Config ist triviales Copy-Paste
  • Separate SPI-Busse nur gerechtfertigt wenn ASIL-Dekomposition bewiesene Unabhängigkeit erfordert
ProzessLL-011: CI-Merge bei Traceability-Lücken blockieren, nicht nur warnen

Entscheidung: CI muss Merge bei Traceability-Lücken blockieren — Advisory-Checks werden universell ignoriert. Stub-Scripts die CI bestehen geben falsches Vertrauen; Tooling richtig bauen oder ganz weglassen.

Was wir gelernt haben: 4 gebrochene Requirement-Links und 6 ungetestete SWRs waren unsichtbar bis automatisierte Traceability-Prüfung sie fand.

  • trace-gen.py validiert SG → FSR → TSR → SSR → Code → Test Kettenvollständigkeit
  • Verwaiste Requirements (keine Implementierung) und verwaiste Tests (kein Requirement) beide erkannt
  • Traceability-Report bei jedem CI-Lauf generiert — Assessoren können jederzeit prüfen
SafetyLL-012: Safety Case top-down von HARA aufbauen, nie bottom-up

Entscheidung: Immer HARA → Safety Goals → FSR → TSR → SSR aufbauen. Bottom-up produziert Rationalisierung, keine Verteidigung. FTTI muss aus Mechanismen abgeleitet werden, nicht geraten.

Was wir gelernt haben: Versuch SSRs vor HARA-Abschluss zu schreiben führte zu Requirements ohne Safety-Goal-Bezug — verschwendeter Aufwand.

  • S3/E4/C3 = ASIL D für Drive-by-Wire — die Matrixwerte sind eindeutig, keine Debatte nötig
  • Safety Goals brauchen FTTI-Begründung: detect_time + react_time aus konkreten Mechanismen abgeleitet
  • GSN (Goal Structuring Notation) macht die Argumentstruktur sichtbar und auditierbar
InfrastrukturLL-013: HAL für Testbarkeit entwerfen — ermöglicht SIL kostenlos

Entscheidung: HAL-Abstraktion für Unit-Testing entworfen ist die gleiche Abstraktion die SIL-Simulation ermöglicht. SocketCAN nutzt identische API für vcan und echtes CAN — nur Interface-Name ändern.

Was wir gelernt haben: POSIX SocketCAN-Backend wurde für SIL hinzugefügt, stellte sich aber als exakt gleiche Abstraktionsgrenze heraus die wir für host-basierte Unit-Tests brauchten.

  • POSIX-Backend-Dateien sind MISRA-befreit — Regeln 21.5, 21.6, 21.8, 21.10, 17.7 von Tag eins unterdrücken
  • vcan-Modul Auto-Load + Fehlerbereinigung bei Container-Neustart verhindert veralteten CAN-State
  • 100% Firmware-Code-Wiederverwendung zwischen physischem ECU und Docker-Container validiert die Abstraktion
InfrastrukturLL-014: Fault-Injection-Sequenzen deterministisch und zustandsbewusst machen

Entscheidung: Jede Fault-Injection muss einer definierten inject → detect → react → recovery Sequenz folgen. DTC-Broadcasts brauchen Arbitrierungs-Backoff. ML-Anomalie-Baselines variieren pro Betriebszustand.

Was wir gelernt haben: Zufällige Fault-Injection produzierte nicht-reproduzierbare Ergebnisse. ML-Anomalie-Scores steckten bei Baseline fest weil Schwellwerte verschiedene Betriebszustände nicht berücksichtigten.

  • DTC-Broadcast braucht randomisierten 0-50ms Backoff um CAN-Bus-Flooding durch gleichzeitige DTCs zu verhindern
  • E-STOP-Event-Spam bei Reset — ordentliche Fault-Clear-Sequenz vor Reaktivierung nötig
  • Controller-Viewer-Lock-Pattern verhindert Multi-User-Konflikte in Live-Demo
TestingLL-015: SIL-Integrationstests nächtlich ausführen — Mocks verpassen echte Integrationsfehler

Entscheidung: SIL-Tests finden Integrationsprobleme die Mocks nicht können: ECU-zu-ECU-Kommunikation, E2E-Schutz, Fault-State-Übergänge. Nächtlich in CI ausführen. Unbekannte Test-Schritte müssen laut fehlschlagen.

Was wir gelernt haben: COM TX/RX Bridge Timing-Probleme und E2E-Sequenzzähler-Mismatches waren in Unit-Tests unsichtbar — tauchten nur in Multi-ECU SIL-Läufen auf.

  • COM TX/RX Bridge ist die kritischste SIL-Komponente — vor Szenarien bauen und testen
  • Fail-Closed gilt auch für Test-Infrastruktur — unbekannte Steps müssen fehlschlagen, nicht überspringen
  • Plant-Simulator-Thermikmodell braucht Tuning pro Betriebspunkt, nicht pauschal
InfrastrukturLL-016: Jede Komponente gegen Hersteller-Datenblatt prüfen vor Bestellung

Entscheidung: Nie Marktplatz-Listings vertrauen — immer Hersteller-Datenblatt herunterladen und jeden Parameter prüfen. Volle Teilenummer inklusive Variantensuffix in BOM aufnehmen.

Was wir gelernt haben: MG996R als 360 Grad gelistet war tatsächlich 180 Grad. ACS723-05A vs ACS723-20A haben 4x unterschiedliche Empfindlichkeit (400 vs 100 mV/A). Beide verursachten Nacharbeit.

  • SOT-23-Komponenten brauchen Breakout-Boards — Gehäuse vs Montagemethode vor Bestellung prüfen
  • Lieferzeit für Automotive-Grade-Komponenten kann 8-12 Wochen sein — früh bestellen, mit Commercial Grade prototypen
  • BOM muss enthalten: volle Teilenummer, Hersteller, Distributor-Link, Datenblatt-Link, Gehäusetyp

Scoring-Modell

Dimension1 (Low)2 (Medium)3 (High)
Kosten< $50$50-$500> $500
Zeit< 1 Woche1-4 Wochen> 4 Wochen
SafetyQMASIL A-CASIL D
RelevanzGenerischBranchenrelevantZentrale Branchenkompetenz

Entscheidungsprozess

Erfasst

  • Problem und Randbedingungen dokumentiert
  • Mindestens 2 Alternativen mit Aufwandsschätzungen aufgelistet

Bewertet

  • Kosten/Zeit/Safety/Relevanz bewertet (1-3 je)
  • Tradeoff-Begründung mit explizitem Vergleich geschrieben

Baselined

  • Freigegeben mit ADR-NNN Kennung und Tier-Klassifizierung
  • Verknüpft mit Implementierungsnachweis in Code und Docs

Warum dieses Log stark ist

Jede Entscheidung hat 2 Alternativen mit Aufwandsschätzungen
  • Nicht nur 'wir wählten X' — jede ADR zeigt, was abgelehnt wurde und warum
  • Aufwand in Stunden + Dollar macht Tradeoffs konkret
  • Auditierbar durch jeden ASPICE-Assessor
4-Dimensionen-Scoring ermöglicht ADR-übergreifenden Vergleich
  • Kosten, Zeit, Safety, Relevanz konsistent 1-3 bewertet
  • ADR-005 (MCU, 10/12) vs ADR-003 (Research-Repo, 4/12) zeigt klares Ranking
  • Tier-Zuordnung (T1-T4) folgt aus Scores — nicht willkürlich
Entscheidungen verweisen auf Ausführungsnachweise
  • ADR-006 (AUTOSAR BSW) verweist auf 16 testgetrieben umgesetzte Module mit 212 Unit-Tests bei Abschluss von Phase 5
  • ADR-005 (STM32G474RE) verweist auf die CVC-Applikations-SWCs und ihre Host-Unit-Tests
  • 16 Lesson-abgeleitete Entscheidungen verknüpfen Erfahrung mit Projektstandards

Bewertete Architekturentscheidungen

Top Entscheidungen nach Score

ADR-005

10/12

STM32G474RE MCU-Plattform

ADR-006

9/12

AUTOSAR Classic BSW

ADR-007

7/12

SocketCAN Simulations-MCAL

ADR-010

7/12

Unity + CCS + pytest Testing

ADR-011

7/12

CAN 2.0B bei 500 kbps

Verwandte Portfolio-Seiten

Nutzen Sie diese Übersicht zusammen mit der Safety-Platform-Seite für einen vollständigen Projektüberblick.