Come si determina la quantità di flash / RAM necessaria per un microcontrollore?


24

Supponiamo che tu stia iniziando un progetto incorporato con alcune funzionalità note. Quando si seleziona un microcontrollore, come si seleziona la quantità di RAM necessaria?

Usi una bacheca di sviluppatori e codifichi prima il tuo progetto e poi vedi quanta memoria hai usato e quindi selezioni un microcontrollore appropriato che si adatta a quella memoria?

Scegli un microcontrollore robusto per un prototipo e poi ridimensionalo dopo avere un prodotto funzionante?

Scegli semplicemente qualcosa che sei sicuro sarà sufficiente e se esaurisci lo spazio, esegui l'upgrade a una densità di memoria più alta altrimenti mantieni il microcontrollore esistente?

Che cosa è considerata una buona pratica?


Mi sembra che dovrebbe essere possibile, da un punto di vista teorico dell'informazione, stimare il fabbisogno di RAM entro un ordine di grandezza (stile di ragionamento dimensionale), dalla specifica dell'attività. Hmmm ...
Lyndon White il

Se si utilizzano le librerie, è possibile ricercare il loro footprint di memoria. Con il tuo codice devi andare con l'esperienza. Confronta il nuovo progetto con quelli precedenti e determina se ti aspetti che sia più o meno grande.
jwsc,

Risposte:


20

Personalmente, per i progetti di hobby, tendo a utilizzare il microcontrollore più potente della famiglia con il giusto footprint. Quindi sviluppo il PCB, scrivo un po 'di codice e produco un prototipo.

Questo ha il vantaggio di conoscere abbastanza bene il piccolo numero di microcontrollori, quindi posso prototipare rapidamente senza dover leggere un intero foglio dati. Ho anche schede breakout e modelli di codice per loro.

Se funziona e ne sto guadagnando più di una manciata, allora compro il microcontrollore più economico che ha le periferiche giuste e memoria sufficiente per tutto ciò che ho codificato in precedenza. Questo può essere fastidioso se i registri interni cambiano (succede sul PIC) o se uno dei microcontrollori ha periferiche extra che devono essere disabilitate per far funzionare il codice.

Tuttavia, ai fini della produzione, ciò consentirebbe di radere una buona quantità da ogni unità.


Per i miei progetti personali tendo ad usare un approccio simile. Lo stesso metodo si insinua anche in ufficio con me. Non è sbagliato, funziona, ma ci sono modi migliori, ecc. Apprezzare l'input!
efox29,

Ci saranno sicuramente modi migliori in un ambiente "reale", aspettiamo altre risposte!
David

Absatively. Sviluppa in una grande sandbox e riduci più tardi. Il tempo che risparmierai coprirà più i $ 4 extra che spendi per microcontrollore su cui sviluppare. Funziona per qualcosa di più di un livello amatoriale - e in effetti è ancora più importante. Immagina 12 persone in attesa che avvenga il passaggio a un controller più grande invece di uno !!
Scott Seidman,

13

Naturalmente, per un singolo prototipo fatto in casa potrebbe essere una buona raccomandazione iniziare con il più potente di tutti i micro compatibili e ridimensionare in seguito.

Tuttavia, se vuoi vincere un preventivo, devi dire al tuo cliente un prezzo prima di avere i soldi per implementare qualcosa.

Pertanto, è buona norma scrivere qualche tipo di specifica prima di iniziare la programmazione. Sai cosa vuoi fare e dovresti scrivere come lo farai.

Questo "come" include anche pensare a una progettazione di software, rispondere a domande come:

  • Hai bisogno di un sistema operativo? Quale? Di quali risorse ha bisogno?
  • Vuoi avere un'architettura a strati? Ciò richiede interfacce che potrebbero consumare RAM
  • Quali librerie sono già disponibili e utili / necessarie per il tuo scopo e di quanta memoria hanno bisogno (una buona documentazione delle biblioteche risponde a questa risposta basandosi su almeno una build di riferimento)?
  • Quali strutture e variabili devi implementare per i tuoi driver e la tua applicazione?

Riassumendo tutti questi valori si ottiene una stima approssimativa. Quanto puoi fidarti di ciò dipende da quanto è dettagliata la tua analisi e dipende dalla tua esperienza :-)
L'aggiunta di un margine di almeno il 30-50% della tua stima è sicuramente una buona idea.

Una volta che il tuo prodotto è finito e hai circa l'80% del 90% di RAM in uso, puoi essere abbastanza sicuro che la tua selezione sia corretta, almeno per quanto riguarda la RAM.


2
Ri: "80..90% di RAM in uso". La prassi standard consiste nell'assicurare di utilizzare solo un massimo del 50% di utilizzo sia nella CPU che nella memoria per essere in grado di supportare futuri aggiornamenti e correzioni di errori.
Dunk

1
@Dunk: dipende dall'azienda. Nel settore automobilistico, l'80% di tutte le risorse (CPU, RAM, Flash) presso SOP è comunemente accettato. Ad esempio, nell'elettronica di consumo a basso costo potrebbe essere ancora di più: quanto è probabile che abbia un aggiornamento in un sistema con una durata di soli 2-3 anni?
Mic

@Dunk: potrei sbagliarmi, ma sembra che tu sia abituato a software in stile desktop con memoria dinamica e tutte le incertezze che ne derivano. La stragrande maggioranza delle applicazioni integrate alloca tutto staticamente. Garantito senza perdite di memoria. Quindi puoi usare esattamente il 100% e stare bene per sempre finché non lo modifichi. Ovviamente, ciò funziona solo se hai uno stack separato dalla RAM di lavoro o se sai esattamente come si comporterà lo stack in ogni momento. È una buona idea lasciare un po 'di spazio, ma il 10-20% è abbastanza facile per quello che ho fatto.
AaronD,

Il problema maggiore nel software incorporato sono i puntatori non autorizzati, i sovraccarichi del buffer, la divisione per zero e cose del genere. Alcuni MCU possono generare eccezioni nell'hardware, simili agli interrupt, ma tutto ciò che ho usato proseguirà allegramente come se nulla fosse mai accaduto. Ci sarà un risultato di qualche tipo, ma probabilmente non è quello che ti aspettavi, quindi dovrai verificarlo. Alcune cose, come l'aritmetica di overflow / underflow, sono facili da verificare e correggere immediatamente; altre cose, come i puntatori canaglia, possono passare inosservate fino a quando una funzione che ha funzionato per anni non ha deciso di esplodere.
AaronD,

3
Sia che tu voglia puntare all'80% o al 50% dipenderà dal tuo cliente. Con una specifica fissa e solo le correzioni di bug necessarie, l'80% va bene. Specifiche inaffidabili, scorrimento delle funzionalità previsto e un margine abbastanza grande da consentirle potrebbero portarti a pagare un extra per più spazio per la testa. Una volta abbiamo finito per acquistare il doppio dei microcontroller di cui avevamo bisogno e abbiamo selezionato quelli che si sarebbero overclockati abbastanza da darci le prestazioni di cui avevamo bisogno, che era molto più economico di una riprogettazione del PCB per un chip più potente.
Mark Booth,

3

Se solo fosse possibile codificare prima il sistema incorporato e quindi creare l'hardware. Ciò renderebbe la vita di tutti più semplice. Sfortunatamente, ciò significa anche che le tue scadenze sono fuori dalla finestra. In genere, l'hardware deve essere progettato molto prima che il software venga eseguito perché le parti hardware hanno spesso tempi di consegna lunghi.

Pertanto, gli sviluppatori di sw embedded dovranno generalmente stimare la memoria del proprio programma e le esigenze della CPU. Il tuo primo passo dovrebbe essere quello di provare a convincere i ragazzi hardware a darti il ​​microcontrollore / CPU più potente con la maggior quantità di RAM possibile. Raramente funziona perché hanno obiettivi propri, ma ogni tanto sei fortunato.

Se il problema persiste, la prossima cosa da fare è progettare un software di alto livello e suddividere i moduli in funzionalità. Stimeresti quindi le righe di codice per ciascuna funzione per ciascun modulo nel sistema. È quindi possibile utilizzare una formula per convertire le righe di codice in una stima a sfera della memoria del codice. Dovresti anche esaminare eventuali requisiti di memoria insoliti (come array di grandi dimensioni) e aggiungere alcune stime per soddisfarlo. Quindi aggiungi una percentuale in più rispetto a quel totale per coprire tutto ciò che hai perso. Quindi raddoppiare quello per soddisfare il tipico requisito di utilizzo del 50%.

Sì, ci vuole tempo. Sì, è necessario saltare attraverso tutti i cerchi perché cambiare hardware è davvero difficile dopo che è stato costruito.


Dove possiamo trovare la formula per convertire le righe di codice nella memoria del codice?
EasyOhm,

Quello dipende dalla lingua e dal compilatore che usi. Se usi Assembler una riga equivale all'incirca a una parola di memoria (qualunque sia la dimensione della parola del tuo chip). Se usi C potrebbe essere di circa 3-5 parole una riga e se usi C ++ o qualcosa di ancora più complesso potrebbe essere ancora molto di più. La cosa migliore da fare è compilare alcuni programmi scritti in quella lingua e confrontare le righe di codice con la memoria del codice per ottenere una media.
Dakkaron,

2

In genere, i fornitori di microcontrollori inseriscono nei propri dispositivi una gamma di memoria adatta alle applicazioni tipiche. Quindi, se hai bisogno solo di alcuni pin I / O e di una SPI in un dispositivo a ingombro ridotto, è improbabile che tu trovi qualcosa che viene fornito con 500 kByte di Flash e 64 kByte di RAM. Con dispositivi più grandi, che sono più vicini ai pacchetti SoC, anche il più piccolo è quasi certamente abbastanza grande a meno che tu non abbia intenzione di fare un serio scricchiolio dei numeri come l'elaborazione delle immagini.

In un ambiente professionale la chiave per scegliere il giusto microcontrollore è usare i dati storici. Avrai una registrazione degli altri progetti che hai sviluppato e saprai quale memoria e altre risorse di silicio sono necessarie per implementare ogni funzione. Saprai cosa dovrebbe fare il prodotto e quindi avrai un buon elenco di funzionalità e potrai calcolare rapidamente e accuratamente le risorse che il microcontrollore dovrà fornire. Cercare di indovinare i requisiti delle risorse da una specifica di progettazione anticipata (sviluppata all'inizio del progetto quando sono disponibili le informazioni più minime sul sistema) è inaffidabile nel migliore dei casi e solo ingegneri molto esperti, che hanno sviluppato un sistema completo database di dati storici nelle proprie teste, avrà qualsiasi tipo di successo nell'uso di questo metodo.

Molte aziende hanno adottato un approccio "Agile" sia alla progettazione software che elettronica, che prevede la costruzione di una "libreria" di schede piccole e funzionali (ad esempio schede RS-485, schede ADC, ecc.) Insieme a schede piattaforme generiche che ospitano i microcontrollori , in modo simile all'utilizzo di un kit di sviluppo e plug-in. Un prodotto può quindi essere rapidamente prototipato (entro poche ore) selezionando e collegando il set di schede richiesto per le funzionalità. Il software è assemblato in modo simile dai moduli della libreria e può essere portato e testato rapidamente. Una volta che si conosce la dimensione della parte specifica dell'hardware del codice, di solito è sufficiente selezionare la parte più piccola che la contenga. L'eccezione è quella sopra menzionata in cui la funzionalità del dispositivo coinvolge big data o algoritmi molto complessi. Questo metodo fornisce un accurato,

(Un altro vantaggio dell'approccio Agile è che consente lo sviluppo di software ed elettronica in parallelo, con la progettazione elettronica che si traduce in un esercizio per integrare il set di schede funzionali e fare la relativa EMC e altre cose difficili contemporaneamente al il software applicativo è in fase di sviluppo sugli assiemi di prototipi. Alcuni porting e integrazioni sono ancora necessari, ma è possibile quando sono disponibili software ed elettronica funzionanti.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.