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.
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.
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
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
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
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
Dimension
1 (Low)
2 (Medium)
3 (High)
Kosten
< $50
$50-$500
> $500
Zeit
< 1 Woche
1-4 Wochen
> 4 Wochen
Safety
QM
ASIL A-C
ASIL D
Relevanz
Generisch
Branchenrelevant
Zentrale 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