Manche Anwendungen benötigen mehr als 2 Prioritätslevel. In solchen Fällen kann eine relativ einfache Routine geschrieben werden um einen dritten Prioritätslevel zu simulieren. Zuerst müssen Interrupts, die eine höhere Priorität als 1 haben sollen im Interrupt Priority Register auf 1 gesetzt werden. Die Interrupt Service Routine für Priorität 1, die durch Interrupts der Priorität 2 unterbrochen werden kann muß folgenden Code enthalten:
PUSH IE
MOV IE,#MASK
CALL LABEL
***************************
(Ausführung der Service Routine)
***************************
POP IE
RET
LABEL: RETI
Sobald ein Interrupt der Priorität 1 auftritt werden alle Interrupts der Priorität 0 und 1 disabled. Der CALL to LABEL Befehl bewirkt die Ausführung des RETI Befehls und damit ein Löschen des Interrupt in Progress Flip Flop der Priorität 1. Zu diesem Zeitpunkt kann jeder Interrupt bedient werden, aber es sind nur Interrupts der Priorität 2 enabled
POPing IE stellt das original Enable Byte wieder her. Danach wird ein normaler RET Befehl (nicht RETI) verwendet um die Interrupt Service Routine abzuschließen. Diese zusätzliche Software verlängert die ISR von Interrupts der Priorität 1 um 10s.
|