La programmazione integrata impedisce l'allocazione dinamica

2

Attualmente sto lavorando a un progetto su un Arduino che dovrebbe funzionare per più anni senza interruzioni. Per fare questo, ho cercato di evitare costruttori, decostruttori e allocazione dinamica delle variabili generali tutti insieme, al fine di evitare perdite di memoria e altri modi di esaurire la memoria.

Questo progetto ha un paio di array molto grandi. Ho avuto un paio di casi in cui dopo aver modificato un #define il mio codice si caricava, ma si bloccava in pochi secondi. Cambiare questi array in statico invece mi ha dato errori durante il caricamento, a indicare che non c'era abbastanza memoria disponibile. Quindi sono andato su questa strada.

La mia domanda riguarda le prestazioni di questo approccio. In questo momento, ho una funzione che ha un corpo in quanto tale:

  uint16_t total = 0;
  uint8_t count = 0;
  for (int8_t i = AMOUNT_OF_MEASUREMENTS_FOR_AVERAGE; i>=0;--i){
    if (measurementsHigh[i] == 255){
      continue;
    }
    count++;
    total+=measurementsHigh[i];
  }
  if (count == 0){
    return 0;
  }
  return total/count;

Questo calcola la media di tutti i valori in measurementsHigh . Tuttavia, alloca anche quattro byte nello stack. Stavo pianificando di riscriverlo, in modo che le variabili i , count e total siano dichiarate nella classe come statiche, quindi prendi in considerazione questi 4 byte durante il caricamento.

La mia domanda non riguarda assolutamente se questo è considerato utile. Ad uno potrebbe sembrare solo aggiungere complessità e rendere il programma meno leggibile, all'altro sembrerebbe saggio nel contesto della programmazione integrata. Ciò potrebbe portare a discussioni che non vorrei provocare.

Invece, la mia domanda è ciò che fa in termini di prestazioni. Uso questo blocco di codice più volte e posso utilizzare le stesse variabili da un paio di punti del mio codice. È più veloce, più lento o non importa in termini di velocità? Migliora la stabilità del mio programma per evitare l'uso dello stack? (Lo so, con un uso corretto non si può creare una perdita di memoria nello stack, ma ancora ... matrici enormi di cui sopra ...) Ci sono altri modi per migliorare la stabilità di questo codice, che ho trascurato?

    
posta Daniël van den Berg 02.08.2016 - 13:27
fonte

1 risposta

1

Utilizzare le stesse variabili da un paio di punti del tuo codice potrebbe funzionare se sei molto attento, ma invita anche l'opportunità di bug difficili da trovare che non aiutano la stabilità del tuo programma.

A seconda che esegua più velocemente dipende dal microcontrollore. Alcuni microcontrollori hanno istruzioni che consentono l'indirizzamento relativo al puntatore dello stack che può essere più veloce (se si lasciano le variabili sullo stack). Dovresti rivedere l'elenco degli assembly per vedere quali istruzioni vengono utilizzate in entrambi i casi. Il ciclo è relativamente piccolo, 256 iterazioni al massimo, quindi qualsiasi differenza potrebbe essere minima.

Lasciando le variabili nello stack si libererebbero anche quei 4 byte da usare altrove nel tuo programma, il che sembra che sarebbe utile dato che stai già esaurendo la RAM. Si consiglia inoltre di prendere in considerazione la revisione delle dimensioni dello stack e dell'heap. Forse è possibile ridurre la RAM allocata a uno o entrambi questi spazi per liberare la RAM. Se non si utilizza alcuna allocazione dinamica della memoria, è possibile impostare la dimensione dell'heap su zero se non lo si è già fatto.

    
risposta data 02.08.2016 - 17:49
fonte

Leggi altre domande sui tag