I did do some profiling for my digitalWriteDirect function:
inline void digitalWriteDirect(int pin, boolean val){
if(val) g_APinDescription[pin].pPort -> PIO_SODR = g_APinDescription[pin].ulPin;
else g_APinDescription[pin].pPort -> PIO_CODR = g_APinDescription[pin].ulPin;
}
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
long t;
delay(1000);
t=micros();
for(int i=0;i<1000000;i++){
digitalWriteDirect(13,HIGH);
digitalWriteDirect(13,LOW);
}
t=micros()-t;
Serial.print("digitalWriteDirect : 1 million blinks in ");
Serial.print(t);
Serial.print(" uS = ");
Serial.print(1000000.0/t);
Serial.println(" MHz");
delay(1000);
t=micros();
for(int i=0;i<1000000;i++){
digitalWrite(13,HIGH);
digitalWrite(13,LOW);
}
t=micros()-t;
Serial.print("digitalWrite: 1 million blinks in ");
Serial.print(t);
Serial.print(" uS = ");
Serial.print(1000000.0/t);
Serial.println(" MHz");
}
digitalWriteDirect : 1 million blinks in 107251 uS = 9.32 MHz
digitalWrite: 1 million blinks in 4682844 uS = 0.21 MHz
I think digitalWrite on the Uno was about half as fast