
Zig-Entwicklungsvorlage für Flipper Zero mit automatisiertem Build-Pipeline, SDK-Integration und Cross-Compilierung für ARM Cortex-M4. Unterstützt Sub-GHz-, NFC-, RFID- und Infrarot-Protokolle.
Eine moderne, produktionsreife Vorlage für die Entwicklung von Flipper Zero-Anwendungen unter Verwendung der Programmiersprache Zig. Dieses Projekt bietet ein optimiertes Build-System, das Zig mit dem Flipper Zero SDK integriert und es Entwicklern ermöglicht, typsichere, speichersichere Anwendungen für die Flipper Zero-Plattform zu schreiben.
Diese Vorlage verbindet die leistungsstarken Build-System- und Sprachfunktionen von Zig mit dem Flipper Zero Firmware-Entwicklungskit. Sie bewältigt die komplexe Integration zwischen Zigs ARM Cortex-M4 Cross-Kompilierung und dem Flipper SDK und bietet einen sauberen Ausgangspunkt für benutzerdefinierte Anwendungen.
ufbt (inoffizielles Build-Tool) zur Verpackung von FAP-DateienDie Vorlage verwendet einen zweistufigen Build-Prozess:
Zig-Build-Phase: Kompiliert Zig-Quellcode in ARM Cortex-M4-Objektdateien (app.o)
thumb-Architektur mit cortex-m4-CPU-Modelleabihf (Embedded Application Binary Interface, Hard Float)ReleaseSmall für minimale Binary-GrößeUFBT-Paketierungsphase: Verknüpft Objektdateien mit dem SDK und verpackt sie im .fap-Format
ufbt-Befehlenufbt verwaltet (installiert unter ~/.ufbt)Die Vorlage ist vorkonfiguriert für ARM64 macOS mit dem ARM-Toolchain-Pfad:
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
Wenn Sie sich auf einer anderen Plattform befinden, müssen Sie möglicherweise den Pfad arm_libc_include in build.zig:31 an Ihren Toolchain-Standort anpassen.
UFBT installieren:
python3 -m pip install --upgrade ufbt
ufbt update
Diese Vorlage klonen oder herunterladen:
git clone https://github.com/yourusername/flipper-template.git
cd flipper-template
Projekt initialisieren:
zig build init
Dieses interaktive Skript wird Sie nach Folgendem fragen:
my_custom_app)Kompilieren Sie den Zig-Quellcode in eine Objektdatei:
zig build
Dies erstellt zig-out/bin/app.o mit dem gesamten kompilierten Anwendungscode.
Bauen und verpacken Sie die vollständige Anwendung:
zig build fap
Dies führt die gesamte Pipeline aus:
ufbt auf, um mit dem SDK zu verknüpfen.fap-Datei im dist/-VerzeichnisStarten Sie die Anwendung direkt auf einem angeschlossenen Flipper Zero:
zig build launch
Dies baut, verpackt und überträgt die App per USB und startet sie dann automatisch.
flipper-template/
├── application.fam # Flipper-App-Manifest (Metadaten, Einstiegspunkte)
├── build.zig # Zig-Build-System-Konfiguration
├── build.zig.zon # Zig-Paketmanifest
├── icon.png # App-Symbol (10x10px empfohlen)
├── setup.sh # Interaktives Projektinitialisierungsskript
├── src/
│ └── root.zig # Hauptquellcode der Anwendung
└── zig-out/ # Build-Artefakte (generiert)
└── bin/
└── app.o # Kompilierte Objektdatei
src/root.zig: Einstiegspunkt mit der start()-Funktion und der Anwendungslogikapplication.fam: Flipper-spezifische Konfiguration (App-ID, Kategorie, Abhängigkeiten, Stack-Größe)build.zig: Definiert Kompilierungsziele, SDK-Pfade und Build-BefehleDie Vorlage enthält ein "Hello World"-Beispiel, das die Kern-Flipper-APIs demonstriert:
// Flipper-SDK-Funktionen importieren
const flipper = @cImport({
@cInclude("furi.h");
@cInclude("gui/gui.h");
@cInclude("gui/canvas.h");
@cInclude("gui/view_port.h");
});
// Anwendungseinstiegspunkt (muss "start" heißen)
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32 {
// GUI-Viewport initialisieren
const gui = flipper.furi_record_open("gui");
const view_port = flipper.view_port_alloc();
// Callbacks und UI einrichten
// ... (vollständige Implementierung siehe src/root.zig)
// Ereignisschleife
_ = flipper.furi_thread_flags_wait(1, flipper.FuriFlagWaitAny, flipper.FuriWaitForever);
return 0;
}
Das Build-System konfiguriert automatisch Include-Pfade für:
Alle Header sind über @cImport() in Ihrem Zig-Code verfügbar.
Das Flipper SDK verwendet ARM-AAPCS-Aufrufkonventionen:
start()-Einstiegspunkt)Stellen Sie sicher, dass exportierte Funktionen der erwarteten Aufrufkonvention entsprechen:
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32
export fn draw_callback(canvas: ?*Canvas, ctx: ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void
Einige SDK-Header enthalten Konstrukte, die Zigs C-Übersetzer nicht verarbeiten kann (z.B. Unions mit undurchsichtigen Typen in input/input.h). Deklarieren Sie in diesen Fällen externe Funktionen manuell:
extern fn view_port_input_callback_set(
view_port: ?*flipper.ViewPort,
callback: ?*const fn (?*anyopaque, ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void,
context: ?*anyopaque
) callconv(.{ .arm_aapcs = .{} }) void;
Problem: Kann Header 'furi.h' nicht finden
~/.ufbt-Pfad falschufbt update aus, um SDK-Header zu installierenProblem: Undefinierter Verweis auf 'view_port_alloc'
zig build fap anstelle von zig build, um die Verknüpfung abzuschließenProblem: Kein Flipper-Gerät gefunden