> .global SIG_OUTPUT_COMPARE1A
> SIG_OUTPUT_COMPARE1A:
> nop
> nop
> reti
>
> Dieser Code benötigt 10 Takte, das kann man erkennen, die Frequenz
> des Timerinterrupts ist auch bekannt.
> CPULOAD=(100*(FREQ_TIMERINT*10))/XTAL_CPU
Das befriedigt mich nicht wirklich.
Zum einen 'siehst du' magisch die Anzahl der Taktzyklen die
in der ISR verbaut wurden. Wie du die magisch sehen willst, wenn
ich die ISR verändere, würde mich mal interessieren. Das heist:
eigentlich interessiert es mich nicht. Was mich viel mehr
interessieren würde ist, wie der Compiler das 'sehen' will.
Denn nur dann hat es einen Sinn. In dem Moment wo der Compiler
auf Hochsprachenebene diese Anzahl nicht festellen kann, ist
das alles sinnlos geworden. Denn was man ganz sicher nicht möchte:
Diese Anzahl händisch eintragen. Da kannst du dir das Ganze auch
sparen, da es ausser fehlerhaft nur noch fehlerhaft ist.
> die Frequenz des Timerinterrupts ist auch bekannt.
Ach ja? Im folgenden (symbolischen) Code ...
int main()
{
int Freq;
printf( "Wie schnell soll der Timer laufen: " );
scanf( "%d", &Freq );
SetTimerToFrequency( Freq );
}
... wie hoch ist denn da die Taktfrequenz? Wie soll der Compiler
die feststellen?
(Das ich hier scanf benutzt habe, hat Einfachheitsgründe. Könnte
genausogut eine mit einer Formal ausgerechnet werden, per UART
übertragen werden, per SPI gesetzt werden, mit einem Schalter
an einem Port umgeschaltet werden, ...)
Mit anderen Worten: Du hast keine Möglichkeit zur Compilezeit
ohne zusätzliche Annahmen die Werte für deine Formel zu bestimmen.
Da du diese Annahmen ...
* Anzahl Taktzyklen in der ISR ist bekannt und konstant
* Aufruffrequenz der ISR ist bekannt und konstant
.. aber treffen musst um die Formel anwenden zu können, kannst
du dir die auch mit einem Taschenrechner ausrechnen und einfach
als Text mit einem #warnung ausgeben lassen. Gut, ich
gebe zu, schöner wäre es wenn der Compiler die Formel auswerten
könnte, das vermeidet Tippfehler in der Berechnung.
Allerdings: Für deinen Benutzer ist das gehupft wie gesprungen,
denn: die Anzahl der Taktzklen muss immer noch er feststellen
und wenn er die Timerfrequenz verändert (in dem er den Prescaler
umprogrammiert oder zb. einen anderen CTC-Wert setzt), muss er
drann denken den entsprechenden Wert für deine Formel ebenfalls
anzupassen.
Ergo: Der Compiler spuckt zur Compilezeit eine Zahl aus, auf die
man sich nicht verlassen kann. Da kann ich mir den ganzen Aufwand
aber auch sparen.