📄 mac_scheduler.s51
字号:
CLR C
SUBB A,#0x14
JC ??mschInit_1
CFI EndBlock cfiBlock0
// 66
// 67 } // mschInit
REQUIRE ?Subroutine0
; // Fall through to label ?Subroutine0
RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
CFI Block cfiBlock1 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+-4
CFI DPL0 Frame(CFA_SP, 3)
CFI DPH0 Frame(CFA_SP, 4)
POP DPH
CFI CFA_SP SP+-3
CFI DPH0 SameValue
POP DPL
CFI CFA_SP SP+-2
CFI DPL0 SameValue
RET
CFI EndBlock cfiBlock1
// 68
// 69
// 70
// 71
// 72 //-------------------------------------------------------------------------------------------------------
// 73 // UINT8 mschReserveTask(void)
// 74 //
// 75 // DESCRIPTION:
// 76 // Reserves a task from the task pool (a task must be reserved before it can be used.
// 77 //
// 78 // RETURN VALUE:
// 79 // UINT8
// 80 // The index of the reserved task (to be used with mschAddTask(...))
// 81 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 82 ROOT UINT8 mschReserveTask(void) {
mschReserveTask:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function mschReserveTask
PUSH DPL
CFI DPL0 Frame(CFA_SP, 3)
CFI CFA_SP SP+-3
PUSH DPH
CFI DPH0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
; Saved register size: 2
; Auto size: 0
// 83 UINT8 n;
// 84
// 85 // Find an unused task table entry and reserve it
// 86 for (n = 0; n < MAC_TASK_COUNT; n++) {
MOV R1,#0x0
// 87 DISABLE_GLOBAL_INT();
??mschReserveTask_0:
CLR 0xa8.7
// 88 if (!pMacTasks[n].occupied) {
MOV A,R1
MOV B,#0xa
MUL AB
ADD A,#((pMacTasks + 6) & 0xff)
MOV DPL,A
MOV A,B
ADDC A,#(((pMacTasks + 6) >> 8) & 0xff)
MOV DPH,A
MOVX A,@DPTR
JNZ ??mschReserveTask_1
// 89 pMacTasks[n].occupied = TRUE;
MOV A,#0x1
MOVX @DPTR,A
// 90 ENABLE_GLOBAL_INT();
SETB 0xa8.7
// 91 return n;
SJMP ??mschReserveTask_2
// 92 }
// 93 ENABLE_GLOBAL_INT();
??mschReserveTask_1:
SETB 0xa8.7
// 94 }
INC R1
MOV A,R1
CLR C
SUBB A,#0x14
JC ??mschReserveTask_0
// 95 return NO_TASK;
MOV R1,#-0x1
??mschReserveTask_2:
SJMP ?Subroutine0
CFI EndBlock cfiBlock2
// 96 } // mschReserveTask
// 97
// 98
// 99
// 100
// 101 //-------------------------------------------------------------------------------------------------------
// 102 // void mschReleaseTask(UINT8 taskNumber)
// 103 //
// 104 // DESCRIPTION:
// 105 // Clears the reservation for an unused task.
// 106 //
// 107 // ARGUMENTS:
// 108 // UINT8 taskNumber
// 109 // The number of the task (returned by mschReserveTask())
// 110 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 111 ROOT void mschReleaseTask(UINT8 taskNumber) {
mschReleaseTask:
CFI Block cfiBlock3 Using cfiCommon0
CFI Function mschReleaseTask
PUSH DPL
CFI DPL0 Frame(CFA_SP, 3)
CFI CFA_SP SP+-3
PUSH DPH
CFI DPH0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
; Saved register size: 2
; Auto size: 0
// 112 if (taskNumber != NO_TASK) pMacTasks[taskNumber].occupied = FALSE;
MOV A,#-0x1
XRL A,R1
JZ ??mschReleaseTask_0
MOV A,R1
MOV B,#0xa
MUL AB
ADD A,#((pMacTasks + 6) & 0xff)
MOV DPL,A
MOV A,B
ADDC A,#(((pMacTasks + 6) >> 8) & 0xff)
MOV DPH,A
CLR A
MOVX @DPTR,A
// 113 } // mschReleaseTask
??mschReleaseTask_0:
SJMP ?Subroutine0
CFI EndBlock cfiBlock3
// 114
// 115
// 116
// 117
// 118 //-------------------------------------------------------------------------------------------------------
// 119 // BOOL mschAddTask(UINT8 taskNumber, UINT8 priority, TFPTR pTaskFunc, WORD taskData, void *dataPointer)
// 120 //
// 121 // DESCRIPTION:
// 122 // Configures and adds a reserved to task to the desired task queue.
// 123 //
// 124 // ARGUMENTS:
// 125 // UINT8 taskNumber
// 126 // The number of the task (returned by mschReserveTask(...))
// 127 // UINT8 priority
// 128 // MAC_TASK_PRI_HIGHEST, MAC_TASK_PRI_HIGH, MAC_TASK_PRI_MEDIUM or MAC_TASK_PRI_LOW
// 129 // TFPTR pTaskFunc
// 130 // A pointer to the task function (void TaskFunction(MAC_TASK_INFO *pTask))
// 131 // WORD taskData
// 132 // Two bytes of task data
// 133 //
// 134 // RETURN VALUE:
// 135 // BOOL
// 136 // The task was added (the task number was OK)
// 137 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 138 ROOT BOOL mschAddTask(UINT8 taskNumber, UINT8 priority, TFPTR pTaskFunc, WORD taskData) {
mschAddTask:
CFI Block cfiBlock4 Using cfiCommon0
CFI Function mschAddTask
MOV A,#-0xa
LCALL ?FUNC_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 10)
; Saved register size: 10
; Auto size: 0
MOV ?V0 + 0,R1
MOV ?V0 + 1,R2
MOV A,#0xa
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
// 139 MAC_TASK_INFO *pTask;
// 140 MAC_TASK_QUEUE *pQueue;
// 141
// 142 // The task index must be valid
// 143 if (taskNumber == NO_TASK) return FALSE;
MOV A,#-0x1
XRL A,?V0 + 0
JNZ ??mschAddTask_0
MOV R1,#0x0
LJMP ??mschAddTask_1
// 144
// 145 DISABLE_GLOBAL_INT();
??mschAddTask_0:
CLR 0xa8.7
// 146
// 147 // Initialize the task
// 148 pTask = &pMacTasks[taskNumber];
MOV A,?V0 + 0
MOV B,#0xa
MUL AB
ADD A,#(pMacTasks & 0xff)
MOV R6,A
MOV A,B
ADDC A,#((pMacTasks >> 8) & 0xff)
MOV R7,A
// 149 pTask->pTaskFunc = pTaskFunc;
MOV DPL,R6
MOV DPH,R7
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
// 150 pTask->taskData = taskData;
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
// 151 pTask->state = 0;
CLR A
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 152 pTask->priority = priority;
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOV A,?V0 + 1
MOVX @DPTR,A
// 153 pTask->nextTask = NO_TASK;
MOV A,#-0x1
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 154
// 155 // Update the queue pointers at the insertion point (last task in the queue)
// 156 pQueue = &pMacTaskQueues[priority];
MOV A,?V0 + 1
MOV B,#0x3
MUL AB
ADD A,#(pMacTaskQueues & 0xff)
MOV DPL,A
MOV A,B
ADDC A,#((pMacTaskQueues >> 8) & 0xff)
MOV DPH,A
// 157 if (pQueue->firstTask == NO_TASK) {
MOVX A,@DPTR
XRL A,#0xff
JNZ ??mschAddTask_2
// 158 pQueue->firstTask = taskNumber;
MOV A,?V0 + 0
MOVX @DPTR,A
// 159 pQueue->lastTask = taskNumber;
INC DPTR
SJMP ??mschAddTask_3
// 160 } else {
// 161 pMacTasks[pQueue->lastTask].nextTask = taskNumber;
??mschAddTask_2:
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOVX A,@DPTR
MOV B,#0xa
MUL AB
ADD A,#((pMacTasks + 7) & 0xff)
MOV DPL,A
MOV A,B
ADDC A,#(((pMacTasks + 7) >> 8) & 0xff)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -