📄 kernel.asm
字号:
_RR_routine
movff INDF0, temp2
decf FSR0L
movf INDF0, w
movff temp2 , INDF0
incf FSR0L
movwf INDF0
bcf FSR0L, 4
movff INDF0, temp2
decf FSR0L
movf INDF0, w
movff temp2, INDF0
incf FSR0L
movwf INDF0
bcf FSR0L, 5
bsf FSR0L, 4
movff INDF0, temp2
decf FSR0L
movf INDF0, w
movff temp2, INDF0
incf FSR0L
movwf INDF0
bcf FSR0L, 4
movff INDF0, temp2
decf FSR0L
movf INDF0, w
movff temp2, INDF0
incf FSR0L
movwf INDF0
bsf FSR0L, 5
bsf FSR0L, 4
bra _test
_sched_exec_tsk_init
clrf FSR0H
movlw tsk_1_state_ID-1
movwf FSR0L
_sched_exec_tsk
incf FSR0L
btfss INDF0, 5 ; skip if task READY
bra _sched_jmp_next
btfsc INDF0, 7 ; skip if task not WAITING
bra _sched_jmp_next
movlb 0
bsf INDF0, 6
movlw 0x1F
andwf INDF0, w
movwf id_tsk_run
#IFDEF PRETASKHOOK ; Hook kernel service routine
call PreTaskHook
#ENDIF
;/**********************************************************************
; * ------------------------- RESTORE CONTEXT --------------------------
; *
; * Copy the content of the context (task ram area) into Special File
; * Registers.
; *
; **********************************************************************/
_restore_ctx
GLOBAL _restore_ctx
movlb 0
bsf kernelState, 0 ; USER mode
clrf TBLPTRU
movff taskdesc_addr+1, TBLPTRH ; Load the taskdesc address
movff taskdesc_addr+0, TBLPTRL
movlw 0x06
addwf TBLPTRL, f
clrf WREG
addwfc TBLPTRH, f
restore_find_id
movf id_tsk_run, w
TBLRD *+ ; find the task id from ROM_DESC
cpfseq TABLAT
bra restore_find_next
bra restore_stack
restore_find_next
movlw 8 ; offset 8 for next task ID
addwf TBLPTRL, 1
clrf WREG
addwfc TBLPTRH, f
bra restore_find_id
restore_stack
movlw 6
subwf TBLPTRL, 1
TBLRD *+ ; Store low task adr in TOSL
movf TABLAT, w
movwf FSR0L
TBLRD *+
movf TABLAT, w
movwf FSR0H
TBLRD *+
movf TABLAT, w
movwf start_addr_L
TBLRD *+
movf TABLAT, w
movwf start_addr_H
; Read the stack start address to get the Top Of Stack
goto _check_panic
_restore_now
GLOBAL _restore_now
movff POSTDEC1, temp
movff POSTDEC1, temp
clrf STKPTR
rest_loop_stack
push
movf POSTDEC1, w
movwf TOSU
movf POSTDEC1, w
movwf TOSH
movf POSTDEC1, w
movwf TOSL
movf STKPTR, w
cpfseq temp
bra rest_loop_stack
clrf FSR0H
movlw TEMP_SIZE-1
movwf FSR0L
rest_loop_tempdata
movff POSTDEC1, POSTDEC0
movf FSR0L, 0, 0
btfss STATUS, N
bra rest_loop_tempdata
movff POSTDEC1, PRODL
movff POSTDEC1, PRODH
movff POSTDEC1, TABLAT
movff POSTDEC1, TBLPTRL
movff POSTDEC1, TBLPTRH
movff POSTDEC1, TBLPTRU
movff POSTDEC1, FSR0H
movff POSTDEC1, FSR0L
movff POSTDEC1, FSR2H
movff POSTDEC1, FSR2L
movff POSTDEC1, BSR
movff POSTDEC1, WREG
movff POSTDEC1, STATUS
bsf INTCON, 6 ; enable low interrupt
retfie
immediat_ret
clrf STKPTR
incf STKPTR
movff FSR0L, FSR1L
movff FSR0L, FSR2L
movff FSR0H, FSR1H
movff FSR0H, FSR2H
movf start_addr_L, w
movwf TOSL
movf start_addr_H, w
movwf TOSH
clrf TOSU
bsf INTCON, 6 ; enable low interrupt
retfie
_sched_jmp_next
movlw tsk_16_state_ID ; Look up the next task up to the end
subwf FSR0L, w
bnz _sched_exec_tsk
movff FSR1H_MAIN, FSR1H
movff FSR1L_MAIN, FSR1L
_while
movlb 0
bsf INTCON, 6 ; General Interrupt Enable ON
clrf STKPTR
bra _while ; No task in RUNNING state
;/**********************************************************************
; * ----------------------- CHECK STACK OVERFLOW -----------------------
; *
; **********************************************************************/
_check_panic
movff FSR0L, stack_low
movff FSR0H, stack_high
movff POSTDEC0, WREG
movlw 0xad
movff POSTDEC0, FSR1L
cpfseq FSR1L
goto _kernel_panic_trashed
movlw 0xde
movff POSTDEC0, FSR1L
cpfseq FSR1L
goto _kernel_panic_trashed
clrf TBLPTRU
movff taskdesc_addr+1, TBLPTRH ; Load the taskdesc address
movff taskdesc_addr+0, TBLPTRL
movlw 0x06
addwf TBLPTRL, f
clrf WREG
addwfc TBLPTRH, f
movlb 0
_check_panic_find
movf id_tsk_run, w ; look for the task area in ROM_DESC
TBLRD *+
cpfseq TABLAT
bra _check_panic_next ; continu to search
bra _check_panic_read ; task ID found
_check_panic_next
movlw 8 ; offset 8 for next task ID
addwf TBLPTRL, 1
clrf WREG
addwfc TBLPTRH, f
bra _check_panic_find
_check_panic_read
movff stack_low, FSR0L
movff stack_high, FSR0H
TBLRD *+
movf TABLAT, w
decf WREG
decf WREG
addwf FSR0L, f
clrf WREG
addwfc FSR0H, f
TBLRD *+
; movf TABLAT, w
; addwf FSR0H, f
movff POSTINC0, FSR1L
movlw 0xde
cpfseq FSR1L
goto _kernel_panic_trash
movff POSTINC0, FSR1L
movlw 0xad
cpfseq FSR1L
goto _kernel_panic_trash
movff stack_low, FSR0L
movff stack_high, FSR0H
movff POSTINC0, FSR1L
movff POSTINC0, FSR1H
movf FSR1L, w
btfss STATUS, Z
bra _restore_now
movf FSR1H, w
btfsc STATUS, Z
bra immediat_ret
bra _restore_now
_kernel_panic_trashed
clrf FSR0H
movlw tsk_1_state_ID-1
movwf FSR0L
_kernel_panic_off
incf FSR0L
movlw 0x1F
andwf INDF0, w
cpfseq id_tsk_run
bra _kernel_panic_off
bcf INDF0, 5 ; task is SUSPENDED now
bcf INDF0, 6
bcf INDF0, 7
movff kernelPanic, WREG
andlw 0xF0
addwf id_tsk_run, w
movff WREG, kernelPanic
bra _sched
_kernel_panic_trash
clrf FSR0H
movlw tsk_1_state_ID-1
movwf FSR0L
_kernel_panic_off2
incf FSR0L
movlw 0x1F
andwf INDF0, w
cpfseq id_tsk_run
bra _kernel_panic_off2
bcf INDF0, 5 ; task is SUSPENDED now
bcf INDF0, 6
bcf INDF0, 7
movff kernelPanic, WREG
swapf WREG, 0
andlw 0xF0
addwf id_tsk_run, w
swapf WREG, 0
movff WREG, kernelPanic
bra _sched
;/**********************************************************************
; * ----------------------- FOR BASIC TASK ONLY ------------------------
; *
; * After terminating a task, we loose the start adress of the task,
; * first located in the first place
; * of the stack.
; *
; **********************************************************************/
_restore_start_adr
GLOBAL _restore_start_adr
clrf TBLPTRU
movff taskdesc_addr+1, TBLPTRH ; Load the taskdesc address
movlw 0x06
addwf TBLPTRL, f
clrf WREG
addwfc TBLPTRH, f
movlb 0
_restore_find
movf id_tsk_run, w ; look for the task area in ROM_DESC
TBLRD *-
cpfseq TABLAT
bra _restore_next ; continu to search
bra _restore_read ; task ID found
_restore_next
movlw 8 ; offset 8 for next task ID
addwf TBLPTRL, 1
clrf WREG
addwfc TBLPTRH, f
bra _restore_find
_restore_read
TBLRD *- ; Access to the start adress
TBLRD *-
TBLRD *-
TBLRD *-
TBLRD *+
movf TABLAT, w
movwf FSR0L
TBLRD *+
movf TABLAT, w
movwf FSR0H
clrf WREG
movwf INDF0
incf FSR0L, 1
movwf INDF0 ; Set the value into STKPTR
goto _sched ; Determine the next RUNNING task
END ; Directive 'end of program'
;/* End of File : kernel.asm */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -