Vergleich zwischen digitalWrite und direkten Zugriff auch das Portregister

Code
  digitalWrite(2, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(2, HIGH);

  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  PORTD |= 1<<2;
  PORTD &= !(1<<2);
  
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;
  PORTD = 4;
  PORTD = 0;

 

digitalWrite: ~ 110 kHz
Port Register mit vergleich: ~ 4 MHz  (Faktor: ~36)
Port Register ohne vergleich: ~ 8 MHz (Faktor: ~72)

 

Der Code, der beim aufrufen von digitalWrite ausgeführt wird:

Code
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )

void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}