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

📄 k51a1234.asm

📁 同事写的一个内核
💻 ASM
📖 第 1 页 / 共 3 页
字号:
; k51a1234.asm
; by geweidong, 2005-11-27
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; iiiiiiiiiiiiiii                    imports                 iiiiiiiiiiiiiiiiiii
;-------------------------------------------------------------------------------
extrn code (task1, task2, task3, task4)

;-------------------------------------------------------------------------------
; eeeeeeeeeeeeeee                    exports                 eeeeeeeeeeeeeeeeeee
;-------------------------------------------------------------------------------
;--------------- functions -------------
public k51_init

public task1_init
public task2_init
public task3_init
public task4_init

public k51_int_exit
public _k51_sleep
public k51_tick

public k51_idle_task

public _k51_signal_init
public _k51_signal_send
public _k51_signal_wait

IF MUTEX_ENABLE <> 0
public _k51_mutex_init
public _k51_mutex_release
public _k51_mutex_wait
ENDIF

;--------------- variables -------------
public k51_int_nest
public sp_task1, sp_task2, sp_task3, sp_task4

;-------------------------------------------------------------------------------
; stack frame for task switch (low mem) --> return address (lsb)
;                                           return address (msb)
;                                           psw
;                                           acc
;                                           b
;                                           dpl
; Top of stack (high mem)     ------------> dph
;-------------------------------------------------------------------------------

seg_k51_data    segment data
seg_k51_bits    segment bit

seg_k51_core    segment code

;-------------------------------------------------------------------------------
rseg seg_k51_data

    task1_timer:    ds  1
    task2_timer:    ds  1
    task3_timer:    ds  1
    task4_timer:    ds  1

    sp_task1:       ds  1
    sp_task2:       ds  1
    sp_task3:       ds  1
    sp_task4:       ds  1

    k51_int_nest:   ds  1

;-------------------------------------------------------------------------------
rseg seg_k51_bits

    slot1_available:    dbit    1
    slot2_available:    dbit    1
    slot3_available:    dbit    1
    slot4_available:    dbit    1

    task1_ready:        dbit    1
    task2_ready:        dbit    1
    task3_ready:        dbit    1
    task4_ready:        dbit    1

    task1_running:      dbit    1
    task2_running:      dbit    1
    task3_running:      dbit    1
    task4_running:      dbit    1

;-------------------------------------------------------------------------------
; ccccccccccccccccccccc        constants                cccccccccccccccccccccccc
;-------------------------------------------------------------------------------
no_error                equ     0
error_prio_used         equ     0x1

;-------------------------------------------------------------------------------
rseg seg_k51_core
;-------------------------------------------------------------------------------
; void k51_init()
;-------------------------------------------------------------------------------
k51_init:
    clr     a
    mov     task1_timer,    a                   ; timers set to 0
    mov     task2_timer,    a
    mov     task3_timer,    a
    mov     task4_timer,    a

    mov     k51_int_nest,   a                   ; init to 0

    setb    slot1_available                     ; all available
    setb    slot2_available
    setb    slot3_available
    setb    slot4_available

    clr     task1_ready                         ; none ready
    clr     task2_ready
    clr     task3_ready
    clr     task4_ready

    clr     task1_running                       ; none running
    clr     task2_running
    clr     task3_running
    clr     task4_running

IF PRIO_MAIN = 1
    clr     slot1_available                     ; slot1 used
    setb    task1_ready                         ; task1 ready
    setb    task1_running                       ; task1 running
    mov     psw,            #0                  ; register bank 0
ENDIF

IF PRIO_MAIN = 2
    clr     slot2_available                     ; slot2 used
    setb    task2_ready                         ; task2 ready
    setb    task2_running                       ; task2 running
    mov     psw,            #8                  ; register bank 1
ENDIF

IF PRIO_MAIN = 3
    clr     slot3_available                     ; slot3 used
    setb    task3_ready                         ; task3 ready
    setb    task3_running                       ; task3 running
    mov     psw,            #10h                ; register bank 2
ENDIF

IF PRIO_MAIN = 4
    clr     slot4_available                     ; slot4 used
    setb    task4_ready                         ; task4 ready
    setb    task4_running                       ; task4 running
    mov     psw,            #18h                ; register bank 3
ENDIF

    ret

;-------------------------------------------------------------------------------
; unsigned char task1_init();
; globals:
;     slot1_available - if slot1_available == 0 this function fail, otherwise
;                       this function succeed and slot1_available clear.
;     task1_ready     - if succeeded, task1_ready will set.
;     psw             - select register bank 0
;-------------------------------------------------------------------------------
task1_init:
    jbc     slot1_available,    task1_init_100
task1_init_prio_used:
    mov     r7,     #error_prio_used            ; error code return
    ret

task1_init_100:
    mov     r1,     sp_task1                    ; begin...init stack of task1
    inc     r1                                  ; full stack, inc then write

    mov     a,      #low  task1
    mov     @r1,    a
    inc     r1
    mov     a,      #high task1
    mov     @r1,    a                           ; pc  = start address of task1

    inc     r1
    mov     @r1,    #0                          ; psw = 0...register bank 0
    inc     r1
    clr     a
    mov     @r1,    a                           ; acc = 0
    inc     r1
    mov     @r1,    a                           ; b   = 0
    inc     r1
    mov     @r1,    a                           ; dpl = 0
    inc     r1
    mov     @r1,    a                           ; dph = 0

    mov     sp_task1,       r1                  ; set stack-pointer of task1

    setb    task1_ready                         ; task1 ready
    mov     r7,     #no_error                   ; error code return -- no error
    ret


;-------------------------------------------------------------------------------
; unsigned char task2_init();
; globals:
;     slot2_available - if slot2_available == 0 this function fail, otherwise
;                       this function succeed and slot2_available clear.
;     task2_ready     - if succeeded, task2_ready will set.
;     psw             - select register bank 1
;-------------------------------------------------------------------------------
task2_init:
    jbc     slot2_available,    task2_init_100
task2_init_prio_used:
    mov     r7,     #error_prio_used            ; error code return
    ret

task2_init_100:
    mov     r1,     sp_task2                    ; begin...init stack of task2
    inc     r1

    mov     a,      #low  task2
    mov     @r1,    a
    inc     r1
    mov     a,      #high task2
    mov     @r1,    a                           ; pc  = start address of task2

    inc     r1
    mov     @r1,    #8                          ; psw = 8...register bank 1
    inc     r1
    clr     a
    mov     @r1,    a                           ; acc = 0
    inc     r1
    mov     @r1,    a                           ; b   = 0
    inc     r1
    mov     @r1,    a                           ; dpl = 0
    inc     r1
    mov     @r1,    a                           ; dph = 0

    mov     sp_task2,       r1                  ; set stack-pointer of task2

    setb    task2_ready                         ; task2 ready
    mov     r7,     #no_error                   ; error code return -- no error
    ret

;-------------------------------------------------------------------------------
; unsigned char task3_init();
; globals:
;     slot3_available - if slot3_available == 0 this function fail, otherwise
;                       this function succeed and slot3_available clear.
;     task3_ready     - if succeeded, task3_ready will set.
;     psw             - select register bank 2
;-------------------------------------------------------------------------------
task3_init:
    jbc     slot3_available,    task3_init_100
task3_init_prio_used:
    mov     r7,     #error_prio_used            ; error code return
    ret

task3_init_100:
    mov     r1,     sp_task3                    ; begin...init stack of task3
    inc     r1

    mov     a,      #low  task3
    mov     @r1,    a
    inc     r1
    mov     a,      #high task3
    mov     @r1,    a                           ; pc  = start address of task3

    inc     r1
    mov     @r1,    #10h                        ; psw = 10h...register bank 2
    inc     r1
    clr     a
    mov     @r1,    a                           ; acc = 0
    inc     r1
    mov     @r1,    a                           ; b   = 0
    inc     r1
    mov     @r1,    a                           ; dpl = 0
    inc     r1
    mov     @r1,    a                           ; dph = 0

    mov     sp_task3,       r1                  ; set stack-pointer of task3

    setb    task3_ready                         ; task3 ready
    mov     r7,     #no_error                   ; error code return -- no error
    ret

;-------------------------------------------------------------------------------
; unsigned char task4_init();
; globals:
;     slot4_available - if slot4_available == 0 this function fail, otherwise
;                       this function succeed and slot4_available clear.
;     task4_ready     - if succeeded, task4_ready will set.
;     psw             - select register bank 3
;-------------------------------------------------------------------------------
task4_init:
    jbc     slot4_available,    task4_init_100
task4_init_prio_used:
    mov     r7,     #error_prio_used            ; error code return
    ret

task4_init_100:
    mov     r1,     sp_task4                    ; begin...init stack of task4
    inc     r1

    mov     a,      #low  task4
    mov     @r1,    a
    inc     r1
    mov     a,      #high task4
    mov     @r1,    a                           ; pc  = start address of task4

    inc     r1
    mov     @r1,    #18h                        ; psw = 18h - register bank 3
    inc     r1
    clr     a
    mov     @r1,    a                           ; acc = 0
    inc     r1
    mov     @r1,    a                           ; b   = 0
    inc     r1
    mov     @r1,    a                           ; dpl = 0
    inc     r1
    mov     @r1,    a                           ; dph = 0

    mov     sp_task4,       r1                  ; set stack-pointer of task4

    setb    task4_ready                         ; task4 ready
    mov     r7,     #no_error                   ; error code return -- no error
    ret

;-------------------------------------------------------------------------------
; void k51_int_exit()
; Called by user defined interrupt service routines
; This function can make a task to running state, and make another from running
;     state to ready state (a running task is alwayls a ready task).
; This function never make a task from idle to ready.
; If no task is ready at this point, no task is running.
;-------------------------------------------------------------------------------
k51_int_exit:
    clr     ea
    dec     k51_int_nest
    mov     a,      k51_int_nest
    jnz     k51_int_no_sw

    jnb     task1_ready,    k51_int_chk_task2
    ljmp    k51_int_active_task1
k51_int_chk_task2:
    jnb     task2_ready,    k51_int_chk_task3
    ljmp    k51_int_active_task2
k51_int_chk_task3:
    jnb     task3_ready,    k51_int_chk_task4
    ljmp    k51_int_active_task3
k51_int_chk_task4:
    jnb     task4_ready,    k51_int_go_idle

k51_int_active_task4:
    jb      task4_running,  k51_int_no_sw
    setb    task4_running

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -