📄 os_create.lst
字号:
AX51 MACRO ASSEMBLER OS_CREATE 11/21/05 17:35:21 PAGE 1
MACRO ASSEMBLER AX51 V3.01
OBJECT MODULE PLACED IN .\Keil\os_create.obj
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\AX51.EXE OS\os_create.a51 MOD_MX51 SET(SMALL) DEBUG PRINT(.\Keil\os_create.lst) OB
JECT(.\Keil\os_create.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_CREATE.A51: This module contains the OS_CREATE_TASK function call.
7 ;
8 ; RTX51 TINY VERSION 2
9 ;
10 ;------------------------------------------------------------------------------
REG 11 TASKID EQU R7 ; for access in interrupt service routine
REG 12 P1 EQU R1
REG 13 P2 EQU R5
14 NAME ?RTX51_TINY_OS_CREATE
15
16 ;$include (os_defines.inc)
+1 17 ;------------------------------------------------------------------------------
+1 18 ;
+1 19 ; OS_DEFINES.INC: Defines (a) External References for OS routines
+1 20 ; (b) Bits in TaskState
+1 21 ;
+1 22 ; RTX51 TINY VERSION 2.0
+1 23 ;
+1 24 ;------------------------------------------------------------------------------
+1 25 EXTRN NUMBER (?RTX_RAMTOP) ; top of RAM for stack
+1 26 EXTRN DATA (?RTX_CURRENTTASK) ; current running task
+1 27 EXTRN ECODE (os_switch_task) ; perform a task switch
+1 28
+1 29 EXTRN HCONST (TASK_ENTRY)
+1 30 EXTRN NUMBER (?RTX_MAXTASKN) ; top of RAM for stack
+1 31
------ +1 32 ?RTX?TASKSTATE?S SEGMENT IDATA ; table of task states
------ +1 33 ?RTX?TASKSP?S SEGMENT IDATA ; table of task stack pointers
+1 34
+1 35
+1 36
+1 37 ; Internal Status Bits of Task State
+1 38 ; Bits in TaskState:
+1 39 ; TaskState.0 = Wait for Signal
+1 40 ; TaskState.1 = Wait for TimeOut
+1 41 ; TaskState.2 = Signal Flag
+1 42 ; TaskState.3 = TimeOut Flag
+1 43 ; TaskState.4 = Task Ready (Wait for Running)
+1 44 ; TaskState.5 = Task Active (enabled with os_create)
+1 45 ; TaskState.6 = Round Robin Time Out
+1 46 ; TaskState.7 = Run Flag
+1 47
+1 48 ; byte mask definitions
0001 +1 49 K_SIG EQU 1
0002 +1 50 K_TMO EQU 2
0004 +1 51 SIG_EVENT EQU 4
0008 +1 52 TMO_EVENT EQU 8
0010 +1 53 K_READY EQU 16
0020 +1 54 K_ACTIVE EQU 32
0040 +1 55 K_ROBIN EQU 64
0080 +1 56 K_IVL EQU 128 ; not a task state bit; only used in os_wait
0080 +1 57 RDY_EVENT EQU 128 ; READY status flag
AX51 MACRO ASSEMBLER OS_CREATE 11/21/05 17:35:21 PAGE 2
0080 +1 58 K_RDY EQU 128 ; READY status flag
+1 59
+1 60 ; bit position definitions
0000 +1 61 B_WAITSIG EQU 0
0001 +1 62 B_WAITTIM EQU 1
0002 +1 63 B_SIGNAL EQU 2
0003 +1 64 B_TIMEOUT EQU 3
0004 +1 65 B_READY EQU 4
0005 +1 66 B_ACTIVE EQU 5
0006 +1 67 B_ROBIN EQU 6
0007 +1 68 B_IVL EQU 7 ; not a task state bit; only used in os_wait
0007 +1 69 B_RDY EQU 7 ; READY status flag
+1 70
+1 71
00A8.7 +1 72 EA BIT 0AFH
00A8.1 +1 73 ET0 BIT 0A9H
74
75
76 PUBLIC _os_create_task
77
78
------ 79 ?RTX?CODE SEGMENT ECODE
------ 80 RSEG ?RTX?CODE
81 USING 0 ; Registerbank 0 for following code
82
83
84 ; uchar os_create_task (uchar no) {
85 ; uchar i;
86 ; uchar p1, p2;
87 ;---- Variable 'p1' assigned to Register 'R1' ----
88 ;---- Variable 'p2' assigned to Register 'R5' ----
89 ;---- Variable 'no' assigned to Register 'R7' ----
90 ;---- Variable 'i' assigned to Register 'R6' ----
91 ;
92 ; Returns 0xFF if the task number is too large
93 ; 0xFF if the task is already active
94 ; 0x00 if the task was inserted into the task list
95 ;
96 ;
97 ; if (no > MAXTASKN) return (0xff);
000000 98 _os_create_task:
000000 EF 99 MOV A,TASKID
000001 D3 100 SETB C
000002 9400 E 101 SUBB A,#?RTX_MAXTASKN
000004 4004 102 JC ?C0010
000006 103 RETUTN_FF:
000006 7FFF 104 MOV R7,#0FFH
000008 A522 105 ERET
00000A 106 ?C0010:
107 ; if (STATE[no].st & K_ACTIVE) return (0xff);
00000A 7400 F 108 MOV A,#?RTX?TASKSTATE?S+1
00000C 2F 109 ADD A,TASKID
00000D 2F 110 ADD A,TASKID
00000E F8 111 MOV R0,A
00000F E6 112 MOV A,@R0
113
114
000010 20E5F3 115 JB ACC.B_ACTIVE, RETUTN_FF
116
117 ; STATE[no].st |= K_ACTIVE + K_READY;
000013 C2AF 118 CLR EA
000015 E6 119 MOV A,@R0
000016 4430 120 ORL A,#K_ACTIVE+K_READY
000018 F6 121 MOV @R0,A
000019 D2AF 122 SETB EA
123 ;
AX51 MACRO ASSEMBLER OS_CREATE 11/21/05 17:35:21 PAGE 3
124 ; i = current;
00001B AE00 E 125 MOV R6,?RTX_CURRENTTASK
126
00001D 127 ?C0013_:
128 ; while (i < no) {
00001D EE 129 MOV A,R6
00001E C3 130 CLR C
00001F 9F 131 SUBB A,TASKID
000020 5024 132 JNC ?C0014
133 ; i++; /* 当前任务号小于创建的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -