📄 k51a1234.asm
字号:
; 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 + -