Consigli per lo sviluppo di applicazioni pronte per la produzione
Mentre sviluppi applicazioni per i tuoi dispositivi Azure Sphere, ci sono diversi aspetti da considerare che assicurano che le applicazioni siano pronte per la produzione. Questo argomento include un elenco di controllo delle procedure consigliate per verificare che le applicazioni siano pronte per la distribuzione pilota o di produzione. La conferma di questi articoli è completa può ridurre il numero di problemi che si verificano in produzione e semplificare la diagnosi di eventuali problemi che si verificano.
Quando sviluppi un'applicazione Azure Sphere, decidi se verrà eseguita in high-level (HL),real-time (RT) core o ibrido di entrambi. Le applicazioni di alto livello vengono eseguite in contenitori nel sistema operativo Azure Sphere e le applicazioni in tempo reale (RTApps) vengono eseguite su bare metal o con un sistema operativo in tempo reale (RTOS) sui core in tempo reale.
I suggerimenti forniti qui hanno lo scopo di aiutare a migliorare la qualità e la produttività nelle applicazioni pronte per la produzione. L'elenco di controllo seguente fornisce un elenco conciso di suggerimenti per la progettazione per entrambi i tipi di applicazione, oltre a nozioni fondamentali sulla codifica consigliate e considerazioni sulla progettazione delle soluzioni, inclusi i collegamenti ad argomenti che illustrano ogni punto in modo più dettagliato. Questi suggerimenti derivano dalle nostre partnership con i clienti, tra cui analisi di campo, revisioni del codice e interazioni del supporto di applicazioni distribuite in produzione in soluzioni e progettazioni di dispositivi reali.
Nozioni fondamentali sulla codifica
Problemi comuni
- Assicurarsi che le applicazioni pronte per la produzione non utilizzino set di strumenti beta.
- Quando si seleziona il set di API, usare gli strumenti CMake e Azure Sphere più recenti.
- Per garantire l'ottimizzazione e le dimensioni complete del codice, è consigliabile compilare i pacchetti di immagini finali in modalità di rilascio prima di distribuire un'applicazione in produzione. Assicurarsi di compilare e testare il pacchetto release prima di distribuirlo.
- Usare un criterio di tipo zero-warnings quando si esegue una build completa per assicurarsi che gli avvisi del compilatore vengano risolti intenzionalmente.
- Configurare una pipeline CI/CD coerente e usare una strategia di diramazione appropriata.
Problemi relativi alla memoria
- Se possibile, definire tutte le stringhe fisse comuni come
global const char*
invece di hard coding, in modo che possano essere usate come puntatori ai dati. - Se le strutture di dati globali sono ragionevolmente piccole, è consigliabile assegnare lunghezze fisse ai membri della matrice invece di usare puntatori alla memoria allocata dinamicamente.
- Evita l'allocazione dinamica della memoria ogni volta che è possibile.
- Per le funzioni che restituiscono un puntatore a un buffer di memoria, è consigliabile convertire in funzioni che restituiscono un puntatore del buffer a cui viene fatto riferimento e le relative dimensioni ai chiamanti.
- Se possibile, definire tutte le stringhe fisse comuni come
Contenitori e buffer dinamici
- È consigliabile usare un approccio di allocazione incrementale per contenitori come elenchi e vettori.
Suggerimenti per la progettazione di applicazioni di base di alto livello
Nozioni fondamentali generali
- Inizializzare e distruggere correttamente tutti i gestori in caso di uscita o errore.
- Usa sempre i codici di uscita.
- Se un'applicazione rileva che si trova in uno stato irrecuperabile e richiede un riavvio, assicurarsi che venga sempre gestita come un'uscita "pulita" dell'applicazione, invece di rischiare uno stato deadlock.
- Implementare la gestione e la registrazione degli errori. Per altre informazioni, vedere Gestione e registrazione degli errori.
- Usa un timer di sistema come cane da guardia per rilevare se l'applicazione si trova in uno stato di stallo o irrecuperabile (ad esempio deadlock, memoria esaurita o connettività non recuperabile tramite la logica implementata) ed eseguire il ripristino corretto. Per ulteriori informazioni, vedi Usare un timer di sistema come cane da guardia.
Gestione della concorrenza
- Usare EventLoop ogni volta che è possibile.
- Cercare l'efficienza per le attività simultanee.
- Valutare quando usare i thread e l'ambito solo per attività specifiche. Per altre informazioni su quando usare i thread, vedere Gestione della concorrenza.
Monitoraggio della connettività
- Implementa un'attività corretta di controllo dell'integrità della connettività in base a una macchina a stato robusto che controlla regolarmente lo stato della connessione Internet.
- Per le soluzioni che richiedono la gestione dell'alimentazione, arresta il chip Azure Sphere dopo l'invio dei dati, tieni traccia del tempo di attività totale e imposta un timer di arresto.
- cURL ha recentemente aggiornato il comportamento di callback e le migliori pratiche. Anche se Azure Sphere si è impegnata a garantire che le versioni precedenti del comportamento cURL continuino a funzionare come previsto, si consiglia di seguire le linee guida più recenti per la sicurezza e l'affidabilità quando si usano curl_multi, poiché l'uso di callback ricorsivi può causare arresti anomali, interruzioni della connettività e potenziali vulnerabilità di sicurezza. Se un TimerCallback viene generato con un timeout di 0ms, consideralo come un timeout di 1ms per evitare callback ricorsivi. Assicurati anche di chiamare curl_multi_socket_action in modo esplicito almeno una volta dopo le chiamate a curl_multi_add_handle.
Gestione e utilizzo della memoria
- Tieni traccia dell'utilizzo della memoria dell'applicazione con le API del sistema operativo Azure Sphere e assicurati che le applicazioni reagiscano in modo appropriato a un uso imprevisto della memoria.
Suggerimenti in tempo reale per la progettazione di applicazioni di base
- Abilita il timer del cane da guardia MT3620 per rilevare un deadlock e implementare la logica di ripristino corretta.
- Implementare comunicazioni inter core per applicazioni HL-core e RT core ibride.
Considerazioni sulla progettazione di soluzioni
Requisiti di connettività e risoluzione dei problemi
- Verificare che tutti i prerequisiti di rete siano soddisfatti. Per altre informazioni, vedi Requisiti di connettività e risoluzione dei problemi.
- Risolvere i problemi di connettività tramite
OSNetworkRequirementCheck-HLApp
eOSNetworkRequirementChecker-PC
.
Contenuto consigliato
Per altri elementi da considerare quando si sposta una soluzione IoT in un ambiente di produzione, vedere Spostare una soluzione IoT da test a produzione.