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.
Lesezeichen