|
Вот попробую слету налабать:
cblock 0x00
IntWSave,IntStatusSave,IntFSRSave,IntPCLathSave,ContextSize
endccblock RAMSTART
Context1:ContextSize, Context2:ContextSize
[.остальные переменные.]
endc
ORG 004H
INT
MOVWF Context1+IntWSave
SWAPF Context1+IntWSave,F ;TO SAVE Z WHEN POP'S
SWAPF STATUS,W
BCF _RP0
MOVWF Context1+IntStatusSave
MOVFW FSR
MOVWF Context1+IntFSRSave
MOVFW PCLATH
MOVWF Context1+IntPCLathSave;тут проверка на источник прерывания.
btfsc _INTE ; Допустим, это источник низкоприоритетного прерывания
btfss _INTF
goto HighPriority
LowPriority
; copy context to Context2
MOVFW Context1+IntWSave
MOVWF Context2+IntWSave
MOVFW Context1+IntStatusSave
MOVWF Context2+IntStatusSave
MOVFW Context1+IntFSRSave
MOVWF Context2+IntFSRSave
MOVFW Context1+IntPCLathSave
MOVWF Context2+IntPCLathSave
BCF _INTE ; запретить повторный вызов низкоприоритетного обработчика
BSF _GIE ; разрешить остальные прерывания[ Здесь идет обработчик этого низкоприоритетного прерывания ]
BCF _GIE
BSF _INTE ; разрешить повторный вызов низкоприоритетного обработчикаLowIntRet
; restore context from Context2
bcf _RP0
MOVFW Context2+IntFSRSave
MOVWF FSR
MOVFW Context2+IntPCLathSave
MOVWF PCLATH
SWAPF Context2+IntStatusSave,W
MOVWF STATUS
SWAPF Context2+IntWSave,W
RETFIE
HighPriority[ Здесь идет обработчик высокоприоритетных прерываний ]
HighIntRet
; restore context from Context1
bcf _RP0
MOVFW Context1+IntFSRSave
MOVWF FSR
MOVFW Context1+IntPCLathSave
MOVWF PCLATH
SWAPF Context1+IntStatusSave,W
MOVWF STATUS
SWAPF Context1+IntWSave,W
RETFIE
E-mail: info@telesys.ru