Hi guys. I did some testing on 0017.
I modified turnOffPWM in wiring_digital.c, and profiled various configurations of inline/noninline, switch, if, and else if for the timer selection.
Here's the code that I tested with:
int unConstPwmPin = 3;
int unConstPin = 2;
const int constPwmPin = 5;
const int constPin = 12;
int index;
long time;
void setup() {
// set the digital pins as output:
pinMode(unConstPwmPin, OUTPUT);
pinMode(constPwmPin, OUTPUT);
pinMode(unConstPin, OUTPUT);
pinMode(constPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int var = LOW;
time = micros();
for (index = 0; index < 10000; index++)
{
digitalWrite(unConstPwmPin, HIGH);
digitalWrite(unConstPwmPin, LOW);
digitalWrite(constPwmPin, HIGH);
digitalWrite(constPwmPin, LOW);
digitalWrite(unConstPin, HIGH);
digitalWrite(unConstPin, LOW);
digitalWrite(constPin, HIGH);
digitalWrite(constPin, LOW);
digitalWrite(unConstPwmPin, var);
digitalWrite(unConstPwmPin, var);
digitalWrite(constPwmPin, var);
digitalWrite(constPwmPin, var);
digitalWrite(unConstPin, var);
digitalWrite(unConstPin, var);
digitalWrite(constPin, var);
digitalWrite(constPin, var);
var = !var;
digitalWrite(unConstPwmPin, var);
digitalWrite(unConstPwmPin, var);
digitalWrite(constPwmPin, var);
digitalWrite(constPwmPin, var);
digitalWrite(unConstPin, var);
digitalWrite(unConstPin, var);
digitalWrite(constPin, var);
digitalWrite(constPin, var);
}
time = micros() - time;
Serial.println(time);
delay(1000);
}
And here are the results:
Noninline switch = 1004456
Inline switch = 1004452
Noninline if=1019544
Inline if=1019544
Noninline elseif = 1019544
Inline elseif = 1019544
For the inline switch, this works out to be approximately 4.1852166666666666666666666666667 (etc) microseconds per pin. Note that I'm treating PWM and non-PWM pins the same, to find the AVERAGE efficiency. This works out to be approximately 239kHz.
If I tried only constant non-PWM pins with consant inputs, the frequency is about 270 kHz, whereas plain if's is 274kHz. For non-constant non-PWM pins with non-constant inputs, switch gives 266kHz; if gives 271kHz.
For a constant PWM pin with constant inputs, using switch, the frequency is 218kHz; using if's, it's exactly the same. For non-constant pins with non-constant inputs, switch gives 215 kHz; for if's, 199kHz.