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 KHz | 8.333 MHz |
PORTA.OUTSET = PIN1_bm;PORTA.OUTCLR = PIN1_bm; | 3.571 MHz | 8.333 MHz |
PORTA.OUTTGL = PIN1_bm; | 3.125 MHz | 6.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.
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