
Modello di sviluppo Zig per Flipper Zero con pipeline di build automatica, integrazione SDK e cross-compilazione per ARM Cortex-M4. Supporta i protocolli Sub-GHz, NFC, RFID e Infrared.
Un template moderno e pronto per la produzione per lo sviluppo di applicazioni Flipper Zero utilizzando il linguaggio di programmazione Zig. Questo progetto fornisce un sistema di compilazione ottimizzato che integra Zig con l'SDK di Flipper Zero, consentendo agli sviluppatori di scrivere applicazioni type-safe e memory-safe per la piattaforma Flipper Zero.
Questo template colma il divario tra il potente sistema di compilazione di Zig e le caratteristiche del linguaggio con il kit di sviluppo firmware di Flipper Zero. Gestisce la complessa integrazione tra la cross-compilazione ARM Cortex-M4 di Zig e l'SDK Flipper, fornendo un punto di partenza pulito per applicazioni personalizzate.
ufbt (strumento di compilazione non ufficiale) per il confezionamento dei file FAPIl template utilizza un processo di compilazione a due stadi:
Fase di compilazione Zig: Compila il codice sorgente Zig in file oggetto ARM Cortex-M4 (app.o)
thumb con modello CPU cortex-m4eabihf (Interfaccia Binaria per Applicazioni Embedded, Hard Float)ReleaseSmall per dimensione binaria minimaFase di impacchettamento UFBT: Collega i file oggetto con l'SDK e li impacchetta nel formato .fap
ufbtufbt (installato in ~/.ufbt)Il template è preconfigurato per macOS ARM64 con il percorso della toolchain ARM:
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
Se sei su una piattaforma diversa, potresti dover modificare il percorso arm_libc_include in build.zig:31 in base alla posizione della tua toolchain.
Installa UFBT:
python3 -m pip install --upgrade ufbt
ufbt update
Clona o scarica questo template:
git clone https://github.com/yourusername/flipper-template.git
cd flipper-template
Inizializza il tuo progetto:
zig build init
Questo script interattivo ti chiederà:
my_custom_app)Compila il codice sorgente Zig in un file oggetto:
zig build
Questo crea zig-out/bin/app.o con tutto il codice applicativo compilato.
Compila e impacchetta l'applicazione completa:
zig build fap
Questo esegue l'intera pipeline:
ufbt per il collegamento con l'SDK.fap nella directory dist/Avvia l'applicazione direttamente su un Flipper Zero connesso:
zig build launch
Questo compila, impacchetta e trasferisce l'app via USB, quindi la avvia automaticamente.
flipper-template/
├── application.fam # Manifest dell'app Flipper (metadati, punti di ingresso)
├── build.zig # Configurazione del sistema di compilazione Zig
├── build.zig.zon # Manifest del pacchetto Zig
├── icon.png # Icona dell'app (10x10px consigliati)
├── setup.sh # Script di inizializzazione interattivo del progetto
├── src/
│ └── root.zig # Codice sorgente principale dell'applicazione
└── zig-out/ # Artefatti di compilazione (generati)
└── bin/
└── app.o # File oggetto compilato
src/root.zig: Punto di ingresso contenente la funzione start() e la logica dell'applicazioneapplication.fam: Configurazione specifica per Flipper (ID app, categoria, dipendenze, dimensione dello stack)build.zig: Definisce i target di compilazione, i percorsi SDK e i comandi di compilazioneIl template include un esempio "Hello World" che dimostra le API core di Flipper:
// Import Flipper SDK functions
const flipper = @cImport({
@cInclude("furi.h");
@cInclude("gui/gui.h");
@cInclude("gui/canvas.h");
@cInclude("gui/view_port.h");
});
// Application entry point (must be named "start")
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32 {
// Initialize GUI viewport
const gui = flipper.furi_record_open("gui");
const view_port = flipper.view_port_alloc();
// Set up callbacks and UI
// ... (see src/root.zig for complete implementation)
// Event loop
_ = flipper.furi_thread_flags_wait(1, flipper.FuriFlagWaitAny, flipper.FuriWaitForever);
return 0;
}
Il sistema di compilazione configura automaticamente i percorsi di inclusione per:
Tutte le intestazioni sono disponibili tramite @cImport() nel codice Zig.
L'SDK Flipper utilizza le convenzioni di chiamata ARM AAPCS:
start())Assicurati che le funzioni esportate corrispondano alla convenzione di chiamata prevista:
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32
export fn draw_callback(canvas: ?*Canvas, ctx: ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void
Alcune intestazioni dell'SDK contengono costrutti che il traduttore C di Zig non può elaborare (es., unioni con tipi opachi in input/input.h). In questi casi, dichiara manualmente funzioni esterne:
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;
Problema: unable to find header 'furi.h'
~/.ufbt erratoufbt update per installare le intestazioni SDKProblema: undefined reference to 'view_port_alloc'
zig build fap invece di zig build per completare il collegamentoProblema: No Flipper device found
Problema: L'app si blocca all'avvio
stack_size in application.fam o verifica le firme delle funzioniModifica addFlipperDefines() in build.zig per regolare le macro del preprocessore:
obj.root_module.addCMacro("FAP_VERSION", "\\\"1.0\\\"");
obj.root_module.addCMacro("CUSTOM_DEFINE", "value");
Cambia il livello di ottimizzazione in build.zig:11:
const optimize = b.standardOptimizeOption(.{
.preferred_optimize_mode = .ReleaseFast, // or .ReleaseSmall, .Debug
});
Il template ha come target lo STM32WB55 (ARM Cortex-M4F) di Flipper Zero. Per portarlo su altri dispositivi ARM, modifica build.zig:4-9:
const target = b.resolveTargetQuery(.{
.cpu_arch = .thumb,
.cpu_model = .{ .explicit = &std.Target.arm.cpu.cortex_m4 },
.os_tag = .freestanding,
.abi = .eabihf,
});
I contributi sono benvenuti! Questo template mira a semplificare lo sviluppo in Zig per Flipper Zero. Se incontri problemi di compatibilità con l'SDK o hai suggerimenti per migliorare il processo di compilazione, apri una issue o una pull request.
Questo progetto è concesso in licenza sotto la licenza MIT - consulta il file LICENSE per i dettagli.
Nota: Questo è un template non ufficiale e non è affiliato con Flipper Devices Inc. Testa sempre accuratamente le applicazioni prima di distribuirle su dispositivi di produzione.