⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac_scheduler.s51

📁 zigbee location examples
💻 S51
📖 第 1 页 / 共 3 页
字号:
        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 + -