[an error occurred while processing this directive] [an error occurred while processing this directive]
Насчет векторов
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено AK 08 сентября 2001 г. 12:22
В ответ на: Я давно предлагал сделать сравнительную таблицу(+) отправлено L. A. 08 сентября 2001 г. 09:47

К сожалению, не могу согласиться. Я типично обрабатываю 3-4 прерывания в ПИКах, и гемморой связанный с ветвлением на нужную подпрограмму меня возмущает.
Мало того что ПИК не умеет быстро сохранять/восстанавливать контекст (обычно нужно сохранить W и STATUS, часто требуется FSR и пр), вдобавок это приходится делать при _каждом_ прерывании, даже если я, скажем, FSR в конкретном обработчике не порчу (приходится - т.к. если не делать, то геммороя еще больше). Вот пример моей проги входа-выхода в/из прерывания, ведь сердце кровью обливается такое угробище писать:


; *******************************
; Main interrupt routine
; *******************************
; ************
; Save context
; ************
org 4 ; interrupt vector
bcf STATUS,7 ; clear
btfsc STATUS,RP0 ; bank 0 ?
bsf STATUS,7 ; no, temp save bit
bcf STATUS,RP0 ; set bank 0
movwf CTXW ; save W
swapf STATUS,W ; save status
movwf CTXSTAT ; store STATUS
movf FSR,W ; save FSR
movwf CTXFSR ;
movf PCLATH,W ; save PCLATH
movwf CTXPCLA ;
clrf PCLATH ; page 0

; ****************
; Which interrupt?
; ****************
L_INT_EXIT ; check again before exit
btfsc PIR1,CCP1IF ; CCP?
goto L_INT_CCP ;
btfsc PIR1,SSPIF ; I2C byte?
goto L_INT_I2C ;
btfsc PIR1,RCIF ; my?
goto L_INT_CBUS ;
btfsc INTCON,T0IF ; timer tick?
goto L_INT_TMR0 ;

; ***************
; Restore context
; ***************
movf CTXPCLA,W ; restore PCLATH
movwf PCLATH ;
movf CTXFSR,W ; restore FSR
movwf FSR ;
swapf CTXSTAT,W ; restore STATUS
movwf STATUS ;
swapf CTXW ; restore W
swapf CTXW,W ; use SWAP to keep STATUS inaffected
btfsc STATUS,7 ; it was bank 1 ?
bsf STATUS,RP0 ; yes
bcf STATUS,7 ; clear tmp bit
retfie ; end interrupt



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru