📄 osal_tasks.lst
字号:
\ In segment BANKED_CODE, align 1, keep-with-next
99 void osalTaskAdd( pTaskInitFn pfnInit,
\ osalTaskAdd:
100 pTaskEventHandlerFn pfnEventProcessor,
101 byte taskPriority)
102 {
\ 000000 74F1 MOV A,#-0xf
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 15
\ 000005 ; Auto size: 3
\ 000005 74FD MOV A,#-0x3
\ 000007 12.... LCALL ?ALLOC_XSTACK8
\ 00000A 85..82 MOV DPL,?XSP + 0
\ 00000D 85..83 MOV DPH,?XSP + 1
\ 000010 E9 MOV A,R1
\ 000011 F0 MOVX @DPTR,A
\ 000012 A3 INC DPTR
\ 000013 EA MOV A,R2
\ 000014 F0 MOVX @DPTR,A
\ 000015 A3 INC DPTR
\ 000016 EB MOV A,R3
\ 000017 F0 MOVX @DPTR,A
\ 000018 EC MOV A,R4
\ 000019 FE MOV R6,A
\ 00001A 7412 MOV A,#0x12
\ 00001C 12.... LCALL ?XSTACK_DISP0_8
\ 00001F E0 MOVX A,@DPTR
\ 000020 F5.. MOV ?V0 + 0,A
\ 000022 A3 INC DPTR
\ 000023 E0 MOVX A,@DPTR
\ 000024 F5.. MOV ?V0 + 1,A
\ 000026 A3 INC DPTR
\ 000027 E0 MOVX A,@DPTR
\ 000028 F5.. MOV ?V0 + 2,A
103 osalTaskRec_t *newTask;
104 osalTaskRec_t *srchTask;
105 osalTaskRec_t **ptr;
106
107 newTask = osal_mem_alloc( sizeof( osalTaskRec_t ) );
\ 00002A ; Setup parameters for call to function osal_mem_alloc
\ 00002A 7A0C MOV R2,#0xc
\ 00002C 7B00 MOV R3,#0x0
\ 00002E 90.... MOV DPTR,#(osal_mem_alloc & 0xffff)
\ 000031 74.. MOV A,#((osal_mem_alloc >> 16) & 0xff)
\ 000033 12.... LCALL ?BCALL ; Banked call to: DPTR()
108 if ( newTask )
\ 000036 EA MOV A,R2
\ 000037 7001 JNZ ??osalTaskAdd_0
\ 000039 EB MOV A,R3
\ ??osalTaskAdd_0:
\ 00003A 7003 JNZ $+5
\ 00003C 02.... LJMP ??osalTaskAdd_1 & 0xFFFF
109 {
110 // Fill in new task
111 newTask->pfnInit = pfnInit;
\ 00003F 85..82 MOV DPL,?XSP + 0
\ 000042 85..83 MOV DPH,?XSP + 1
\ 000045 E0 MOVX A,@DPTR
\ 000046 F5.. MOV ?V0 + 4,A
\ 000048 A3 INC DPTR
\ 000049 E0 MOVX A,@DPTR
\ 00004A F5.. MOV ?V0 + 5,A
\ 00004C A3 INC DPTR
\ 00004D E0 MOVX A,@DPTR
\ 00004E F5.. MOV ?V0 + 6,A
\ 000050 8A82 MOV DPL,R2
\ 000052 8B83 MOV DPH,R3
\ 000054 A3 INC DPTR
\ 000055 A3 INC DPTR
\ 000056 E5.. MOV A,?V0 + 4
\ 000058 F0 MOVX @DPTR,A
\ 000059 A3 INC DPTR
\ 00005A E5.. MOV A,?V0 + 5
\ 00005C F0 MOVX @DPTR,A
\ 00005D A3 INC DPTR
\ 00005E E5.. MOV A,?V0 + 6
\ 000060 12.... LCALL ?Subroutine0 & 0xFFFF
112 newTask->pfnEventProcessor = pfnEventProcessor;
\ ??CrossCallReturnLabel_2:
\ 000063 E5.. MOV A,?V0 + 0
\ 000065 F0 MOVX @DPTR,A
\ 000066 A3 INC DPTR
\ 000067 E5.. MOV A,?V0 + 1
\ 000069 F0 MOVX @DPTR,A
\ 00006A A3 INC DPTR
\ 00006B E5.. MOV A,?V0 + 2
\ 00006D F0 MOVX @DPTR,A
113 newTask->taskID = taskIDs++;
\ 00006E 90.... MOV DPTR,#taskIDs
\ 000071 E0 MOVX A,@DPTR
\ 000072 8A82 MOV DPL,R2
\ 000074 8B83 MOV DPH,R3
\ 000076 A3 INC DPTR
\ 000077 A3 INC DPTR
\ 000078 A3 INC DPTR
\ 000079 A3 INC DPTR
\ 00007A A3 INC DPTR
\ 00007B A3 INC DPTR
\ 00007C A3 INC DPTR
\ 00007D A3 INC DPTR
\ 00007E F0 MOVX @DPTR,A
\ 00007F 90.... MOV DPTR,#taskIDs
\ 000082 E0 MOVX A,@DPTR
\ 000083 04 INC A
\ 000084 F0 MOVX @DPTR,A
114 newTask->taskPriority = taskPriority;
\ 000085 EE MOV A,R6
\ 000086 8A82 MOV DPL,R2
\ 000088 8B83 MOV DPH,R3
\ 00008A A3 INC DPTR
\ 00008B A3 INC DPTR
\ 00008C A3 INC DPTR
\ 00008D A3 INC DPTR
\ 00008E A3 INC DPTR
\ 00008F A3 INC DPTR
\ 000090 A3 INC DPTR
\ 000091 A3 INC DPTR
\ 000092 A3 INC DPTR
\ 000093 12.... LCALL ?Subroutine0 & 0xFFFF
115 newTask->events = 0;
\ ??CrossCallReturnLabel_3:
\ 000096 A3 INC DPTR
\ 000097 A3 INC DPTR
\ 000098 A3 INC DPTR
\ 000099 A3 INC DPTR
\ 00009A A3 INC DPTR
\ 00009B E4 CLR A
\ 00009C F0 MOVX @DPTR,A
\ 00009D A3 INC DPTR
\ 00009E F0 MOVX @DPTR,A
116 newTask->next = (osalTaskRec_t *)NULL;
\ 00009F 8A82 MOV DPL,R2
\ 0000A1 8B83 MOV DPH,R3
\ 0000A3 F0 MOVX @DPTR,A
\ 0000A4 A3 INC DPTR
\ 0000A5 F0 MOVX @DPTR,A
117
118 // 'ptr' is the address of the pointer to the new task when the new task is
119 // inserted. Initially it is set to address of 'tasksHead' in case the new
120 // task is higher priority than the existing head or the queue is empty.
121 ptr = &tasksHead;
\ 0000A6 7C.. MOV R4,#(tasksHead & 0xff)
\ 0000A8 7D.. MOV R5,#((tasksHead >> 8) & 0xff)
122 srchTask = tasksHead;
\ 0000AA 90.... MOV DPTR,#tasksHead
\ 0000AD 8008 SJMP ??osalTaskAdd_2
123 while (srchTask) {
124 if (newTask->taskPriority > srchTask->taskPriority) {
125 // insert here. New task has a higher priority than the task
126 // with which is being compared and a lower or equal priority
127 // to any task that precedes it.
128 newTask->next = srchTask;
129 *ptr = newTask;
130 return;
131 }
132 // set 'ptr' to address of the pointer to 'next' in the current
133 // (soon to be previous) task control block
134 ptr = &srchTask->next;
\ ??osalTaskAdd_3:
\ 0000AF E8 MOV A,R0
\ 0000B0 FC MOV R4,A
\ 0000B1 E9 MOV A,R1
\ 0000B2 FD MOV R5,A
135 srchTask = srchTask->next;
\ 0000B3 8882 MOV DPL,R0
\ 0000B5 8983 MOV DPH,R1
\ ??osalTaskAdd_2:
\ 0000B7 E0 MOVX A,@DPTR
\ 0000B8 F8 MOV R0,A
\ 0000B9 A3 INC DPTR
\ 0000BA E0 MOVX A,@DPTR
\ 0000BB F9 MOV R1,A
\ 0000BC E8 MOV A,R0
\ 0000BD 7001 JNZ ??osalTaskAdd_4
\ 0000BF E9 MOV A,R1
\ ??osalTaskAdd_4:
\ 0000C0 601B JZ ??osalTaskAdd_5
\ 0000C2 8882 MOV DPL,R0
\ 0000C4 8983 MOV DPH,R1
\ 0000C6 A3 INC DPTR
\ 0000C7 A3 INC DPTR
\ 0000C8 A3 INC DPTR
\ 0000C9 A3 INC DPTR
\ 0000CA A3 INC DPTR
\ 0000CB A3 INC DPTR
\ 0000CC A3 INC DPTR
\ 0000CD A3 INC DPTR
\ 0000CE A3 INC DPTR
\ 0000CF E0 MOVX A,@DPTR
\ 0000D0 C3 CLR C
\ 0000D1 9E SUBB A,R6
\ 0000D2 50DB JNC ??osalTaskAdd_3
\ 0000D4 8A82 MOV DPL,R2
\ 0000D6 8B83 MOV DPH,R3
\ 0000D8 E8 MOV A,R0
\ 0000D9 F0 MOVX @DPTR,A
\ 0000DA A3 INC DPTR
\ 0000DB E9 MOV A,R1
\ 0000DC F0 MOVX @DPTR,A
136 }
137
138 // We're at the end of the current queue. New task is not higher
139 // priority than any other already in the list. Make it the tail.
140 // (It is also the head if the queue was initially empty.)
141 *ptr = newTask;
\ ??osalTaskAdd_5:
\ 0000DD EA MOV A,R2
\ 0000DE F8 MOV R0,A
\ 0000DF EB MOV A,R3
\ 0000E0 F9 MOV R1,A
\ 0000E1 8C82 MOV DPL,R4
\ 0000E3 8D83 MOV DPH,R5
\ 0000E5 E8 MOV A,R0
\ 0000E6 F0 MOVX @DPTR,A
\ 0000E7 A3 INC DPTR
\ 0000E8 E9 MOV A,R1
\ 0000E9 F0 MOVX @DPTR,A
\ ??osalTaskAdd_1:
\ 0000EA 7403 MOV A,#0x3
\ 0000EC 12.... LCALL ?DEALLOC_XSTACK8
\ 0000EF 7F07 MOV R7,#0x7
\ 0000F1 02.... LJMP ?BANKED_LEAVE_XDATA
142 }
143 return;
144 }
\ In segment BANKED_CODE, align 1, keep-with-next
\ ?Subroutine0:
\ 000000 F0 MOVX @DPTR,A
\ 000001 8A82 MOV DPL,R2
\ 000003 8B83 MOV DPH,R3
\ 000005 A3 INC DPTR
\ 000006 REQUIRE ?Subroutine4
\ 000006 ; // Fall through to label ?Subroutine4
\ In segment BANKED_CODE, align 1, keep-with-next
\ ?Subroutine4:
\ 000000 A3 INC DPTR
\ 000001 A3 INC DPTR
\ 000002 A3 INC DPTR
\ 000003 A3 INC DPTR
\ 000004 22 RET
145
146 /*********************************************************************
147 * @fn osalInitTasks
148 *
149 * @brief Call each of the tasks initailization functions.
150 *
151 * @param none
152 *
153 * @return none
154 */
\ In segment BANKED_CODE, align 1, keep-with-next
155 void osalInitTasks( void )
\ osalInitTasks:
156 {
\ 000000 74F7 MOV A,#-0x9
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 9
\ 000005 ; Auto size: 0
157 // Start at the beginning
158 activeTask = tasksHead;
\ 000005 90.... MOV DPTR,#tasksHead
\ 000008 8029 SJMP ??CrossCallReturnLabel_1
159
160 // Stop at the end
161 while ( activeTask )
162 {
163 if ( activeTask->pfnInit )
\ ??osalInitTasks_0:
\ 00000A 12.... LCALL ?Subroutine2 & 0xFFFF
\ ??CrossCallReturnLabel_0:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -