Ho scoperto dove è il collo di bottiglia, è la gestione della seriale, se si elimina la serial.begin il ciclo del conteggio viaggia a oltre 500 kHz, se si attiva la serial.begin la velocità crolla a meno di 128 kHz, il valore è inteso come ciclo costituito dalla cnt++ e la if, ovviamente non tiene conto della fine con relativo invio sulla seriale.
unsigned int cnt = 0;
const unsigned int CNT_MAX = 65000;
unsigned long prevMillis = 0;
Sketch usato per il test, commentando/decommentando opportunamente le varie PORTB = 0xxx tramite il DSO misuro la durata dell'impulso positivo che a sua volta rappresenta il tempo di esecuzione di una singola porzione del programma.
void setup() {
Serial.begin(115200);
pinMode (13, OUTPUT);
}
void loop() {
PORTB=0xff;
cnt++;
//PORTB=0x00;
//PORTB=0xff;
if (cnt > CNT_MAX) {
//Serial.println(millis() - prevMillis);
prevMillis = millis();
cnt = 0;
}
PORTB=0x00;
}
Come confronto di valori tra UNO e MEGA2560 ho questi risultati riferiti alla singola riga CNT++ e la IF
UNO MEGA2560
cnt++ 688.5 ns 688.5 ns
if 313 ns 313 ns
Mi pare ovvio che i tempi di esecuzione delle singole righe sono identici sia sulla UNO che sulla MEGA 2560, la differenza enorme è sul tempo del ciclo completo della loop con seriale attiva,sulla UNO dura 3.69 us e sulla MEGA2560 dura 7.75 us, disattivando la seriale sulla MEGA2560 il tempo del ciclo crolla a solo 1.95 us.
Adesso tocca capire perché attivare la seriale, e solo la prima, porta questo rallentamento sull'esecuzione del ciclo.