📄 os_tmr.txt
字号:
;;;678 OSTmr_Unlock();
;;;679 *perr = OS_ERR_TMR_INACTIVE;
;;;680 return (OS_FALSE);
;;;681
;;;682 default:
;;;683 OSTmr_Unlock();
;;;684 *perr = OS_ERR_TMR_INVALID_STATE;
;;;685 return (OS_FALSE);
;;;686 }
;;;687 }
000688 e12fff1e BX lr
|L1.1676|
00068c e5970000 LDR r0,[r7,#0] ; OSTmrSem
000690 ebfffffe BL OSSemPost
000694 e3a0008e MOV r0,#0x8e ;674
000698 e5c40000 STRB r0,[r4,#0] ;674
00069c eafffff7 B |L1.1664|
|L1.1696|
0006a0 e5970000 LDR r0,[r7,#0] ;675 ; OSTmrSem
0006a4 ebfffffe BL OSSemPost
0006a8 e3a00087 MOV r0,#0x87 ;679
|L1.1708|
0006ac e5c40000 STRB r0,[r4,#0] ;684
0006b0 e3a00000 MOV r0,#0 ;685
0006b4 eafffff2 B |L1.1668|
|L1.1720|
0006b8 e5970000 LDR r0,[r7,#0] ;685 ; OSTmrSem
0006bc ebfffffe BL OSSemPost
0006c0 e3a0008d MOV r0,#0x8d ;684
0006c4 eafffff8 B |L1.1708|
;;;688 #endif
ENDP
OSTmrSignal PROC
;;;715
;;;716 err = OSSemPost(OSTmrSemSignal);
0006c8 e59f0218 LDR r0,|L1.2280|
0006cc e5900000 LDR r0,[r0,#0] ; OSTmrSemSignal
0006d0 eafffffe B OSSemPost
;;;717 return (err);
;;;718 }
;;;719 #endif
ENDP
OSTmr_Task PROC
;;;1078 static void OSTmr_Task (void *p_arg)
;;;1079 {
0006d4 e92d43f8 PUSH {r3-r9,lr}
0006d8 e59f8208 LDR r8,|L1.2280|
0006dc e59f91fc LDR r9,|L1.2272|
0006e0 e59f61fc LDR r6,|L1.2276|
|L1.1764|
;;;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 */
0006e4 e5980000 LDR r0,[r8,#0] ; OSTmrSemSignal
0006e8 e28d2000 ADD r2,sp,#0
0006ec e3a01000 MOV r1,#0
0006f0 ebfffffe BL OSSemPend
;;;1091 OSTmr_Lock();
0006f4 ebfffffe BL OSTmr_Lock
;;;1092 OSTmrTime++; /* Increment the current time */
0006f8 e5960000 LDR r0,[r6,#0] ; OSTmrTime
;;;1093 spoke = (INT16U)(OSTmrTime % OS_TMR_CFG_WHEEL_SIZE); /* Position on current timer wheel entry */
;;;1094 pspoke = &OSTmrWheelTbl[spoke];
;;;1095 ptmr = pspoke->OSTmrFirst;
0006fc e3a07002 MOV r7,#2
000700 e2800001 ADD r0,r0,#1 ;1092
000704 e5860000 STR r0,[r6,#0] ;1092 ; OSTmrTime
000708 e2000007 AND r0,r0,#7 ;1093
00070c e7994180 LDR r4,[r9,r0,LSL #3]
000710 ea000014 B |L1.1896|
|L1.1812|
;;;1096 while (ptmr != (OS_TMR *)0) {
;;;1097 ptmr_next = (OS_TMR *)ptmr->OSTmrNext; /* Point to next timer to update because current ... */
;;;1098 /* ... timer could get unlinked from the wheel. */
;;;1099 if (OSTmrTime == ptmr->OSTmrMatch) { /* Process each timer that expires */
000714 e5940014 LDR r0,[r4,#0x14]
000718 e5961000 LDR r1,[r6,#0] ; OSTmrTime
00071c e594500c LDR r5,[r4,#0xc]
000720 e1500001 CMP r0,r1
000724 1a00000e BNE |L1.1892|
;;;1100 pfnct = ptmr->OSTmrCallback; /* Execute callback function if available */
000728 e5942004 LDR r2,[r4,#4]
;;;1101 if (pfnct != (OS_TMR_CALLBACK)0) {
00072c e3520000 CMP r2,#0
;;;1102 (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);
000730 15941008 LDRNE r1,[r4,#8]
000734 11a00004 MOVNE r0,r4
000738 11a0e00f MOVNE lr,pc
00073c 112fff12 BXNE r2
;;;1103 }
;;;1104 OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
000740 e1a00004 MOV r0,r4
000744 ebfffffe BL OSTmr_Unlink
;;;1105 if (ptmr->OSTmrOpt == OS_TMR_OPT_PERIODIC) {
000748 e5d40030 LDRB r0,[r4,#0x30]
00074c e3500002 CMP r0,#2
;;;1106 OSTmr_Link(ptmr, OS_TMR_LINK_PERIODIC); /* Recalculate new position of timer in wheel */
;;;1107 } else {
;;;1108 ptmr->OSTmrState = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
000750 15c47031 STRBNE r7,[r4,#0x31]
000754 1a000002 BNE |L1.1892|
000758 e3a01001 MOV r1,#1 ;1106
00075c e1a00004 MOV r0,r4 ;1106
000760 ebfffffe BL OSTmr_Link
|L1.1892|
;;;1109 }
;;;1110 }
;;;1111 ptmr = ptmr_next;
000764 e1a04005 MOV r4,r5
|L1.1896|
000768 e3540000 CMP r4,#0 ;1096
00076c 1affffe8 BNE |L1.1812|
000770 e59f0164 LDR r0,|L1.2268|
000774 e5900000 LDR r0,[r0,#0] ;1096 ; OSTmrSem
000778 ebfffffe BL OSSemPost
;;;1112 }
;;;1113 OSTmr_Unlock();
00077c eaffffd8 B |L1.1764|
;;;1114 }
;;;1115 }
;;;1116 #endif
ENDP
OSTmr_Init PROC
;;;804 void OSTmr_Init (void)
;;;805 {
000780 e92d4030 PUSH {r4,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 */
000784 e59f0160 LDR r0,|L1.2284|
000788 e24dd01c SUB sp,sp,#0x1c ;805
00078c e3a01d0d MOV r1,#0x340
000790 ebfffffe BL OS_MemClr
;;;815 OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */
000794 e59f0144 LDR r0,|L1.2272|
000798 e3a01040 MOV r1,#0x40
00079c ebfffffe BL OS_MemClr
;;;816
;;;817 ptmr1 = &OSTmrTbl[0];
0007a0 e59f0144 LDR r0,|L1.2284|
;;;818 ptmr2 = &OSTmrTbl[1];
;;;819 for (i = 0; i < (OS_TMR_CFG_MAX - 1); i++) { /* Init. list of free TMRs */
0007a4 e3a01000 MOV r1,#0
0007a8 e2804000 ADD r4,r0,#0 ;818
0007ac e2842034 ADD r2,r4,#0x34 ;818
0007b0 e1a03001 MOV r3,r1
0007b4 e3a0e064 MOV lr,#0x64
0007b8 e3a0c03f MOV r12,#0x3f
|L1.1980|
;;;820 ptmr1->OSTmrType = OS_TMR_TYPE;
0007bc e5c0e000 STRB lr,[r0,#0]
;;;821 ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
0007c0 e5c03031 STRB r3,[r0,#0x31]
;;;822 ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */
0007c4 e580200c STR r2,[r0,#0xc]
0007c8 e2811001 ADD r1,r1,#1 ;819
;;;823 #if OS_TMR_CFG_NAME_SIZE > 1
;;;824 ptmr1->OSTmrName[0] = '?'; /* Unknown name */
0007cc e5c0c020 STRB r12,[r0,#0x20]
0007d0 e3c11801 BIC r1,r1,#0x10000 ;819
;;;825 ptmr1->OSTmrName[1] = OS_ASCII_NUL;
0007d4 e5c03021 STRB r3,[r0,#0x21]
0007d8 e351000f CMP r1,#0xf ;819
;;;826 #endif
;;;827 ptmr1++;
0007dc e2800034 ADD r0,r0,#0x34
;;;828 ptmr2++;
0007e0 e2822034 ADD r2,r2,#0x34
0007e4 3afffff4 BCC |L1.1980|
;;;829 }
;;;830 ptmr1->OSTmrType = OS_TMR_TYPE;
0007e8 e5c0e000 STRB lr,[r0,#0]
;;;831 ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
0007ec e5c03031 STRB r3,[r0,#0x31]
;;;832 ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */
0007f0 e580300c STR r3,[r0,#0xc]
;;;833 #if OS_TMR_CFG_NAME_SIZE > 1
;;;834 ptmr1->OSTmrName[0] = '?'; /* Unknown name */
0007f4 e5c0c020 STRB r12,[r0,#0x20]
;;;835 ptmr1->OSTmrName[1] = OS_ASCII_NUL;
0007f8 e5c03021 STRB r3,[r0,#0x21]
;;;836 #endif
;;;837 OSTmrTime = 0;
0007fc e59f00e0 LDR r0,|L1.2276|
;;;838 OSTmrUsed = 0;
;;;839 OSTmrFree = OS_TMR_CFG_MAX;
000800 e59f10d0 LDR r1,|L1.2264|
000804 e5803000 STR r3,[r0,#0] ;837 ; OSTmrTime
000808 e59f00c4 LDR r0,|L1.2260|
00080c e1c030b0 STRH r3,[r0,#0] ;838 ; OSTmrUsed
000810 e3a00010 MOV r0,#0x10
000814 e1c100b0 STRH r0,[r1,#0] ; OSTmrFree
;;;840 OSTmrFreeList = &OSTmrTbl[0];
000818 e59f00b0 LDR r0,|L1.2256|
00081c e5804000 STR r4,[r0,#0] ; OSTmrFreeList
;;;841 OSTmrSem = OSSemCreate(1);
000820 e3a00001 MOV r0,#1
000824 ebfffffe BL OSSemCreate
000828 e59f40ac LDR r4,|L1.2268|
00082c e5840000 STR r0,[r4,#0] ; OSTmrSem
;;;842 OSTmrSemSignal = OSSemCreate(0);
000830 e3a00000 MOV r0,#0
000834 ebfffffe BL OSSemCreate
000838 e59f50a8 LDR r5,|L1.2280|
;;;843
;;;844 #if OS_EVENT_NAME_SIZE > 18
;;;845 OSEventNameSet(OSTmrSem, (INT8U *)"uC/OS-II TmrLock", &err);/* Assign names to semaphores */
;;;846 #else
;;;847 #if OS_EVENT_NAME_SIZE > 10
;;;848 OSEventNameSet(OSTmrSem, (INT8U *)"OS-TmrLock", &err);
00083c e28d2018 ADD r2,sp,#0x18
000840 e5850000 STR r0,[r5,#0] ; OSTmrSemSignal
000844 e5940000 LDR r0,[r4,#0] ; OSTmrSem
000848 e28f10a0 ADR r1,|L1.2288|
00084c ebfffffe BL OSEventNameSet
;;;849 #endif
;;;850 #endif
;;;851
;;;852 #if OS_EVENT_NAME_SIZE > 18
;;;853 OSEventNameSet(OSTmrSemSignal, (INT8U *)"uC/OS-II TmrSignal", &err);
;;;854 #else
;;;855 #if OS_EVENT_NAME_SIZE > 10
;;;856 OSEventNameSet(OSTmrSemSignal, (INT8U *)"OS-TmrSig", &err);
000850 e5950000 LDR r0,[r5,#0] ; OSTmrSemSignal
000854 e28d2018 ADD r2,sp,#0x18
000858 e28f109c ADR r1,|L1.2300|
00085c ebfffffe BL OSEventNameSet
000860 e59f00a0 LDR r0,|L1.2312|
000864 e3a03003 MOV r3,#3
000868 e3a02000 MOV r2,#0
00086c e3a01080 MOV r1,#0x80
000870 e98d000f STMIB sp,{r0-r3}
000874 e0633481 RSB r3,r3,r1,LSL #9
000878 e2802f7f ADD r2,r0,#0x1fc
00087c e58d3000 STR r3,[sp,#0]
000880 e3a0301d MOV r3,#0x1d
000884 e3a01000 MOV r1,#0
000888 e24f0f6f ADR r0,OSTmr_Task
00088c ebfffffe BL OSTaskCreateExt
000890 e28d2014 ADD r2,sp,#0x14
000894 e28f1070 ADR r1,|L1.2316|
000898 e3a0001d MOV r0,#0x1d
00089c ebfffffe BL OSTaskNameSet
;;;857 #endif
;;;858 #endif
;;;859
;;;860 OSTmr_InitTask();
;;;861 }
0008a0 e28dd01c ADD sp,sp,#0x1c
0008a4 e8bd4030 POP {r4,r5,lr}
0008a8 e12fff1e BX lr
;;;862 #endif
ENDP
OSTmr_Lock PROC
0008ac e92d4008 PUSH {r3,lr} ;0
0008b0 e59f0024 LDR r0,|L1.2268|
0008b4 e28d2000 ADD r2,sp,#0 ;0
0008b8 e5900000 LDR r0,[r0,#0] ;0 ; OSTmrSem
0008bc e3a01000 MOV r1,#0 ;0
0008c0 ebfffffe BL OSSemPend
0008c4 e8bd4008 POP {r3,lr} ;0
0008c8 e12fff1e BX lr ;0
ENDP
|L1.2252|
0008cc 00000000 DCD OSIntNesting
|L1.2256|
0008d0 00000000 DCD OSTmrFreeList
|L1.2260|
0008d4 00000000 DCD OSTmrUsed
|L1.2264|
0008d8 00000000 DCD OSTmrFree
|L1.2268|
0008dc 00000000 DCD OSTmrSem
|L1.2272|
0008e0 00000000 DCD OSTmrWheelTbl
|L1.2276|
0008e4 00000000 DCD OSTmrTime
|L1.2280|
0008e8 00000000 DCD OSTmrSemSignal
|L1.2284|
0008ec 00000000 DCD OSTmrTbl
|L1.2288|
0008f0 4f532d54 DCB "OS-T"
0008f4 6d724c6f DCB "mrLo"
0008f8 636b0000 DCB "ck\0\0"
|L1.2300|
0008fc 4f532d54 DCB "OS-T"
000900 6d725369 DCB "mrSi"
000904 67000000 DCB "g\0\0\0"
|L1.2312|
000908 00000000 DCD OSTmrTaskStk
|L1.2316|
00090c 75432f4f DCB "uC/O"
000910 532d4949 DCB "S-II"
000914 20546d72 DCB " Tmr"
000918 00000000 DCB "\0\0\0\0"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -