Zitat Zitat von MagicWSmoke Beitrag anzeigen
So werden's 72%:
Code:
Dim C_r As IRam Byte At 12                                                      'Channel Rot
Dim C_g As IRam Byte At 13                                                      'Channel Grün
Dim C_b As IRam Byte At 14                                                      'Channel Blau
Und das bringt's auf 66%:
Code:
On Timer0 Isr_timer0 Nosave
' ...
'ISR TIMER0
Isr_timer0:
        !push        r16
        !push        r17
        !push        r20
        !push        r21
        !push        r23
        !push        r24
        !push        r26
        !push        r30
        !push        r31
        !in          r24, SREG
        !push        r24
   Incr Pwm_count                                                               'PWM-Variable erhöhen
   If Div = 10000 Then                                                          'Teilervariable bei 10000 resetten
      Div = 0
      Set Flag_a
   End If
     Div = Div + 1                                                              'Teilervariable erhöhen
        !pop        r24
        !out        SREG,r24
        !pop        r31
        !pop        r30
        !pop        r26
        !pop        r24
        !pop        r23
        !pop        r21
        !pop        r20
        !pop        r17
        !pop        r16
Return
Außerdem kommt man dann ordentlich mit dem HWStack hin. Es hatte vorher lediglich keine Auswirkung wenn SWStack und Frame überschrieben wurden. Das Sichern der Register kostete 26 Bytes HWStack und der Aufruf von Incr Div nochmal 2 Bytes, 8 Bytes waren also viel zuwenig. Nun werden nicht mehr als 10 Byte Stack verwendet, bei Bedarf an mehr Platz für Variablen können folgende Stackangaben nochmal verkleinert werden, SWStack und Frame werden sowieso nicht benutzt.
Code:
$hwstack = 16
$swstack = 16
$framesize = 24
Hinweis dazu: die selektive Registersicherung per Nosave/Push/Pop ist nur solange als gültig zu betrachten, solange die ISR nicht verändert wird, evtl. muss man auf die Bascom-Version achten, hier 2.0.7.4
Interessanterweise wird mit ausgeschalteter Optimierung jeweils 1% weniger Speicher belegt.

Nein, das ist falsch. Incr Byte_Var und Byte_Var = Byte_Var +1 erzeugen zwar identischen Code, hingegen wird Word_Var = Word_Var +1 Inline compiliert, dagegen Incr Word_Var als Funktionsaufruf. Es hängt also erst einmal von der Zielvariablen ab.
Eine Funktion aufzurufen, d.h. Setzen der Register und ein RCALL/CALL, kostet weniger Flashspeicher als wenn der Code Inline eingebaut wird.
Hat man viele Stellen im Code, in denen eine Word-Variable um 1 erhöht wird, so ist es also genau anders herum, man spart mit der Incr-Version Speicherplatz. Das kann sich aber mit der Bascom-Version ändern.
In unserem Fall ist Div = Div + 1 besser, da es etwas weniger Stack braucht und schneller ist.
Echt stark was du da noch rausgequetscht kriegst :O
Wenn man in der ISR jetzt nur ein Flag setzt, kann man dann trotzdem deine ISR so wie sie ist nutzen oder muss man an dem push usw. noch was ändern?
Oder sicherst du damit nur die ganzen Register, egal wie die verwendet wurden?
Kannst du das nochmal bischen genauer erläutern . Bin jetzt neugierig geworden
Und das Decr und Incr besser ist wenn man ein Word hat ist ja auch interessant zu wissen.