
Zitat von
Kampi
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?
Nein, ich würde vor pauschaler Nutzung immer vorsichtig sein.
Es sind insgesamt 32 Register und ich sichere nur die Verwendeten. Da ist's wichtig sich dazu das erzeugte ASM-Compilat ansehen und zu schauen was da tatsächlich hergenommen wird. Wenn Bascom-Funktionen (wie z.B. Incr) aufgerufen werden, wird's schwieriger, denn dann geht's erstmal aus der ISR per CALL/RCALL raus und mann muss alle weiteren Verzweigungen verfolgen, die der Code nehmen kann.
Darum schrieb ich auch die Version, der Compiler wird zu einem bestimmten Versionsstand bestimmte Register nutzen, aber Garantie für andere Versionen gibt's dafür nicht.
Wird dagegen nur ein Flag gesetzt wird, müssen weniger Register gesichert werden, das würde man besser per Assembler machen, eben weil man dann die volle Kontrolle hat. Am Schnellsten geht ein Bit im Bereich bis I/O &h1F zu setzen. Manche Prozessoren haben GPIO's in dem Bereich, z.B. ATM644:
Code:
On Interruptx ISR Nosave
' ...
ISR:
!SBI GPIOR0, 0
Return
Meist sitzen die Ports auch in diesem Bereich. Hat man einen Pin des Ports zur freien Verfügung, so ist das die kürzest mögliche Anweisung:
Code:
ISR:
!SBI PortA, 0
Return
Alles andere geht langsamer. Wenn man keine Fließkomma-Variablen verwendet, dann sind meist R12-R15 frei. Leider gehen einige ASM-Befehle erst ab >= R16, darum wird ein Flag setzen in R12 zu so etwas:
Code:
Dim myFlag As IRam Byte At 12
' ...
ISR:
!PUSH R16
!LDI R16, 1
!MOV R12, R16
!POP R16
Return
Ein Setzen einer SRam-Variablen würde so gehen:
Code:
Dim myFlag As Byte
' ...
ISR:
!PUSH R16
!LDI R16, 1
!STS {myFlag}, R16
!POP R16
Return
Geht in der ISR gleich schnell wie mit einer IRam-Variablen, nur in der Hauptschleife ist eine Verwendung von Bascom-Befehlen in Verbindung mit IRam immer noch ein Gewinn. Ein Sichern des Statusregisters SREG ist in keinem der Beispiele notwendig, da weder LDI, MOV, PUSH, POP noch STS das SREG verändern.
Und das Decr und Incr besser ist wenn man ein Word hat ist ja auch interessant zu wissen.
Macht sich halt nur bei vielen Anweisungen oder kleinem Speicherplatz wirklich bemerkbar.
Edit:
Pwm_count kann man noch als IRam At 15 dimensionieren, dann geht's auf 65%
Lesezeichen