Una vista alternativa: i microcontrollori non esauriscono la memoria.
Almeno, non quando programmato correttamente. La programmazione di un microcontrollore non è esattamente come la programmazione generale, per farlo correttamente devi essere consapevole dei suoi vincoli e programmare di conseguenza. Ci sono strumenti per aiutare a garantire questo. Cercali e imparali - almeno come leggere gli script e gli avvisi del linker.
Tuttavia, come affermano Majenko e altri, un microcontrollore programmato male può esaurire la memoria e quindi fare qualsiasi cosa, incluso il loop infinito (che almeno dà al timer del watchdog la possibilità di ripristinarlo. Hai abilitato il timer del watchdog, vero? )
Regole di programmazione comuni per i microcontrollori evitano questo: ad esempio, tutta la memoria viene allocata nello stack o allocata staticamente (a livello globale); "nuovo" o "malloc" sono vietati. Così è la ricorsione, in modo che la massima profondità di annidamento delle subroutine possa essere analizzata e mostrata per adattarsi allo stack disponibile.
Pertanto, la memoria massima richiesta può essere calcolata quando il programma viene compilato o collegato e confrontata con la dimensione della memoria (spesso codificata nello script del linker) per il processore specifico a cui si sta eseguendo il targeting.
Quindi il microcontrollore potrebbe non esaurire la memoria, ma il programma potrebbe. E in quel caso, ci riesci
- riscriverlo, più piccolo o
- scegli un processore più grande (spesso sono disponibili con dimensioni di memoria diverse).
Un insieme comune di regole per la programmazione dei microcontrollori è MISRA-C , adottato dall'industria automobilistica.
La migliore pratica a mio avviso è quella di utilizzare il sottoinsieme SPARK-2014 di Ada. Ada si rivolge effettivamente a piccoli controller come AVR, MSP430 e ARM Cortex abbastanza bene, e intrinsecamente fornisce un modello migliore per la programmazione del microcontrollore rispetto a C. Ma SPARK aggiunge annotazioni al programma, sotto forma di commenti, che descrivono ciò che il programma sta facendo.
Ora gli strumenti SPARK analizzeranno il programma, comprese quelle annotazioni, e dimostreranno le proprietà al riguardo (o segnaleranno potenziali errori). Non è necessario perdere tempo o spazio di codice per gestire accessi di memoria errati o overflow di numeri interi perché è stato dimostrato che non si verificano mai.
Sebbene sia coinvolto un maggior lavoro iniziale con SPARK, l'esperienza dimostra che può arrivare a un prodotto in modo più rapido ed economico perché non passi il tempo a inseguire riavvii misteriosi e altri comportamenti strani.
Un confronto tra MISRA-C e SPARK