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.