Bei avrfreaks gab's eine ähnliche Diskussion und Jörg Wunsch hat noch eine Alternative gefunden:
http://www.avrfreaks.net/index.php?n...wtopic&t=36278
Leider geht -mcall-prologues nur für "mormale" Funktionen, auf ISRs hat das keinen Effekt.
Nebenbei: ich hab eben das Projekt mal mit dieser Option generiert, es schluckt dann 40 Bytes Flash mehr! (1bc9 anstatt 1b74, ohne .data und Konstanten).
Das liegt daran, daß nur eine Funktion (ausser den ISRs) überhaupt einen nennenswert fetten Prolog hat (von insgesamt 84 Funktionen ohne ISRs). Ich werd die Option aber mal im Auge behalten. GCC scheint zu wissen, ob sich für eine Funktion call-prolog rechnet. Funktionen ohne bzw. mit kleinem Prolog packt er nicht an.
Der Code, den avr-gcc macht, ist eben ziemlich dicht. Da noch was einsparen ist nicht ganz einfach...
Mit den ISRs hab ich's so gelöst:
In einer naked ISR lösch ich ihr enable-Flag (ist bitadressierbar, geht also, ohne ein Register zu brauchen oder SREG zu ändern). Danach spring ich mit rjmp zu der eigentlichen signal-Funktion, die aber nicht in der VecTab steht (weil sie nicht __vector_n heisst).
Diese Funktion hat nen normalen ISR-Rahmen. In ihr schau ich mir die enable-Bits an. That's it!
Also ähnlich wie die Lösung mit dem T-Flag oben. Ich weiß, welche IRQs aktiv sind und welche nicht, bzw könnte mir das auch merken. Die IRQs arbeiten als "one shot", und werden sowieso in ihrer eigenen ISR deaktiviert.
Das alles ist C, bis auf eine Zeile asm für den Sprung, den ich als inline machen mussDabei ist's wasserdicht und nicht mal hässlich -- zumindest nicht hässlicher als C für µC ohnehin schon ist...
Funktioniert auch prima, und der Code sieht super aus. Geändert hat sich nix, ausser dem Code-Schrumpf
Nochmal vielen Dank für eure Mühe und euren Gehirnschmalz!
Disclaimer: none. Sue me.
Bei avrfreaks gab's eine ähnliche Diskussion und Jörg Wunsch hat noch eine Alternative gefunden:
http://www.avrfreaks.net/index.php?n...wtopic&t=36278
Das Problem wird dort leider nicht besprochen.
Zwar werden mehrere IRQs auf die gleiche ISR abgebildet (wie auch immer), aber dort ist es nicht möglich zu unterscheiden, welche IRQ getriggert wurde.
Disclaimer: none. Sue me.
Stimmt, hatte ich übersehen.
Ist ja net schlimm, das Problem ist ja gelöst inzwischen. Trotzdem nochmal danke.![]()
Disclaimer: none. Sue me.
Lesezeichen