Irrigation Controller · ARM Bare-Metal · CI/CD

C-Firmware für eine automatisierte Bewässerungssteuerung. Cross-Compilation für ARM Cortex-M, Unit-Tests mit Unity, Simulation in QEMU und vollständige CI/CD-Pipeline.

GitHub Repository

1 - Logische Systemarchitektur (Capella / MBSE)

Die logische Architektur des Controllers wurde in Capella (Arcadia / MBSE) modelliert. Sie zeigt die funktionalen Blöcke und ihre Datenflüsse, mit einem bewusst separaten Safety Monitor, getrennt von der normalen Steuerlogik.

Logische Architektur: Sensor Input, Control Logic, Safety Monitor, Pump Output

Die Steuerlogik (Control Logic) und die Sicherheitsüberwachung (Safety Monitor) sind getrennt: der Safety Monitor erzwingt Fail-Safe bei Sensorfehler und stoppt die Pumpe bei Überschreitung der maximalen Laufzeit (Schutz vor Überflutung).

2 - Anforderungen & Traceability

Jedes Verhalten ist als nummerierte Anforderung spezifiziert, und jede Anforderung wird durch mindestens einen automatisierten Test verifiziert — dasselbe Prinzip wie DOORS (Anforderungen) und XRAY (Testmanagement) in regulierten Branchen (ISO 26262, EN 50128, DO-178C).

IDAnforderungTest
REQ-01Pumpe bei Initialisierung aus (sicherer Startzustand)
REQ-02Niedrige Feuchte → Pumpe an (< 30 %)
REQ-03Hohe Feuchte → Pumpe aus (> 70 %)
REQ-04Hysterese (Pumpe hält Zustand zwischen den Schwellen)
REQ-05Sensorfehler → Pumpe zwangsweise aus (Fail-Safe)
REQ-06Max. Laufzeit → Pumpe stoppt (Überflutungsschutz)
REQ-07Invariante: LOW < HIGH Schwellenwert

7 Anforderungen, 7 verifizierende Tests, vollständige Abdeckung. Details: Requirements · Traceability Matrix

3 - Build- & Test-Pipeline

Drei Ebenen, von der Logik bis zur simulierten Hardware:

Irrigation Controller Architektur Drei Schichten: Geschaeftslogik in C, Cross-Compilation Toolchain, QEMU Hardware-Simulation, validiert durch CI/CD Logik (irrigation_controller.c) Hardware-unabhängig, reiner C-Code Schwellenwerte, Pumpensteuerung, Sicherheits-Timer Unity Tests main.c + startup.c Native Build (gcc/cl) Schnelle Validierung auf PC 7 Tests ARM Cross-Compile arm-none-eabi-gcc linker.ld definiert Speicherlayout firmware.elf QEMU Simulation lm3s6965evb Cortex-M Emulation Ersatz für reale Hardware Boot-Check GitHub Actions CI Native Tests → ARM Build → QEMU Boot-Check, bei jedem Push 7/7 Unit Tests Unity Framework 2 Bugs gefunden diagnostiziert + behoben

4 - Bugs während der Entwicklung

Bug 1: HardFault beim Boot in QEMU

⚠️ Symptom: qemu: fatal: Lockup: can't escalate 3 to HardFault, Program Counter blieb bei 0x00000000 stecken.

Diagnose: objdump -t firmware.elf zeigte korrekt platzierte Symbole, aber qemu -d in_asm Tracing enthüllte, dass die Ausführung nie die Adresse 0x08000000 erreichte.

Root Cause: Linker-Script nutzte STM32-typische FLASH-Adresse (0x08000000), aber die QEMU-Maschine lm3s6965evb erwartet Code ab 0x00000000.

MEMORY
{
    FLASH (rx)  : ORIGIN = 0x00000000, LENGTH = 256K   /* vorher: 0x08000000 */
    RAM   (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
✅ Fix: FLASH-Adresse korrigiert + Interrupt-Vektortabelle auf 16 Einträge erweitert.

Bug 2: Vertauschte Schwellenwerte

⚠️ Symptom: Ein Commit vertauschte versehentlich HUMIDITY_LOW_THRESHOLD und HUMIDITY_HIGH_THRESHOLD — die bestehenden Tests bemerkten es zunächst nicht, da sie nur Extremwerte prüften.

Lösung: Ein neuer Sanity-Check-Test wurde hinzugefügt, der explizit die korrekte Reihenfolge der Schwellenwerte validiert — dieser Test deckte den Bug zuverlässig auf.

void test_thresholds_are_correctly_ordered(void) {
    TEST_ASSERT_TRUE(HUMIDITY_LOW_THRESHOLD < HUMIDITY_HIGH_THRESHOLD);
}
✅ Fix: Werte zurück auf LOW=30, HIGH=70 korrigiert — alle 7 Tests bestanden.

5 - CI/CD Pipeline

jobs:
  native-tests:        # Schnelle Validierung der Logik
    - gcc compile + run Unity tests

  arm-cross-compile:    # Echte Zielarchitektur
    needs: native-tests
    - install gcc-arm-none-eabi + qemu-system-arm
    - arm-none-eabi-gcc cross-compile -> firmware.elf
    - qemu-system-arm boot check (kein HardFault)
    - upload firmware.elf als Artifact
7/7
Unit Tests bestanden
2
Bugs behoben
2
CI Jobs (native + ARM)

6 - Zusammenfassung

KomponenteTechnologieStatus
SpracheC (Bare-Metal)
ZielarchitekturARM Cortex-M
Cross-Compilerarm-none-eabi-gcc
Unit TestsUnity Framework (7/7)
Hardware-SimulationQEMU (lm3s6965evb)
CI/CDGitHub Actions
Systems EngineeringRequirements + Traceability (DOORS/XRAY-Prinzip)
ArchitekturCapella / MBSE (logische Architektur)
Git WorkflowFeature/Fix Branches, Pull Requests, Merges
Debuggingobjdump, QEMU Tracing