⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kernel.asm

📁 不错的程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:

_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 + -