📄 os_tmr.txt
字号:
00052e f7fff7ff BL OSTmr_Unlock
;;;669 return (OS_TRUE);
000532 2001 MOVS r0,#1
000534 e8bde8bd POP {r4-r8,pc}
|L1.1336|
;;;670
;;;671 case OS_TMR_STATE_COMPLETED: /* Timer has already completed the ONE-SHOT or ... */
;;;672 case OS_TMR_STATE_STOPPED: /* ... timer has not started yet. */
;;;673 OSTmr_Unlock();
000538 f7fff7ff BL OSTmr_Unlock
;;;674 *perr = OS_ERR_TMR_STOPPED;
00053c 208e MOVS r0,#0x8e
00053e 7020 STRB r0,[r4,#0]
;;;675 return (OS_TRUE);
000540 2001 MOVS r0,#1
000542 e8bde8bd POP {r4-r8,pc}
|L1.1350|
;;;676
;;;677 case OS_TMR_STATE_UNUSED: /* Timer was not created */
;;;678 OSTmr_Unlock();
000546 f7fff7ff BL OSTmr_Unlock
;;;679 *perr = OS_ERR_TMR_INACTIVE;
00054a 2087 MOVS r0,#0x87
00054c 7020 STRB r0,[r4,#0]
;;;680 return (OS_FALSE);
00054e 2000 MOVS r0,#0
000550 e8bde8bd POP {r4-r8,pc}
|L1.1364|
;;;681
;;;682 default:
;;;683 OSTmr_Unlock();
000554 f7fff7ff BL OSTmr_Unlock
;;;684 *perr = OS_ERR_TMR_INVALID_STATE;
000558 208d MOVS r0,#0x8d
00055a 7020 STRB r0,[r4,#0]
;;;685 return (OS_FALSE);
00055c 2000 MOVS r0,#0
;;;686 }
;;;687 }
00055e e8bde8bd POP {r4-r8,pc}
;;;688 #endif
ENDP
OSTmrSignal PROC
;;;715
;;;716 err = OSSemPost(OSTmrSemSignal);
000562 4852 LDR r0,|L1.1708|
000564 6800 LDR r0,[r0,#0] ; OSTmrSemSignal
000566 f7fff7ff B.W OSSemPost
;;;717 return (err);
;;;718 }
;;;719 #endif
ENDP
OSTmr_Task PROC
;;;1078 static void OSTmr_Task (void *p_arg)
;;;1079 {
00056a e92de92d PUSH {r3-r9,lr}
00056e f8dff8df LDR r8,|L1.1708|
000572 f8dff8df LDR r9,|L1.1712|
000576 4e4f LDR r6,|L1.1716|
000578 2702 MOVS r7,#2
|L1.1402|
;;;1080 INT8U err;
;;;1081 OS_TMR *ptmr;
;;;1082 OS_TMR *ptmr_next;
;;;1083 OS_TMR_CALLBACK pfnct;
;;;1084 OS_TMR_WHEEL *pspoke;
;;;1085 INT16U spoke;
;;;1086
;;;1087
;;;1088 (void)p_arg; /* Not using 'p_arg', prevent compiler warning */
;;;1089 for (;;) {
;;;1090 OSSemPend(OSTmrSemSignal, 0, &err); /* Wait for signal indicating time to update timers */
00057a 466a MOV r2,sp
00057c 2100 MOVS r1,#0
00057e f8d8f8d8 LDR r0,[r8,#0] ; OSTmrSemSignal
000582 f7fff7ff BL OSSemPend
;;;1091 OSTmr_Lock();
000586 f7fff7ff BL OSTmr_Lock
;;;1092 OSTmrTime++; /* Increment the current time */
00058a 6830 LDR r0,[r6,#0] ; OSTmrTime
00058c 1c40 ADDS r0,r0,#1
00058e 6030 STR r0,[r6,#0] ; OSTmrTime
;;;1093 spoke = (INT16U)(OSTmrTime % OS_TMR_CFG_WHEEL_SIZE); /* Position on current timer wheel entry */
000590 f000f000 AND r0,r0,#7
;;;1094 pspoke = &OSTmrWheelTbl[spoke];
000594 eb09eb09 ADD r0,r9,r0,LSL #3
;;;1095 ptmr = pspoke->OSTmrFirst;
000598 6804 LDR r4,[r0,#0]
;;;1096 while (ptmr != (OS_TMR *)0) {
00059a b1d4 CBZ r4,|L1.1490|
|L1.1436|
;;;1097 ptmr_next = (OS_TMR *)ptmr->OSTmrNext; /* Point to next timer to update because current ... */
00059c 68e5 LDR r5,[r4,#0xc]
;;;1098 /* ... timer could get unlinked from the wheel. */
;;;1099 if (OSTmrTime == ptmr->OSTmrMatch) { /* Process each timer that expires */
00059e 6960 LDR r0,[r4,#0x14]
0005a0 6831 LDR r1,[r6,#0] ; OSTmrTime
0005a2 4288 CMP r0,r1
0005a4 d112 BNE |L1.1484|
;;;1100 pfnct = ptmr->OSTmrCallback; /* Execute callback function if available */
0005a6 6862 LDR r2,[r4,#4]
;;;1101 if (pfnct != (OS_TMR_CALLBACK)0) {
0005a8 b112 CBZ r2,|L1.1456|
;;;1102 (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);
0005aa 4620 MOV r0,r4
0005ac 68a1 LDR r1,[r4,#8]
0005ae 4790 BLX r2
|L1.1456|
;;;1103 }
;;;1104 OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
0005b0 4620 MOV r0,r4
0005b2 f7fff7ff BL OSTmr_Unlink
;;;1105 if (ptmr->OSTmrOpt == OS_TMR_OPT_PERIODIC) {
0005b6 f894f894 LDRB r0,[r4,#0x30]
0005ba 2802 CMP r0,#2
0005bc d104 BNE |L1.1480|
;;;1106 OSTmr_Link(ptmr, OS_TMR_LINK_PERIODIC); /* Recalculate new position of timer in wheel */
0005be 2101 MOVS r1,#1
0005c0 4620 MOV r0,r4
0005c2 f7fff7ff BL OSTmr_Link
0005c6 e001 B |L1.1484|
|L1.1480|
;;;1107 } else {
;;;1108 ptmr->OSTmrState = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
0005c8 f884f884 STRB r7,[r4,#0x31]
|L1.1484|
;;;1109 }
;;;1110 }
;;;1111 ptmr = ptmr_next;
0005cc 462c MOV r4,r5
0005ce 2c00 CMP r4,#0
0005d0 d1e4 BNE |L1.1436|
|L1.1490|
;;;1112 }
;;;1113 OSTmr_Unlock();
0005d2 f7fff7ff BL OSTmr_Unlock
0005d6 e7d0 B |L1.1402|
;;;1114 }
;;;1115 }
;;;1116 #endif
ENDP
OSTmr_InitTask PROC
;;;878 static void OSTmr_InitTask (void)
;;;879 {
0005d8 b500 PUSH {lr}
0005da b087 SUB sp,sp,#0x1c
;;;880 #if OS_TASK_NAME_SIZE > 6
;;;881 INT8U err;
;;;882 #endif
;;;883
;;;884
;;;885 #if OS_TASK_CREATE_EXT_EN > 0
;;;886 #if OS_STK_GROWTH == 1
;;;887 (void)OSTaskCreateExt(OSTmr_Task,
0005dc 2303 MOVS r3,#3
0005de 2200 MOVS r2,#0
0005e0 e9cde9cd STRD r2,r3,[sp,#0xc]
0005e4 f64ff64f MOV r3,#0xfffd
0005e8 2180 MOVS r1,#0x80
0005ea 4833 LDR r0,|L1.1720|
0005ec 9300 STR r3,[sp,#0]
0005ee 9102 STR r1,[sp,#8]
0005f0 231d MOVS r3,#0x1d
0005f2 9001 STR r0,[sp,#4]
0005f4 f500f500 ADD r2,r0,#0x1fc
0005f8 2100 MOVS r1,#0
0005fa f2aff2af ADR r0,OSTmr_Task + 1
0005fe f7fff7ff BL OSTaskCreateExt
;;;888 (void *)0, /* No arguments passed to OSTmrTask() */
;;;889 &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;890 OS_TASK_TMR_PRIO,
;;;891 OS_TASK_TMR_ID,
;;;892 &OSTmrTaskStk[0], /* Set Bottom-Of-Stack */
;;;893 OS_TASK_TMR_STK_SIZE,
;;;894 (void *)0, /* No TCB extension */
;;;895 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
;;;896 #else
;;;897 (void)OSTaskCreateExt(OSTmr_Task,
;;;898 (void *)0, /* No arguments passed to OSTmrTask() */
;;;899 &OSTmrTaskStk[0], /* Set Top-Of-Stack */
;;;900 OS_TASK_TMR_PRIO,
;;;901 OS_TASK_TMR_ID,
;;;902 &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1], /* Set Bottom-Of-Stack */
;;;903 OS_TASK_TMR_STK_SIZE,
;;;904 (void *)0, /* No TCB extension */
;;;905 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
;;;906 #endif
;;;907 #else
;;;908 #if OS_STK_GROWTH == 1
;;;909 (void)OSTaskCreate(OSTmr_Task,
;;;910 (void *)0,
;;;911 &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1],
;;;912 OS_TASK_TMR_PRIO);
;;;913 #else
;;;914 (void)OSTaskCreate(OSTmr_Task,
;;;915 (void *)0,
;;;916 &OSTmrTaskStk[0],
;;;917 OS_TASK_TMR_PRIO);
;;;918 #endif
;;;919 #endif
;;;920
;;;921 #if OS_TASK_NAME_SIZE > 12
;;;922 OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"uC/OS-II Tmr", &err);
000602 aa06 ADD r2,sp,#0x18
000604 a12d ADR r1,|L1.1724|
000606 201d MOVS r0,#0x1d
000608 f7fff7ff BL OSTaskNameSet
;;;923 #else
;;;924 #if OS_TASK_NAME_SIZE > 6
;;;925 OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"OS-Tmr", &err);
;;;926 #endif
;;;927 #endif
;;;928 }
00060c b007 ADD sp,sp,#0x1c
00060e bd00 POP {pc}
;;;929 #endif
ENDP
OSTmr_Init PROC
;;;804 void OSTmr_Init (void)
;;;805 {
000610 b538 PUSH {r3-r5,lr}
;;;806 #if OS_EVENT_NAME_SIZE > 10
;;;807 INT8U err;
;;;808 #endif
;;;809 INT16U i;
;;;810 OS_TMR *ptmr1;
;;;811 OS_TMR *ptmr2;
;;;812
;;;813
;;;814 OS_MemClr((INT8U *)&OSTmrTbl[0], sizeof(OSTmrTbl)); /* Clear all the TMRs */
000612 f44ff44f MOV r1,#0x340
000616 482d LDR r0,|L1.1740|
000618 f7fff7ff BL OS_MemClr
;;;815 OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */
00061c 2140 MOVS r1,#0x40
00061e 4824 LDR r0,|L1.1712|
000620 f7fff7ff BL OS_MemClr
;;;816
;;;817 ptmr1 = &OSTmrTbl[0];
000624 4829 LDR r0,|L1.1740|
;;;818 ptmr2 = &OSTmrTbl[1];
000626 4604 MOV r4,r0
000628 f104f104 ADD r2,r4,#0x34
;;;819 for (i = 0; i < (OS_TMR_CFG_MAX - 1); i++) { /* Init. list of free TMRs */
00062c 2100 MOVS r1,#0
00062e 2300 MOVS r3,#0
000630 f04ff04f MOV lr,#0x64
000634 f04ff04f MOV r12,#0x3f
|L1.1592|
;;;820 ptmr1->OSTmrType = OS_TMR_TYPE;
000638 f880f880 STRB lr,[r0,#0]
;;;821 ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
00063c f880f880 STRB r3,[r0,#0x31]
;;;822 ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */
000640 60c2 STR r2,[r0,#0xc]
;;;823 #if OS_TMR_CFG_NAME_SIZE > 1
;;;824 ptmr1->OSTmrName[0] = '?'; /* Unknown name */
000642 f880f880 STRB r12,[r0,#0x20]
;;;825 ptmr1->OSTmrName[1] = OS_ASCII_NUL;
000646 f880f880 STRB r3,[r0,#0x21]
;;;826 #endif
;;;827 ptmr1++;
00064a 3034 ADDS r0,r0,#0x34
;;;828 ptmr2++;
00064c 3234 ADDS r2,r2,#0x34
00064e 1c49 ADDS r1,r1,#1
000650 b289 UXTH r1,r1
000652 290f CMP r1,#0xf
000654 d3f0 BCC |L1.1592|
;;;829 }
;;;830 ptmr1->OSTmrType = OS_TMR_TYPE;
000656 f880f880 STRB lr,[r0,#0]
;;;831 ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
00065a f880f880 STRB r3,[r0,#0x31]
;;;832 ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */
00065e 60c3 STR r3,[r0,#0xc]
;;;833 #if OS_TMR_CFG_NAME_SIZE > 1
;;;834 ptmr1->OSTmrName[0] = '?'; /* Unknown name */
000660 f880f880 STRB r12,[r0,#0x20]
;;;835 ptmr1->OSTmrName[1] = OS_ASCII_NUL;
000664 f880f880 STRB r3,[r0,#0x
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -