📄 multitask.lst
字号:
A51 MACRO ASSEMBLER MULTITASK 04/04/2009 22:01:21 PAGE 1
MACRO ASSEMBLER A51 V1.12
NO OBJECT MODULE REQUESTED
ASSEMBLER INVOKED BY: C:\PROGRA~1\MANLEY\MEDWINV3\A51.EXE MULTITASK.INC DB
LOC OBJ LINE SOURCE
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;Multi Tast part
3 ;; Task structure(use xdata=external memory):
4 ;; Register size ( 16Byte ): PCL,PCH,SP,PSW,ACC,B,DPL,DPH,RO,R1,R2,R3,R4,R5,R6,R7
5 ;; Task stack size ( 8Byte ): stack0~stack n
6 ;;
7 ;; Task All buffer size : (Register size + Task stack size) * DEFINE_TASK_MAX
8 ;; Note: If function end by "_" means use in internal only
9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 ;Initial task all xdata
0000 11 TASK_INITIAL:
0000 900147 12 MOV DPTR,#TASK_FINISHED_
13 MOV DEFINE_TASK_RET_ADDRESS_H,DPH
*** ERROR #7 IN 13 (MULTITASK.INC, LINE 13): UNDEFINED SYMBOL
14 MOV DEFINE_TASK_RET_ADDRESS_L,DPL
*** ERROR #7 IN 14 (MULTITASK.INC, LINE 14): UNDEFINED SYMBOL
15
0009 E4 16 CLR A
17 MOV VAR_TASK_CURRENT_ID,A
*** ERROR #7 IN 17 (MULTITASK.INC, LINE 17): UNDEFINED SYMBOL
18
19 MOV DPTR,#DEFINE_TASK_XDATA_ADDRESS
*** ERROR #7 IN 19 (MULTITASK.INC, LINE 19): UNDEFINED SYMBOL
20 MOV R0,#DEFINE_TASK_XDATA_SIZE
*** ERROR #7 IN 20 (MULTITASK.INC, LINE 20): UNDEFINED SYMBOL
21
0011 22 TASK_INITIAL_DATA_LOOP:
0011 F0 23 MOVX @DPTR,A
0012 A3 24 INC DPTR
0013 D8FC 25 DJNZ R0,TASK_INITIAL_DATA_LOOP
0015 22 26 RET
27
28 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29 ;Create a task and initial xdata,(i.e. PC=function start address,SP=Initial Define)
30 ;Note: The task stack is very small, the sub function don't use too many nesting ( not out of 3 max )
31 ;Because call sub function need PUSH PC to stack and return need POP PC to stack but is automatic by MCU
32 ;Input : R0 - Task ID, DPTR - Task function entry address
33 ;Output : xdata
0016 34 TASK_CREATE_:
35 ;RET if R0 > DEFINE_TASK_MAX
0016 D3 36 SETB C
0017 E8 37 MOV A,R0
0018 04 38 INC A
39 SUBB A,#DEFINE_TASK_MAX
*** ERROR #7 IN 39 (MULTITASK.INC, LINE 39): UNDEFINED SYMBOL
40
001B 4003 41 JC TASK_CREATE_START
001D 02004C 42 LJMP TASK_CREATE_START_RETURN
43
0020 44 TASK_CREATE_START:
45
46 ;offset
0020 E8 47 MOV A,R0
48 MOV B,#DEFINE_TASK_XDATA_BLOCK
*** ERROR #7 IN 48 (MULTITASK.INC, LINE 48): UNDEFINED SYMBOL
0024 A4 49 MUL AB
50
0025 F8 51 MOV R0,A
A51 MACRO ASSEMBLER MULTITASK 04/04/2009 22:01:21 PAGE 2
0026 A982 52 MOV R1,DPL ;Task function address low 8bit
0028 AA83 53 MOV R2,DPH ;Task function address high 8bit
54
55 MOV DPTR,#DEFINE_TASK_XDATA_ADDRESS
*** ERROR #7 IN 55 (MULTITASK.INC, LINE 55): UNDEFINED SYMBOL
56
57 ;+offset
002D C3 58 CLR C
59
002E E582 60 MOV A,DPL
0030 38 61 ADDC A,R0
0031 F582 62 MOV DPL,A
63
0033 E583 64 MOV A,DPH
0035 3400 65 ADDC A,#00H
0037 F583 66 MOV DPH,A
67
68 ;PCL
0039 E9 69 MOV A,R1
003A F0 70 MOVX @DPTR,A
71
72 ;PCH
003B A3 73 INC DPTR
003C EA 74 MOV A,R2
003D F0 75 MOVX @DPTR,A
76
77 ;SP
003E A3 78 INC DPTR
79 MOV A,#DEFINE_SP_START_ADDRESS
*** ERROR #7 IN 79 (MULTITASK.INC, LINE 79): UNDEFINED SYMBOL
0041 F0 80 MOVX @DPTR,A
81
82 MOV R0,#DEFINE_TASK_XDATA_BLOCK
*** ERROR #7 IN 82 (MULTITASK.INC, LINE 82): UNDEFINED SYMBOL
0044 18 83 DEC R0
0045 18 84 DEC R0
0046 18 85 DEC R0
86
0047 E4 87 CLR A
0048 88 TASK_CREATE_CLEAR__DATA_LOOP:
0048 A3 89 INC DPTR
0049 F0 90 MOVX @DPTR,A
91 ;Next
004A D8FC 92 DJNZ R0,TASK_CREATE_CLEAR__DATA_LOOP
93
004C 94 TASK_CREATE_START_RETURN:
004C 22 95 RET
96
97 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
98 ;Suspend a task
004D 99 TASK_SUSPEND:
100 ;reserve
004D 22 101 RET
102
103 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104 ;Resume a task
004E 105 TASK_RESUME:
106 ;reserve
004E 22 107 RET
108
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110 ;Task switch
004F 111 TASK_SWITCH:
112 ;Disable Timer0 interrupt
113 ;Note: In Interrupt period don't changed Timer counter If close Timer0
114 ;else Timer counter still be changed but the programs code run time is not same
A51 MACRO ASSEMBLER MULTITASK 04/04/2009 22:01:21 PAGE 3
004F C28C 115 CLR TR0
0051 C2A9 116 CLR ET0
117
118 ;Save current task data
119 ;Note: PUSH,POP,CALL,RET,RETI instruction effect SP pointer
120
121 ;PC counter
122 ;Note: here must POP PC counter
123 ;because call sub function the SP be changed so PC counter difficult Access
124 POP VAR_TASK_BUFFER_PCH
*** ERROR #7 IN 124 (MULTITASK.INC, LINE 124): UNDEFINED SYMBOL
*** ERROR #18 IN 124 (MULTITASK.INC, LINE 124): DATA-ADDRESS EXPECTED
125 POP VAR_TASK_BUFFER_PCL
*** ERROR #7 IN 125 (MULTITASK.INC, LINE 125): UNDEFINED SYMBOL
*** ERROR #18 IN 125 (MULTITASK.INC, LINE 125): DATA-ADDRESS EXPECTED
126
127 ;SP
128 MOV VAR_TASK_BUFFER_SP, SP
*** ERROR #7 IN 128 (MULTITASK.INC, LINE 128): UNDEFINED SYMBOL
129
130 ;PSW,A,B
131 MOV VAR_TASK_BUFFER_PSW, PSW
*** ERROR #7 IN 131 (MULTITASK.INC, LINE 131): UNDEFINED SYMBOL
132 MOV VAR_TASK_BUFFER_ACC, ACC
*** ERROR #7 IN 132 (MULTITASK.INC, LINE 132): UNDEFINED SYMBOL
133 MOV VAR_TASK_BUFFER_B, B
*** ERROR #7 IN 133 (MULTITASK.INC, LINE 133): UNDEFINED SYMBOL
134
135 ;Data pointer
136 MOV VAR_TASK_BUFFER_DPL, DPL
*** ERROR #7 IN 136 (MULTITASK.INC, LINE 136): UNDEFINED SYMBOL
137 MOV VAR_TASK_BUFFER_DPH, DPH
*** ERROR #7 IN 137 (MULTITASK.INC, LINE 137): UNDEFINED SYMBOL
138
139 ;R0~R7
140 MOV VAR_TASK_BUFFER_R0, R0
*** ERROR #7 IN 140 (MULTITASK.INC, LINE 140): UNDEFINED SYMBOL
141 MOV VAR_TASK_BUFFER_R1, R1
*** ERROR #7 IN 141 (MULTITASK.INC, LINE 141): UNDEFINED SYMBOL
142 MOV VAR_TASK_BUFFER_R2, R2
*** ERROR #7 IN 142 (MULTITASK.INC, LINE 142): UNDEFINED SYMBOL
143 MOV VAR_TASK_BUFFER_R3, R3
*** ERROR #7 IN 143 (MULTITASK.INC, LINE 143): UNDEFINED SYMBOL
144 MOV VAR_TASK_BUFFER_R4, R4
*** ERROR #7 IN 144 (MULTITASK.INC, LINE 144): UNDEFINED SYMBOL
145 MOV VAR_TASK_BUFFER_R5, R5
*** ERROR #7 IN 145 (MULTITASK.INC, LINE 145): UNDEFINED SYMBOL
146 MOV VAR_TASK_BUFFER_R6, R6
*** ERROR #7 IN 146 (MULTITASK.INC, LINE 146): UNDEFINED SYMBOL
147 MOV VAR_TASK_BUFFER_R7, R7
*** ERROR #7 IN 147 (MULTITASK.INC, LINE 147): UNDEFINED SYMBOL
148
149 ;Stack
150 MOV R0,#DEFINE_SP_START_ADDRESS ;Soruce address
*** ERROR #7 IN 150 (MULTITASK.INC, LINE 150): UNDEFINED SYMBOL
151 MOV R1,#VAR_TASK_BUFFER_STACK0 ;Destination
*** ERROR #7 IN 151 (MULTITASK.INC, LINE 151): UNDEFINED SYMBOL
152
007D 08 153 INC R0 ;SP=start+1
154 MOV R2,#DEFINE_TASK_STACK_SIZE
*** ERROR #7 IN 154 (MULTITASK.INC, LINE 154): UNDEFINED SYMBOL
155
0080 156 TIMER_INTERRUPT_0_FOR_MULTI_TASK_COPY_STACK_LOOP_0:
0080 E6 157 MOV A,@R0
0081 F7 158 MOV @R1,A
159
A51 MACRO ASSEMBLER MULTITASK 04/04/2009 22:01:21 PAGE 4
0082 08 160 INC R0
0083 09 161 INC R1
162
163 ;Next
0084 DAFA 164 DJNZ R2,TIMER_INTERRUPT_0_FOR_MULTI_TASK_COPY_STACK_LOOP_0
165
166 ;Save/Resume data from external memory
0086 0200C3 167 LJMP TASK_SWITCH_BUFFER_
0089 168 TIMER_INTERRUPT_0_FOR_MULTI_TASK__TASK_SWITCH_BUFFER_RETURN:
169
170 ;Switch to next task
171 ;The order is inverse by save
172
173 ;Stack
174 MOV R0,#VAR_TASK_BUFFER_STACK0 ;Soruce address
*** ERROR #7 IN 174 (MULTITASK.INC, LINE 174): UNDEFINED SYMBOL
175 MOV R1,#DEFINE_SP_START_ADDRESS ;Destination
*** ERROR #7 IN 175 (MULTITASK.INC, LINE 175): UNDEFINED SYMBOL
176
008D 09 177 INC R1 ;SP=start+1
178 MOV R2,#DEFINE_TASK_STACK_SIZE
*** ERROR #7 IN 178 (MULTITASK.INC, LINE 178): UNDEFINED SYMBOL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -