Startpunkt
- Runterscrollen fuer den interaktiven Showcase mit Metriken, Code-Snippets und Prozess-Nachweis.
- Decision-Log Summary fuer eine schnelle Management-Uebersicht nutzen.
Hinweis: Das Quelldokument selbst ist aktuell auf Englisch.
ISO 26262 ASIL D zonale Fahrzeugplattform mit 7 ECUs, 475 Anforderungen, 1.648 Unit Tests und ~43.800 LOC C-Firmware. Vollstaendiger Safety-Lifecycle von HARA bis Unit-Verifikation.
Hinweis: Das Quelldokument selbst ist aktuell auf Englisch.
7
ECU-Knoten
4 physisch + 3 simuliert
475
Anforderungen
Voller Safety-Lifecycle
1.648
Unit Tests
Testgetriebene Entwicklung
~43.800
Firmware LOC
Echte C-Firmware
475
Traceability Links
SG zu SWR zu Test
>=99%
SPFM
Uebertrifft ASIL D Ziel
Portfolio-Projekt — Firmware getestet in SIL (Software-in-Loop), noch nicht auf physischer Hardware. STM32 ist IEC 61508 zertifiziert (industriell), nicht ISO 26262 qualifiziert.
Phase 0
Projektsetup & Architektur-Dokumentation
Phase 1
Safety Concept (HARA, Safety Goals, FSC)
Phase 2
Safety Analyse (FMEA, DFA, HW Metriken)
Phase 3
Anforderungen & Systemarchitektur
Phase 4
CAN Protokoll & HSI Design
Phase 5
Shared BSW Layer (18 AUTOSAR-aehnliche Module)
Phase 6
CVC Firmware (12 SWCs, 254 Tests)
Phase 7
FZC Firmware (Lenkung, Bremse, Lidar)
Phase 8
RZC Firmware (Motorsteuerung, Strom, Batterie)
Phase 9
Safety Controller (TMS570 unabhaengiger Monitor)
Phase 10
BCM, ICU, TCU Firmware (simulierte ECUs)
Phase 11
POSIX-Port + Docker SIL (7 ECUs containerisiert)
Phase 12
DBC-Datei + Plant-Simulator (Physikmodelle)
Phase 13
CAN-zu-MQTT Gateway + WebSocket Bridge
Phase 14
Live-Telemetrie-Dashboard (/embedded)
Phase 15
SAP QM Mock API (OData-Endpunkte)
Phase 16
Edge-ML Anomalie-Erkennung + Fehlerinjektion
Phase 17
VPS-Deployment + Live Demo
Phase 18
Physischer Hardware-Aufbau + HIL-Tests
Safety Goals (8) -> FSR (25) -> TSR (51) -> SSR (81) -> SWR (197)
-> HSR (25)
+ System Reqs (56) + Stakeholder Reqs (32) + FMEA (50 failure modes)
= 475 total requirements, 1,648 unit tests, 475 traced end-to-endPattern: Tabellengesteuerte Zustandsmaschine — 6 Zustaende x 11 Events
"Jeder Uebergang ist statisch definiert — keine Laufzeit-Ueberraschungen"
static const uint8 transition_table[CVC_STATE_COUNT][CVC_EVT_COUNT] = {
/* CVC_STATE_INIT */
{
CVC_STATE_RUN, /* EVT_SELF_TEST_PASS -> RUN */
CVC_STATE_SAFE_STOP, /* EVT_SELF_TEST_FAIL -> SAFE_STOP */
CVC_STATE_INVALID, /* EVT_PEDAL_FAULT_SINGLE -> (invalid) */
CVC_STATE_INVALID, /* EVT_PEDAL_FAULT_DUAL -> (invalid) */
...
},
/* CVC_STATE_RUN */
{
CVC_STATE_INVALID, /* EVT_SELF_TEST_PASS -> (invalid) */
CVC_STATE_INVALID, /* EVT_SELF_TEST_FAIL -> (invalid) */
CVC_STATE_DEGRADED, /* EVT_PEDAL_FAULT_SINGLE -> DEGRADED */
CVC_STATE_SAFE_STOP, /* EVT_PEDAL_FAULT_DUAL -> SAFE_STOP */
CVC_STATE_LIMP, /* EVT_CAN_TIMEOUT_SINGLE -> LIMP */
CVC_STATE_SAFE_STOP, /* EVT_CAN_TIMEOUT_DUAL -> SAFE_STOP */
CVC_STATE_SAFE_STOP, /* EVT_ESTOP -> SAFE_STOP */
CVC_STATE_SAFE_STOP, /* EVT_SC_KILL -> SAFE_STOP */
...
},
/* ... DEGRADED, LIMP, SAFE_STOP, SHUTDOWN */
};Pattern: Kreuzpruefung zweier unabhaengiger Sensoren, Entprellung vor Fehlererkennung
"Beide AS5048A Sensoren muessen innerhalb des Schwellwerts fuer N aufeinanderfolgende Zyklen uebereinstimmen"
/* Plausibility check (only if both sensors read OK) */
if (new_fault == CVC_PEDAL_NO_FAULT) {
delta = Pedal_AbsDiff16(raw1_local, raw2_local);
if (delta >= Pedal_CfgPtr->plausThreshold) {
Pedal_PlausDebounce++;
if (Pedal_PlausDebounce >= Pedal_CfgPtr->plausDebounce) {
new_fault = CVC_PEDAL_PLAUSIBILITY;
}
} else {
Pedal_PlausDebounce = 0u;
}
}Pattern: AUTOSAR E2E Profil P01 — CRC + Counter in CAN PDU gepackt
"16 von 32 CAN-Nachrichten sind E2E-geschuetzt — erkennt Korruption, Verlust und Replay"
Std_ReturnType E2E_Protect(const E2E_ConfigType* Config,
E2E_StateType* State,
uint8* DataPtr, uint16 Length)
{
uint8 crc;
if ((Config == NULL_PTR) || (State == NULL_PTR) || (DataPtr == NULL_PTR))
return E_NOT_OK;
if (Length < E2E_PAYLOAD_OFFSET)
return E_NOT_OK;
/* Increment alive counter (4-bit, wraps 0..15) */
State->Counter = (State->Counter + 1u) & 0x0Fu;
/* Write byte 0: [counter:4 | dataId:4] */
DataPtr[E2E_BYTE_COUNTER_ID] =
(uint8)((State->Counter << 4u) | (Config->DataId & 0x0Fu));
/* Compute CRC over payload (bytes 2..N-1) + DataId */
crc = E2E_ComputePduCrc(DataPtr, Length, Config->DataId);
DataPtr[E2E_BYTE_CRC] = crc;
return E_OK;
}~160 Dokumente — Entwurf (befuellt), vollstaendiger Inhalt, noch nicht formal reviewed