Hi
weil der GCC nicht weiß welche Register in systimer_int() verändert
werden pusht er alle Arbeitsregister auf den Steck. Schreibe den Code
aus systimer_int() direkt in die ISR und die push's werden
verschwinden.
Matthias
Hallo,
das hatte ich schon ausprobiert, und dann wird der Kode auch
kleiner.
Ich dachte immer, der GCC versucht soetwas zu optimieren.
Allerdings sieht ja der GCC im Assemblerprogramm welche Register er
wirklich benutzt, und müßte dann die unbenutzten Register vom
poppen ausnehmen.
Ich denke, ich werde alle Interrupteinsprünge in eine extra Datei
aufnehmen, dann herrscht auch dort Ordnung.
Danke
Michael
Hallo,
mein Makefile ist oben.
Ich habe es jetzt in einer extra Datei und per include eingebunden.
Damit sind die wahnsinnig vielen pop und push verschwunden.
Dies scheint aber grundsätzlich nur aufzutreten, wenn man von
Interrupt-
einsprungadressen nochmal in eine Funktion überleitet.
Bei mir war das bei allen 3 Interupt's so.
Michael
Und woher weisst Du, welche Register der Compiler jetzt benötigt? Das
musst Du ja jetzt selbst kontrollieren! Und die Fehler, die auftreten,
weil im IR ein Reg zuwenig gesichert wird, die will ich nicht finden
müssen ...
Am Besten ist es, Du verwendest im IR keine Unterprogramme. Dann kann
der Compiler auch optimieren. Vorrausschauend die Registerbelegung
eines Unterprogramms zu erfassen dürfte für jeden Compiler nahezu
unmöglich sein, spätestens dann, wenn die Routine in einem anderen File
steht.
Stefan
Hallo,
generell sollte man in Interrupt Routinen immer möglichst kurz und
klein halten.
Um sie möglichst kurz zu halen empfiehlt es sich keine Funktionsaufrufe
zu verwenden, da man hier zumindest den Sprung zur Funktion und den
Rücksprung einsparen kann.
Gruß MarkusS
"Vorrausschauend die Registerbelegung
eines Unterprogramms zu erfassen dürfte für jeden Compiler nahezu
unmöglich sein, spätestens dann, wenn die Routine in einem anderen
File
steht."
Doch, der Keil C51 kann das.
Er legt für jede Funktion einen Eintrag der Registerverwendung an.
Wird eine Unterfunktion aufgerufen, dann schaut er in der Liste nach,
ob dazu ein Eintrag existiert.
Wird die Funktion aber erst später compiliert, existiert kein Eintrag
und er geht von der maximalen Registerverwendung aus.
Stellt er später fest, daß er zu pessimistisch war, compiliert er
nochmal und dann weiß er aber schon die Registerverwendung aller
Funktionen. Je nach Aufruftiefe können aber noch weitere Durchläufe
folgen.
Daher ist es besser, man macht ihm die Arbeit einfacher und schreibt
die Unterfunktionen möglichst vor den Aufrufer.
Peter