📄 os_delete.lst
字号:
AX51 MACRO ASSEMBLER OS_DELETE 11/21/05 17:35:21 PAGE 1
MACRO ASSEMBLER AX51 V3.01
OBJECT MODULE PLACED IN .\Keil\os_delete.obj
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\AX51.EXE OS\os_delete.a51 MOD_MX51 SET(SMALL) DEBUG PRINT(.\Keil\os_delete.lst) OB
JECT(.\Keil\os_delete.obj) EP
LOC OBJ LINE SOURCE
1 ;------------------------------------------------------------------------------
2 ; This file is part of the 'RTX-51 tiny' Real-Time Operating System Package
3 ; Copyright KEIL ELEKTRONIK GmbH and Keil Software, Inc. 1991 - 2002
4 ;------------------------------------------------------------------------------
5 ;
6 ; OS_DELETE.A51: This module contains the OS_DELETE_TASK function
7 ;
8 ; RTX51 TINY VERSION 2
9 ;
10 ;------------------------------------------------------------------------------
11
12 NAME ?RTX51_TINY_OS_DELETE
13
14 ;$include (os_defines.inc)
+1 15 ;------------------------------------------------------------------------------
+1 16 ;
+1 17 ; OS_DEFINES.INC: Defines (a) External References for OS routines
+1 18 ; (b) Bits in TaskState
+1 19 ;
+1 20 ; RTX51 TINY VERSION 2.0
+1 21 ;
+1 22 ;------------------------------------------------------------------------------
+1 23 EXTRN NUMBER (?RTX_RAMTOP) ; top of RAM for stack
+1 24 EXTRN DATA (?RTX_CURRENTTASK) ; current running task
+1 25 EXTRN ECODE (os_switch_task) ; perform a task switch
+1 26
+1 27 EXTRN HCONST (TASK_ENTRY)
+1 28 EXTRN NUMBER (?RTX_MAXTASKN) ; top of RAM for stack
+1 29
------ +1 30 ?RTX?TASKSTATE?S SEGMENT IDATA ; table of task states
------ +1 31 ?RTX?TASKSP?S SEGMENT IDATA ; table of task stack pointers
+1 32
+1 33
+1 34
+1 35 ; Internal Status Bits of Task State
+1 36 ; Bits in TaskState:
+1 37 ; TaskState.0 = Wait for Signal
+1 38 ; TaskState.1 = Wait for TimeOut
+1 39 ; TaskState.2 = Signal Flag
+1 40 ; TaskState.3 = TimeOut Flag
+1 41 ; TaskState.4 = Task Ready (Wait for Running)
+1 42 ; TaskState.5 = Task Active (enabled with os_create)
+1 43 ; TaskState.6 = Round Robin Time Out
+1 44 ; TaskState.7 = Run Flag
+1 45
+1 46 ; byte mask definitions
0001 +1 47 K_SIG EQU 1
0002 +1 48 K_TMO EQU 2
0004 +1 49 SIG_EVENT EQU 4
0008 +1 50 TMO_EVENT EQU 8
0010 +1 51 K_READY EQU 16
0020 +1 52 K_ACTIVE EQU 32
0040 +1 53 K_ROBIN EQU 64
0080 +1 54 K_IVL EQU 128 ; not a task state bit; only used in os_wait
0080 +1 55 RDY_EVENT EQU 128 ; READY status flag
0080 +1 56 K_RDY EQU 128 ; READY status flag
+1 57
AX51 MACRO ASSEMBLER OS_DELETE 11/21/05 17:35:21 PAGE 2
+1 58 ; bit position definitions
0000 +1 59 B_WAITSIG EQU 0
0001 +1 60 B_WAITTIM EQU 1
0002 +1 61 B_SIGNAL EQU 2
0003 +1 62 B_TIMEOUT EQU 3
0004 +1 63 B_READY EQU 4
0005 +1 64 B_ACTIVE EQU 5
0006 +1 65 B_ROBIN EQU 6
0007 +1 66 B_IVL EQU 7 ; not a task state bit; only used in os_wait
0007 +1 67 B_RDY EQU 7 ; READY status flag
+1 68
+1 69
00A8.7 +1 70 EA BIT 0AFH
00A8.1 +1 71 ET0 BIT 0A9H
72
73
74
75 PUBLIC _os_delete_task
76
77
------ 78 ?RTX?CODE SEGMENT ECODE
------ 79 RSEG ?RTX?CODE
80 USING 0 ; Registerbank 0 for following code
81
82 ; uchar os_delete_task (uchar no) {
83 ; uchar i;
84 ; uchar last, first, check;
85 ;
000000 86 _os_delete_task:
87 ;---- Variable 'first' assigned to Register 'R1' ----
88 ;---- Variable 'last' assigned to Register 'R5' ----
89 ;---- Variable 'check' assigned to Register 'R4' ----
90 ;---- Variable 'no' assigned to Register 'R7' ----
91 ; if (no > MAXTASKN) return (0xff);
000000 EF 92 MOV A,R7
000001 D3 93 SETB C
000002 9400 E 94 SUBB A,#?RTX_MAXTASKN
000004 4004 95 JC ?C0030
000006 7FFF 96 ?C0032: MOV R7,#0FFH
000008 A522 97 ERET
00000A 98 ?C0030:
99 ; if (!(STATE[no].st & K_ACTIVE)) return (0xff);
100
00000A EF 101 MOV A,R7
00000B 23 102 RL A
00000C 2400 F 103 ADD A,#?RTX?TASKSTATE?S+1
00000E F8 104 MOV R0,A
00000F E6 105 MOV A,@R0
000010 30E5F3 106 JNB ACC.B_ACTIVE,?C0032
107 ; STATE[no].st &= ~(K_ACTIVE | K_READY | K_SIG | K_TMO);
000013 C2AF 108 CLR EA
000015 E6 109 MOV A,@R0
000016 54CC 110 ANL A,#NOT (K_ACTIVE+K_READY+K_SIG+K_TMO)
000018 F6 111 MOV @R0,A
000019 D2AF 112 SETB EA
113 ; if (current == no) {
00001B E500 E 114 MOV A,?RTX_CURRENTTASK
00001D B5070C 115 CJNE A,AR7,?C0033
116 ; SP = STKP[no];
000020 7400 F 117 MOV A,#?RTX?TASKSP?S
000022 2F 118 ADD A,R7
000023 F8 119 MOV R0,A
000024 E6 120 MOV A,@R0
121
000025 F581 122 MOV SP,A
123 ; switchnow ();
AX51 MACRO ASSEMBLER OS_DELETE 11/21/05 17:35:21 PAGE 3
000027 124 OS_delete_task_exit1:
000027 A502000000 E 125 EJMP OS_SWITCH_TASK
126 ; }
127
00002C 128 ?C0033:
129 ; if (current < no) {
00002C 502F 130 JNC ?C0034
131 ; last = (no == MAXTASKN) ? STACKTOP : STKP[no+1];
00002E 7400 F 132 MOV A,#?RTX?TASKSP?S+1
000030 2F 133 ADD A,R7
000031 F8 134 MOV R0,A
000032 E6 135 MOV A,@R0
000033 BF0002 136 CJNE R7,#?RTX_MAXTASKN,?C0035
000036 7400 E 137 MOV A,#?RTX_RAMTOP
000038 138 ?C0035:
000038 FD 139 MOV R5,A
140 ; first = STKP[no];
000039 18 141 DEC R0
00003A E6 142 MOV A,@R0
00003B F9 143 MOV R1,A
00003C 144 ?C0039:
145 ; do {
146 ; check = STKP[no];
00003C 7400 F 147 MOV A,#?RTX?TASKSP?S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -