📄 osal_timers.s51
字号:
SJMP ??osalAddTimer_3
// 132
// 133 return ( newTimer );
// 134 }
// 135 else
// 136 {
// 137 // New Timer
// 138 newTimer = osal_mem_alloc( sizeof( osalTimerRec_t ) );
??osalAddTimer_1:
; Setup parameters for call to function osal_mem_alloc
MOV R2,#0x7
MOV R3,#0x0
MOV DPTR,#(osal_mem_alloc & 0xffff)
MOV A,#((osal_mem_alloc >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 139
// 140 if ( newTimer )
MOV A,R2
JNZ ??osalAddTimer_4
MOV A,R3
??osalAddTimer_4:
JZ ??osalAddTimer_5
// 141 {
// 142 // Fill in new timer
// 143 newTimer->task_id = task_id;
MOV DPL,R2
MOV DPH,R3
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOV A,?V0 + 2
MOVX @DPTR,A
// 144 newTimer->event_flag = event_flag;
MOV DPL,R2
MOV DPH,R3
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOV A,?V0 + 0
MOVX @DPTR,A
INC DPTR
MOV A,?V0 + 1
MOVX @DPTR,A
// 145 newTimer->timeout = timeout;
MOV DPL,R2
MOV DPH,R3
INC DPTR
INC DPTR
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
// 146 newTimer->next = (void *)NULL;
MOV DPL,R2
MOV DPH,R3
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
// 147
// 148 // Does the timer list already exist
// 149 if ( timerHead == NULL )
MOV DPTR,#timerHead
MOVX A,@DPTR
JNZ ??osalAddTimer_6
INC DPTR
MOVX A,@DPTR
??osalAddTimer_6:
MOV DPTR,#timerHead
??osalAddTimer_7:
JNZ ??osalAddTimer_8
// 150 {
// 151 // Start task list
// 152 timerHead = newTimer;
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
SJMP ??osalAddTimer_2
// 153 }
// 154 else
// 155 {
// 156 // Add it to the end of the timer list
// 157 srchTimer = timerHead;
// 158
// 159 // Stop at the last record
// 160 while ( srchTimer->next )
// 161 srchTimer = srchTimer->next;
??osalAddTimer_8:
LCALL ?Subroutine2 & 0xFFFF
??CrossCallReturnLabel_6:
MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR
JNZ ??osalAddTimer_9
INC DPTR
MOVX A,@DPTR
??osalAddTimer_9:
MOV DPL,R0
MOV DPH,R1
SJMP ??osalAddTimer_7
// 162
// 163 // Add to the list
// 164 srchTimer->next = newTimer;
// 165 }
// 166
// 167 return ( newTimer );
// 168 }
// 169 else
// 170 return ( (osalTimerRec_t *)NULL );
??osalAddTimer_5:
MOV R2,#0x0
MOV R3,#0x0
??osalAddTimer_3:
MOV R7,#0x6
LJMP ?BANKED_LEAVE_XDATA
CFI EndBlock cfiBlock1
// 171 }
// 172 }
// 173
// 174 /*********************************************************************
// 175 * @fn osalFindTimer
// 176 *
// 177 * @brief Find a timer in a timer list.
// 178 * Ints must be disabled.
// 179 *
// 180 * @param task_id
// 181 * @param event_flag
// 182 *
// 183 * @return osalTimerRec_t *
// 184 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 185 osalTimerRec_t *osalFindTimer( byte task_id, uint16 event_flag )
osalFindTimer:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function osalFindTimer
// 186 {
MOV A,#-0x9
LCALL ?BANKED_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 9)
; Saved register size: 9
; Auto size: 0
// 187 osalTimerRec_t *srchTimer;
// 188
// 189 // Head of the timer list
// 190 srchTimer = timerHead;
MOV DPTR,#timerHead
SJMP ??osalFindTimer_0
// 191
// 192 // Stop when found or at the end
// 193 while ( srchTimer )
// 194 {
// 195 if ( srchTimer->event_flag == event_flag &&
// 196 srchTimer->task_id == task_id )
// 197 break;
// 198
// 199 // Not this one, check another
// 200 srchTimer = srchTimer->next;
??osalFindTimer_1:
MOV DPL,R4
MOV DPH,R5
??osalFindTimer_0:
LCALL ??Subroutine0_0 & 0xFFFF
??CrossCallReturnLabel_0:
MOV A,R4
JNZ ??osalFindTimer_2
MOV A,R5
??osalFindTimer_2:
JZ ??osalFindTimer_3
MOV DPL,R4
MOV DPH,R5
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX A,@DPTR
XRL A,R2
JNZ ??osalFindTimer_4
INC DPTR
MOVX A,@DPTR
XRL A,R3
??osalFindTimer_4:
JNZ ??osalFindTimer_1
MOV DPL,R4
MOV DPH,R5
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX A,@DPTR
XRL A,R1
JNZ ??osalFindTimer_1
// 201 }
// 202
// 203 return ( srchTimer );
??osalFindTimer_3:
MOV A,R4
MOV R2,A
MOV A,R5
MOV R3,A
SJMP ??Subroutine4_0
CFI EndBlock cfiBlock2
// 204 }
RSEG BANKED_CODE:CODE:NOROOT(0)
?Subroutine4:
CFI Block cfiBlock3 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 9)
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
LCALL ?BCALL ; Banked call to: DPTR()
??Subroutine4_0:
MOV R7,#0x1
LJMP ?BANKED_LEAVE_XDATA
CFI EndBlock cfiBlock3
// 205
// 206 /*********************************************************************
// 207 * @fn osalDeleteTimer
// 208 *
// 209 * @brief Delete a timer from a timer list.
// 210 * Ints must be disabled.
// 211 *
// 212 * @param table
// 213 * @param rmTimer
// 214 *
// 215 * @return none
// 216 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 217 void osalDeleteTimer( osalTimerRec_t *rmTimer )
osalDeleteTimer:
CFI Block cfiBlock4 Using cfiCommon0
CFI Function osalDeleteTimer
// 218 {
FUNCALL osalDeleteTimer, osal_mem_free
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
FUNCALL osalDeleteTimer, osal_mem_free
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
MOV A,#-0x9
LCALL ?BANKED_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 9)
; Saved register size: 9
; Auto size: 0
// 219 osalTimerRec_t *srchTimer;
// 220
// 221 // Does the timer list really exist
// 222 if ( (timerHead != NULL) && rmTimer )
MOV DPTR,#timerHead
MOVX A,@DPTR
JNZ ??osalDeleteTimer_0
INC DPTR
MOVX A,@DPTR
??osalDeleteTimer_0:
JZ ??osalDeleteTimer_1
MOV A,R2
JNZ ??osalDeleteTimer_2
MOV A,R3
??osalDeleteTimer_2:
JZ ??osalDeleteTimer_1
// 223 {
// 224 // Add it to the end of the timer list
// 225 srchTimer = timerHead;
MOV DPTR,#timerHead
LCALL ?Subroutine2 & 0xFFFF
// 226
// 227 // First element?
// 228 if ( srchTimer == rmTimer )
??CrossCallReturnLabel_7:
MOV A,R2
XRL A,R0
JNZ ??osalDeleteTimer_3
MOV A,R3
XRL A,R1
??osalDeleteTimer_3:
JNZ ??CrossCallReturnLabel_8
// 229 {
// 230 timerHead = rmTimer->next;
MOV DPL,R2
MOV DPH,R3
LCALL ?Subroutine1 & 0xFFFF
??CrossCallReturnLabel_4:
MOV A,R0
MOVX @DPTR,A
INC DPTR
MOV A,R1
SJMP ??osalDeleteTimer_4
// 231 osal_mem_free( rmTimer );
// 232 }
// 233 else
// 234 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -