📄 mac_scheduler.lst
字号:
\ In segment NEAR_CODE, align 1, keep-with-next
187 ROOT void mschRemoveTask(UINT8 priority, BYTE flags) {
\ mschRemoveTask:
\ 000000 74F8 MOV A,#-0x8
\ 000002 12.... LCALL ?FUNC_ENTER_XDATA
\ 000005 ; Saved register size: 8
\ 000005 ; Auto size: 0
\ 000005 EA MOV A,R2
\ 000006 FC MOV R4,A
188 UINT8 taskNumber;
189 MAC_TASK_INFO *pTask;
190 MAC_TASK_QUEUE *pQueue = &pMacTaskQueues[priority];
\ 000007 E9 MOV A,R1
\ 000008 75F003 MOV B,#0x3
\ 00000B A4 MUL AB
\ 00000C 24.. ADD A,#(pMacTaskQueues & 0xff)
\ 00000E F8 MOV R0,A
\ 00000F E5F0 MOV A,B
\ 000011 34.. ADDC A,#((pMacTaskQueues >> 8) & 0xff)
\ 000013 F9 MOV R1,A
191
192 DISABLE_GLOBAL_INT();
\ 000014 C2AF CLR 0xa8.7
193
194 // Get the task table index number, and make sure that it is valid
195 taskNumber = pQueue->firstTask;
\ 000016 8882 MOV DPL,R0
\ 000018 8983 MOV DPH,R1
\ 00001A E0 MOVX A,@DPTR
\ 00001B FE MOV R6,A
196
197 // Flag-dependent operations
198 pTask = &pMacTasks[taskNumber];
\ 00001C 75F00A MOV B,#0xa
\ 00001F A4 MUL AB
\ 000020 24.. ADD A,#(pMacTasks & 0xff)
\ 000022 FA MOV R2,A
\ 000023 E5F0 MOV A,B
\ 000025 34.. ADDC A,#((pMacTasks >> 8) & 0xff)
\ 000027 FB MOV R3,A
199 if (!(flags & MSCH_KEEP_TASK_RESERVED_BM)) pTask->occupied = FALSE;
\ 000028 EC MOV A,R4
\ 000029 A2E0 MOV C,0xE0 /* A */.0
\ 00002B 400C JC ??mschRemoveTask_0
\ 00002D E4 CLR A
\ 00002E 8A82 MOV DPL,R2
\ 000030 8B83 MOV DPH,R3
\ 000032 A3 INC DPTR
\ 000033 A3 INC DPTR
\ 000034 A3 INC DPTR
\ 000035 A3 INC DPTR
\ 000036 A3 INC DPTR
\ 000037 A3 INC DPTR
\ 000038 F0 MOVX @DPTR,A
200 if (!(flags & MSCH_KEEP_TASK_IN_PROGRESS_BM)) pQueue->taskInProgress = FALSE;
\ ??mschRemoveTask_0:
\ 000039 EC MOV A,R4
\ 00003A A2E1 MOV C,0xE0 /* A */.1
\ 00003C 4008 JC ??mschRemoveTask_1
\ 00003E E4 CLR A
\ 00003F 8882 MOV DPL,R0
\ 000041 8983 MOV DPH,R1
\ 000043 A3 INC DPTR
\ 000044 A3 INC DPTR
\ 000045 F0 MOVX @DPTR,A
201
202 // Move the "first task" pointer one step forward
203 pQueue->firstTask = pTask->nextTask;
\ ??mschRemoveTask_1:
\ 000046 8A82 MOV DPL,R2
\ 000048 8B83 MOV DPH,R3
\ 00004A A3 INC DPTR
\ 00004B A3 INC DPTR
\ 00004C A3 INC DPTR
\ 00004D A3 INC DPTR
\ 00004E A3 INC DPTR
\ 00004F A3 INC DPTR
\ 000050 A3 INC DPTR
\ 000051 E0 MOVX A,@DPTR
\ 000052 FA MOV R2,A
\ 000053 8882 MOV DPL,R0
\ 000055 8983 MOV DPH,R1
\ 000057 F0 MOVX @DPTR,A
204 if (pQueue->firstTask == NO_TASK) {
\ 000058 A3 INC DPTR
\ 000059 74FF MOV A,#-0x1
\ 00005B 6A XRL A,R2
\ 00005C 7005 JNZ ??mschRemoveTask_2
205 pQueue->lastTask = NO_TASK;
\ ??mschRemoveTask_3:
\ 00005E 74FF MOV A,#-0x1
\ 000060 F0 MOVX @DPTR,A
\ 000061 8004 SJMP ??mschRemoveTask_4
206 } else if (pQueue->lastTask == taskNumber) {
\ ??mschRemoveTask_2:
\ 000063 E0 MOVX A,@DPTR
\ 000064 6E XRL A,R6
\ 000065 60F7 JZ ??mschRemoveTask_3
207 pQueue->lastTask = NO_TASK;
208 }
209
210 ENABLE_GLOBAL_INT();
\ ??mschRemoveTask_4:
\ 000067 D2AF SETB 0xa8.7
211 } // mschRemoveTask
\ 000069 7F01 MOV R7,#0x1
\ 00006B 02.... LJMP ?FUNC_LEAVE_XDATA
212
213
214
215
216 //-------------------------------------------------------------------------------------------------------
217 // void mschRescheduleTask(MAC_TASK_INFO *pTask, UINT8 state)
218 //
219 // DESCRIPTION:
220 // Removes the currently running task from a queue, and adds it to the back of the same queue,
221 // possibly behind a number of waiting tasks which now will be run first.
222 //
223 // ARGUMENTS:
224 // MAC_TASK_INFO *pTask
225 // The task to be rescheduled
226 // UINT8 state
227 // The task state when run after the rescheduling.
228 //-------------------------------------------------------------------------------------------------------
\ In segment NEAR_CODE, align 1, keep-with-next
229 ROOT void mschRescheduleTask(MAC_TASK_INFO *pTask, UINT8 state) {
\ mschRescheduleTask:
\ 000000 74F6 MOV A,#-0xa
\ 000002 12.... LCALL ?FUNC_ENTER_XDATA
\ 000005 ; Saved register size: 10
\ 000005 ; Auto size: 0
\ 000005 EA MOV A,R2
\ 000006 FE MOV R6,A
\ 000007 EB MOV A,R3
\ 000008 FF MOV R7,A
\ 000009 89.. MOV ?V0 + 2,R1
230 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_RESERVED_BM | MSCH_KEEP_TASK_IN_PROGRESS_BM);
\ 00000B EE MOV A,R6
\ 00000C 2408 ADD A,#0x8
\ 00000E F5.. MOV ?V0 + 0,A
\ 000010 EF MOV A,R7
\ 000011 3400 ADDC A,#0x0
\ 000013 F5.. MOV ?V0 + 1,A
\ 000015 ; Setup parameters for call to function mschRemoveTask
\ 000015 7A03 MOV R2,#0x3
\ 000017 85..82 MOV DPL,?V0 + 0
\ 00001A F583 MOV DPH,A
\ 00001C E0 MOVX A,@DPTR
\ 00001D F9 MOV R1,A
\ 00001E 12.... LCALL mschRemoveTask
231 mschAddTask(pTask->taskNumber, pTask->priority, pTask->pTaskFunc, pTask->taskData);
\ 000021 ; Setup parameters for call to function mschAddTask
\ 000021 8E82 MOV DPL,R6
\ 000023 8F83 MOV DPH,R7
\ 000025 12.... LCALL ?PUSH_XSTACK8_X_THREE
\ 000028 8E82 MOV DPL,R6
\ 00002A 8F83 MOV DPH,R7
\ 00002C A3 INC DPTR
\ 00002D A3 INC DPTR
\ 00002E A3 INC DPTR
\ 00002F E0 MOVX A,@DPTR
\ 000030 FC MOV R4,A
\ 000031 A3 INC DPTR
\ 000032 E0 MOVX A,@DPTR
\ 000033 FD MOV R5,A
\ 000034 85..82 MOV DPL,?V0 + 0
\ 000037 85..83 MOV DPH,?V0 + 1
\ 00003A E0 MOVX A,@DPTR
\ 00003B FA MOV R2,A
\ 00003C 8E82 MOV DPL,R6
\ 00003E 8F83 MOV DPH,R7
\ 000040 A3 INC DPTR
\ 000041 A3 INC DPTR
\ 000042 A3 INC DPTR
\ 000043 A3 INC DPTR
\ 000044 A3 INC DPTR
\ 000045 A3 INC DPTR
\ 000046 A3 INC DPTR
\ 000047 A3 INC DPTR
\ 000048 A3 INC DPTR
\ 000049 E0 MOVX A,@DPTR
\ 00004A F9 MOV R1,A
\ 00004B 12.... LCALL mschAddTask
\ 00004E 7403 MOV A,#0x3
\ 000050 12.... LCALL ?DEALLOC_XSTACK8
232 pTask->state = state;
\ 000053 8E82 MOV DPL,R6
\ 000055 8F83 MOV DPH,R7
\ 000057 A3 INC DPTR
\ 000058 A3 INC DPTR
\ 000059 A3 INC DPTR
\ 00005A A3 INC DPTR
\ 00005B A3 INC DPTR
\ 00005C E5.. MOV A,?V0 + 2
\ 00005E F0 MOVX @DPTR,A
233 } // mschRescheduleTask
\ 00005F 02.... LJMP ?Subroutine1
\ In segment SFR_AN, at 0xa8
\ union <unnamed> volatile __sfr _A_IEN0
\ _A_IEN0:
\ 000000 DS 1
234
Maximum stack usage in bytes:
Function ISTACK PSTACK XSTACK
-------- ------ ------ ------
mschAddTask 1 0 23
mschInit 3 0 0
mschReleaseTask 3 0 0
mschRemoveTask 1 0 18
mschRescheduleTask 1 0 13
-> mschRemoveTask 0 0 20
-> mschAddTask 0 0 26
mschReserveTask 3 0 0
Segment part sizes:
Function/Label Bytes
-------------- -----
pMacTasks 200
pMacTaskQueues 12
mschInit 73
?Subroutine0 5
mschReserveTask 46
mschReleaseTask 28
mschAddTask 172
?Subroutine1 5
mschRemoveTask 110
mschRescheduleTask 98
_A_IEN0 1
537 bytes in segment NEAR_CODE
212 bytes in segment PM0_XDATA
1 byte in segment SFR_AN
537 bytes of CODE memory
0 bytes of DATA memory (+ 1 byte shared)
212 bytes of XDATA memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -