Ho oltre 20 anni di sistemi embedded, per lo più 8 e 16 micros. La risposta breve alla tua domanda è la stessa di qualsiasi altro sviluppo di software: non ottimizzare fino a quando non ne hai la necessità, e quindi non ottimizzare fino a quando non sai cosa devi ottimizzare. Scrivi il tuo codice in modo che sia affidabile, leggibile e mantenibile prima. L'ottimizzazione prematura è tanto, se non più, un problema nei sistemi embedded
Quando programmi "senza sprecare risorse", consideri il tuo tempo una risorsa? Altrimenti, 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 tempo di ingegnerizzazione. 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, costo opportunità ecc.), A 1 milione di unità, si inizia ottenere ROI per essere ossessivi sull'utilizzo delle risorse, ma attenzione perché molti progetti incorporati non hanno mai ottenuto il marchio da 1 milione perché hanno progettato di vendere 1 milione (alto investimento iniziale con un basso costo di produzione) e sono falliti prima che arrivassero.
Detto questo, è necessario prendere in considerazione e conoscere i sistemi (piccoli) incorporati, perché ciò impedirà il funzionamento, in modi imprevisti, e non solo di rallentare.
a) Stack: di solito hai solo una piccola pila e dimensioni di frame dello stack spesso limitate. È necessario essere consapevoli di ciò che l'utilizzo dello stack è in ogni momento. Attenzione, i problemi di stack causano alcuni dei difetti più insidiosi.
b) Heap - di nuovo, dimensioni di heap ridotte, quindi fai attenzione all'assegnazione di memoria ingiustificata. La frammentazione diventa un problema. Con questi due, è necessario sapere cosa si fa quando si esaurisce - non accade su un sistema di grandi dimensioni a causa dell'OS paging fornito. Ad esempio, quando malloc restituisce NULL, lo controlli e cosa fai. Ogni malva ha bisogno di un assegno e un gestore, codice gonfio? Come guida: non usarlo se c'è un'alternativa. La maggior parte dei sistemi di piccole dimensioni non utilizza la memoria dinamica per questi motivi.
c) Interruzioni hardware - È necessario sapere come gestirle in modo sicuro e tempestivo. È inoltre necessario sapere come rendere sicuro il codice di rientro. Ad esempio, le librerie standard di C non sono generalmente rientranti, quindi non dovrebbero essere usate all'interno di gestori di interrupt.
d) Assemblaggio - ottimizzazione quasi sempre prematura. Al massimo una piccola quantità (in linea) è necessaria per ottenere qualcosa che C non può proprio fare. Come esercizio, scrivi un piccolo metodo nell'assemblaggio manuale (da zero). Fai lo stesso in C. Misura le prestazioni. Scommetto che il C sarà più veloce, so che sarà più leggibile, manutenibile ed estensibile. Ora per la parte 2 dell'esercizio - scrivi un programma utile in assembly e C.
Come un altro esercizio, dai un'occhiata a quanta parte del kernel di Linux è un assemblatore, quindi leggi il paragrafo seguente sul kernel di Linux.
Vale la pena sapere come farlo, potrebbe anche valere la pena conoscere le lingue per uno o due micros comuni.
e) "register unsigned int variable_name", "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 sequenze di tasti poiché i compilatori sono così intelligenti e le istruzioni del micros sono così complesse.
Torna al tuo commento di linux - il problema che hai qui è che non stiamo parlando di un solo milione di unità, stiamo parlando di centinaia di milioni, con una vita di sempre. Vale la pena dedicare tempo e costi tecnici per ottenerla nel modo migliore possibile. Sebbene sia un buon esempio della migliore pratica ingegneristica, sarebbe un suicidio commerciale per la maggior parte degli sviluppatori di sistemi embedded essere pedante come richiede il linux kernal.