giovedì 20 giugno 2013

Prestazioni XMega in modalità Debug e Release

Atmel Studio, che ricordiamo essere una shell di Visual Studio personalizzata da Atmel, permette di gestire diverse configurazioni all’interno di uno stesso progetto.
Ogni configurazione imposta diversi parametri del compilatore e del linker, normalmente troviamo già pronte le configurazioni Debug e Release.
Vediamo superficialmente alcune differenze a livello prestazionale su un XMega32A4U a 32 MHz:











Istruzioni (all’interno di un ciclo continuo) Debug Release
ioport_set_pin_level(PORTA1, LOW);
ioport_set_pin_level(PORTA1, HIGH);
208.3 KHz8.333 MHz
PORTA.OUTSET = PIN1_bm;
PORTA.OUTCLR = PIN1_bm;
3.571 MHz8.333 MHz
PORTA.OUTTGL = PIN1_bm;
3.125 MHz6.250 MHz

A prima vista, noncuranti della configurazione impostata che normalmente è Debug, l’utilizzo delle API IOPORT potrebbe sembrare molto più lento rispetto alla manipolazione diretta dei registri.

Semplicemente passando alla configurazione Release si otterranno però performance molto simili, in alcuni casi quasi 40 volte superiori alla configurazione Debug.

debug_release

Come curiosità per i lettori che utilizzano la scheda Arduino, su un ATMega328P a 16 MHz utilizzando le istruzioni
void setup() {                
  noInterrupts();
  DDRB = B00000001;
  while(true)
  {
    PORTB = B00000001; 
    PORTB = B00000000; 
  }
}
void loop() {
}

è possibile ottenere una frequenza di 4.000 MHz che cala ad 1.064 MHz (con lunghe pause tra un onda quadra e la successiva) se il ciclo avviene all’interno della funzione loop() a causa del maggiore overhead presente nella chiamata alla funzione loop().


void setup() {                
  noInterrupts();
  DDRB = B00000001;
}
void loop() {
  PORTB = B00000001; 
  PORTB = B00000000;
}

Nessun commento:

Posta un commento