📄 os_tmr.lst
字号:
285 INT8U OSTmrNameGet (OS_TMR *ptmr,
286 INT8U **pdest,
287 INT8U *perr)
288 {
\ OSTmrNameGet:
\ 00000000 F8B5 PUSH {R3-R7,LR}
\ 00000002 0400 MOVS R4,R0
\ 00000004 0D00 MOVS R5,R1
\ 00000006 1600 MOVS R6,R2
289 INT8U len;
290
291
292 #ifdef OS_SAFETY_CRITICAL
293 if (perr == (INT8U *)0) {
294 OS_SAFETY_CRITICAL_EXCEPTION();
295 return (0u);
296 }
297 #endif
298
299 #if OS_ARG_CHK_EN > 0u
300 if (pdest == (INT8U **)0) {
301 *perr = OS_ERR_TMR_INVALID_DEST;
302 return (0u);
303 }
304 if (ptmr == (OS_TMR *)0) {
305 *perr = OS_ERR_TMR_INVALID;
306 return (0u);
307 }
308 #endif
309 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
\ 00000008 2078 LDRB R0,[R4, #+0]
\ 0000000A 6428 CMP R0,#+100
\ 0000000C 03D0 BEQ.N ??OSTmrNameGet_0
310 *perr = OS_ERR_TMR_INVALID_TYPE;
\ 0000000E 8920 MOVS R0,#+137
\ 00000010 3070 STRB R0,[R6, #+0]
311 return (0u);
\ 00000012 0020 MOVS R0,#+0
\ 00000014 29E0 B.N ??OSTmrNameGet_1
312 }
313 if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
\ ??OSTmrNameGet_0:
\ 00000016 ........ LDR.W R0,??DataTable18_1
\ 0000001A 0078 LDRB R0,[R0, #+0]
\ 0000001C 0028 CMP R0,#+0
\ 0000001E 03D0 BEQ.N ??OSTmrNameGet_2
314 *perr = OS_ERR_NAME_GET_ISR;
\ 00000020 1120 MOVS R0,#+17
\ 00000022 3070 STRB R0,[R6, #+0]
315 return (0u);
\ 00000024 0020 MOVS R0,#+0
\ 00000026 20E0 B.N ??OSTmrNameGet_1
316 }
317 OSSchedLock();
\ ??OSTmrNameGet_2:
\ 00000028 ........ BL OSSchedLock
318 switch (ptmr->OSTmrState) {
\ 0000002C 94F82500 LDRB R0,[R4, #+37]
\ 00000030 0028 CMP R0,#+0
\ 00000032 0FD0 BEQ.N ??OSTmrNameGet_3
\ 00000034 401E SUBS R0,R0,#+1
\ 00000036 0228 CMP R0,#+2
\ 00000038 12D8 BHI.N ??OSTmrNameGet_4
319 case OS_TMR_STATE_RUNNING:
320 case OS_TMR_STATE_STOPPED:
321 case OS_TMR_STATE_COMPLETED:
322 *pdest = ptmr->OSTmrName;
\ ??OSTmrNameGet_5:
\ 0000003A 206A LDR R0,[R4, #+32]
\ 0000003C 2860 STR R0,[R5, #+0]
323 len = OS_StrLen(*pdest);
\ 0000003E 2868 LDR R0,[R5, #+0]
\ 00000040 ........ BL OS_StrLen
\ 00000044 0700 MOVS R7,R0
324 OSSchedUnlock();
\ 00000046 ........ BL OSSchedUnlock
325 *perr = OS_ERR_NONE;
\ 0000004A 0020 MOVS R0,#+0
\ 0000004C 3070 STRB R0,[R6, #+0]
326 return (len);
\ 0000004E 3800 MOVS R0,R7
\ 00000050 C0B2 UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
\ 00000052 0AE0 B.N ??OSTmrNameGet_1
327
328 case OS_TMR_STATE_UNUSED: /* Timer is not allocated */
329 OSSchedUnlock();
\ ??OSTmrNameGet_3:
\ 00000054 ........ BL OSSchedUnlock
330 *perr = OS_ERR_TMR_INACTIVE;
\ 00000058 8720 MOVS R0,#+135
\ 0000005A 3070 STRB R0,[R6, #+0]
331 return (0u);
\ 0000005C 0020 MOVS R0,#+0
\ 0000005E 04E0 B.N ??OSTmrNameGet_1
332
333 default:
334 OSSchedUnlock();
\ ??OSTmrNameGet_4:
\ 00000060 ........ BL OSSchedUnlock
335 *perr = OS_ERR_TMR_INVALID_STATE;
\ 00000064 8D20 MOVS R0,#+141
\ 00000066 3070 STRB R0,[R6, #+0]
336 return (0u);
\ 00000068 0020 MOVS R0,#+0
\ ??OSTmrNameGet_1:
\ 0000006A F2BD POP {R1,R4-R7,PC} ;; return
337 }
338 }
339 #endif
340
341 /*$PAGE*/
342 /*
343 ************************************************************************************************************************
344 * GET HOW MUCH TIME IS LEFT BEFORE A TIMER EXPIRES
345 *
346 * Description: This function is called to get the number of ticks before a timer times out.
347 *
348 * Arguments : ptmr Is a pointer to the timer to obtain the remaining time from.
349 *
350 * perr Is a pointer to an error code. '*perr' will contain one of the following:
351 * OS_ERR_NONE
352 * OS_ERR_TMR_INVALID 'ptmr' is a NULL pointer
353 * OS_ERR_TMR_INVALID_TYPE 'ptmr' is not pointing to an OS_TMR
354 * OS_ERR_TMR_ISR if the call was made from an ISR
355 * OS_ERR_TMR_INACTIVE 'ptmr' points to a timer that is not active
356 * OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
357 *
358 * Returns : The time remaining for the timer to expire. The time represents 'timer' increments. In other words, if
359 * OSTmr_Task() is signaled every 1/10 of a second then the returned value represents the number of 1/10 of
360 * a second remaining before the timer expires.
361 ************************************************************************************************************************
362 */
363
364 #if OS_TMR_EN > 0u
\ In section .text, align 2, keep-with-next
365 INT32U OSTmrRemainGet (OS_TMR *ptmr,
366 INT8U *perr)
367 {
\ OSTmrRemainGet:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 0400 MOVS R4,R0
\ 00000004 0D00 MOVS R5,R1
368 INT32U remain;
369
370
371 #ifdef OS_SAFETY_CRITICAL
372 if (perr == (INT8U *)0) {
373 OS_SAFETY_CRITICAL_EXCEPTION();
374 return (0u);
375 }
376 #endif
377
378 #if OS_ARG_CHK_EN > 0u
379 if (ptmr == (OS_TMR *)0) {
380 *perr = OS_ERR_TMR_INVALID;
381 return (0u);
382 }
383 #endif
384 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
\ 00000006 2078 LDRB R0,[R4, #+0]
\ 00000008 6428 CMP R0,#+100
\ 0000000A 03D0 BEQ.N ??OSTmrRemainGet_0
385 *perr = OS_ERR_TMR_INVALID_TYPE;
\ 0000000C 8920 MOVS R0,#+137
\ 0000000E 2870 STRB R0,[R5, #+0]
386 return (0u);
\ 00000010 0020 MOVS R0,#+0
\ 00000012 49E0 B.N ??OSTmrRemainGet_1
387 }
388 if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
\ ??OSTmrRemainGet_0:
\ 00000014 ........ LDR.W R0,??DataTable18_1
\ 00000018 0078 LDRB R0,[R0, #+0]
\ 0000001A 0028 CMP R0,#+0
\ 0000001C 03D0 BEQ.N ??OSTmrRemainGet_2
389 *perr = OS_ERR_TMR_ISR;
\ 0000001E 8B20 MOVS R0,#+139
\ 00000020 2870 STRB R0,[R5, #+0]
390 return (0u);
\ 00000022 0020 MOVS R0,#+0
\ 00000024 40E0 B.N ??OSTmrRemainGet_1
391 }
392 OSSchedLock();
\ ??OSTmrRemainGet_2:
\ 00000026 ........ BL OSSchedLock
393 switch (ptmr->OSTmrState) {
\ 0000002A 94F82500 LDRB R0,[R4, #+37]
\ 0000002E 0028 CMP R0,#+0
\ 00000030 2FD0 BEQ.N ??OSTmrRemainGet_3
\ 00000032 0228 CMP R0,#+2
\ 00000034 27D0 BEQ.N ??OSTmrRemainGet_4
\ 00000036 0DD3 BCC.N ??OSTmrRemainGet_5
\ 00000038 0328 CMP R0,#+3
\ 0000003A 30D1 BNE.N ??OSTmrRemainGet_6
394 case OS_TMR_STATE_RUNNING:
395 remain = ptmr->OSTmrMatch - OSTmrTime; /* Determine how much time is left to timeout */
\ ??OSTmrRemainGet_7:
\ 0000003C 6069 LDR R0,[R4, #+20]
\ 0000003E ........ LDR.W R1,??DataTable18_2
\ 00000042 0968 LDR R1,[R1, #+0]
\ 00000044 401A SUBS R0,R0,R1
\ 00000046 0600 MOVS R6,R0
396 OSSchedUnlock();
\ 00000048 ........ BL OSSchedUnlock
397 *perr = OS_ERR_NONE;
\ 0000004C 0020 MOVS R0,#+0
\ 0000004E 2870 STRB R0,[R5, #+0]
398 return (remain);
\ 00000050 3000 MOVS R0,R6
\ 00000052 29E0 B.N ??OSTmrRemainGet_1
399
400 case OS_TMR_STATE_STOPPED: /* It's assumed that the timer has not started yet */
401 switch (ptmr->OSTmrOpt) {
\ ??OSTmrRemainGet_5:
\ 00000054 94F82400 LDRB R0,[R4, #+36]
\ 00000058 0228 CMP R0,#+2
\ 0000005A 0CD1 BNE.N ??OSTmrRemainGet_8
402 case OS_TMR_OPT_PERIODIC:
403 if (ptmr->OSTmrDly == 0u) {
\ 0000005C A069 LDR R0,[R4, #+24]
\ 0000005E 0028 CMP R0,#+0
\ 00000060 02D1 BNE.N ??OSTmrRemainGet_9
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -