Frage: Direkte Port Manipulation

Habs grad mal zwei Versionen getestet.

unsigned long i;
unsigned long zeit;

void setup()
{
  DDRB = DDRB & B11111101;
  DDRC = DDRC | B00000010;

  Serial.print("\nTeste 1000000x direct port mapping\n");
  i = 0;
  zeit = micros();
}

void loop()
{
  if (i >= 1000000)
  {
    zeit = micros() - zeit;
    Serial.print("Dauer: ");
    Serial.print(zeit);
    Serial.print(" Mikrosekunden = ");
    Serial.print(zeit / 1000);
    Serial.print(" Millisekunden\n");
    while (1);
  }
  // Lese Pin 15 und Schreibe den Wert nach Pin 3
  PORTC = (PORTC & B11111101) | (PINB & B00000010);
  i++;
}

Wenn loop() immer wieder neu durchlaufen wird dauert es für 1 Million Lese/Schreib-Zugriffe 4904704 Mikrosekunden, also fast 5 Sekunden.

unsigned long i;
unsigned long zeit;

void setup()
{
  DDRB = DDRB & B11111101;
  DDRC = DDRC | B00000010;
}

void loop()
{
  Serial.print("\nTeste 1000000x direct port mapping\n");
  i = 0;
  zeit = micros();
  for (;;)
  {
    if (i >= 1000000)
    {
      zeit = micros() - zeit;
      Serial.print("Dauer: ");
      Serial.print(zeit);
      Serial.print(" Mikrosekunden = ");
      Serial.print(zeit / 1000);
      Serial.print(" Millisekunden\n");
      while (1);
    }
    // Lese Pin 15 und Schreibe den Wert nach Pin 3
    PORTC = (PORTC & B11111101) | (PINB & B00000010);
    i++;
  }
}

Fast der gleiche Code, allerdings wird loop() nicht mehr verlassen, sondern eine eigene Endlosschleife verwendet.
Dauer für 1 Million Lese/Schreib-Zugriffe ist nun 1383620 Mikrosekunden, also knapp 1,4 Sekunden.