Ho più di 20 anni di sistemi embedded, principalmente 8 e 16 micros. La risposta breve alla tua domanda è la stessa di qualsiasi altro sviluppo software: non ottimizzare fino a quando non sai di doverlo fare, quindi non ottimizzare fino a quando non sai cosa devi ottimizzare. Scrivi il tuo codice in modo che sia affidabile, leggibile e gestibile per primo. L'ottimizzazione precoce rappresenta un problema, se non maggiore, nei sistemi integrati
Quando programmi "senza sprecare risorse", consideri il tuo tempo una risorsa? In caso contrario, chi ti sta pagando per il tuo tempo e, se nessuno, hai qualcosa di meglio da fare con esso. Una volta scelta, qualsiasi progettista di sistemi embedded deve fare il costo dell'hardware rispetto al costo dei tempi di progettazione. Se spedirai 100 unità, usa un micro più grande, a 100.000 unità, un risparmio di $ 1,00 per unità equivale a 1 anno di sviluppo software (ignorando il time to market, i costi di opportunità ecc.), A 1 milione di unità, inizi ottenere il ROI per essere ossessivo sull'utilizzo delle risorse, ma fai attenzione perché molti progetti embedded non hanno mai raggiunto il segno di 1 milione perché hanno progettato di vendere 1 milione (investimento iniziale elevato con costi di produzione bassi) e sono falliti prima che arrivassero lì.
Detto questo, le cose che devi considerare e conoscere con i (piccoli) sistemi embedded, perché questi impediranno il suo funzionamento, in modi inaspettati, non solo lo faranno rallentare.
a) Stack: di solito hai solo una piccola dimensione dello stack e spesso dimensioni del frame dello stack limitate. Devi essere consapevole del tuo utilizzo dello stack in ogni momento. Attenzione, i problemi di stack causano alcuni dei difetti più insidiosi.
b) Heap - ancora una volta, heap di piccole dimensioni, quindi fai attenzione all'allocazione della memoria ingiustificata. La frammentazione diventa un problema. Con questi due, devi sapere cosa fai quando finisci - non succede su un sistema di grandi dimensioni a causa del paging fornito dal sistema operativo. cioè quando malloc restituisce NULL, lo controlli e cosa fai. Ogni malva ha bisogno di un assegno e di un gestore, codice gonfio ?. Come guida: non usarlo se esiste un'alternativa. La maggior parte dei sistemi di piccole dimensioni non utilizza la memoria dinamica per questi motivi.
c) Interrupt di processo - Devi sapere come gestirli in modo sicuro e tempestivo. Devi anche sapere come rendere sicuro il codice di rientro. Ad esempio, le librerie C standard generalmente non rientrano nuovamente, quindi non dovrebbero essere usate all'interno dei gestori di interrupt.
d) Assemblaggio - quasi sempre ottimizzazione prematura. Al massimo è necessaria una piccola quantità (in linea) per ottenere qualcosa che C non può fare. Come esercizio, scrivi un piccolo metodo nell'assemblaggio realizzato a mano (da zero). Fare lo stesso in C. Misurare le prestazioni. Scommetto che la C sarà più veloce, so che sarà più leggibile, mantenibile ed estendibile. Ora per la parte 2 dell'esercizio - scrivi un utile programma in assembly e C.
Come altro esercizio, dai un'occhiata a quanto kernal di Linux è assemblatore, poi leggi, il paragrafo seguente sul kernel di Linux.
Vale la pena sapere come farlo, potrebbe anche valere la pena di essere abili nelle lingue per uno o due micro comuni.
e) "register unsigned int nome_variabile", "register" è, ed è sempre stato, un suggerimento per il compilatore, non un'istruzione, nei primi anni '70 (40 anni fa), aveva senso. Nel 2012, è uno spreco di battute poiché i compilatori sono così intelligenti e le istruzioni per i microsfondi sono così complesse.
Tornando al tuo commento su Linux - il problema che hai qui è che non stiamo parlando di solo 1 milione di unità, stiamo parlando di centinaia di milioni, con una vita di sempre. Vale la pena dedicare tempo e costi di progettazione per ottenerlo il più umanamente possibile. Sebbene sia un buon esempio delle migliori pratiche ingegneristiche, sarebbe un suicidio commerciale per la maggior parte degli sviluppatori di sistemi embedded essere pedante come richiede Linux Kernal.