Also,
erstmal ist
1 | (value & maske) == maske
|
schon ein Ausdruck zuviel. Denn value & maske kann nur entweder 0 oder
maske sein, und dann kann man auch nur auf 0 bzw != 0 testen.
Dann sollte man noch wissen, dass if in c implizit auf != 0 testet, d.h.
man schreibt in einem solchen Fall
Wenn ich Deinen Code richtig verstehe, dann möchtest Du die maximal
verbrauchte Zeit minimieren, so dass der Code IMMER in weniger als 100us
abläuft. Also ist solch ein Konstrukt wie if (tmp != 0) am Anfang, das
nur zur Beschleunigung im nicht-worst-case Fall dient, überflüssig und
verschlechtert nur den worst-case Fall.
Dann fällt auf, dass Du pwm_counter entweder als static deklarieren
solltest oder außerhalb der Funktion. Sonst gehen die Werte darin
verloren zwischen 2 Funktionsaufrufen.
Außerdem denke ich, das erste if() in Deinem Code kann eigentlich so
nicht stimmen, denn Du möchtest bestimmt den else- Zweig für jedes Bit
durchlaufen, wo keine Flanke gekommen ist.
Ich versuche jetzt mal einen anderen Entwurf:
1 | if (tmp & 0x01) {
|
2 | pwm_input[0] = *pwm_counter[0];
|
3 | pwm_counter[0] = 0;
|
4 | } else if (pwm_value & 0x01) {
|
5 | pwm_counter[0]++;
|
6 | }
|
Und das einfach 8 mal hintereinander.
Weitere Optimierungen sind sehr davon abhängig, welchen Assemblercode
Dein Compiler aus diesem Stück macht!