📄 os_tmr.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_tmr.o --depend=.\rvmdk\os_tmr.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2000\IAR -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -IC:\Keil\ARM\INC\Philips --omf_browse=.\rvmdk\os_tmr.crf ..\..\..\..\..\uCOS-II\Source\os_tmr.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSTmrCreate PROC
;;;119 INT8U *perr)
;;;120 {
000000 e92d5ff0 PUSH {r4-r12,lr}
000004 e1a08000 MOV r8,r0
;;;121 OS_TMR *ptmr;
;;;122 #if OS_TMR_CFG_NAME_SIZE > 0
;;;123 INT8U len;
;;;124 #endif
;;;125
;;;126
;;;127 #if OS_ARG_CHK_EN > 0
;;;128 if (perr == (INT8U *)0) { /* Validate arguments */
;;;129 return ((OS_TMR *)0);
;;;130 }
;;;131 switch (opt) {
;;;132 case OS_TMR_OPT_PERIODIC:
;;;133 if (period == 0) {
;;;134 *perr = OS_ERR_TMR_INVALID_PERIOD;
;;;135 return ((OS_TMR *)0);
;;;136 }
;;;137 break;
;;;138
;;;139 case OS_TMR_OPT_ONE_SHOT:
;;;140 if (dly == 0) {
;;;141 *perr = OS_ERR_TMR_INVALID_DLY;
;;;142 return ((OS_TMR *)0);
;;;143 }
;;;144 break;
;;;145
;;;146 default:
;;;147 *perr = OS_ERR_TMR_INVALID_OPT;
;;;148 return ((OS_TMR *)0);
;;;149 }
;;;150 #endif
;;;151 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
000008 e59f08bc LDR r0,|L1.2252|
00000c e59d5030 LDR r5,[sp,#0x30]
000010 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000014 e1a09001 MOV r9,r1 ;120
000018 e1a0a002 MOV r10,r2 ;120
00001c e3500000 CMP r0,#0
000020 e1a0b003 MOV r11,r3 ;120
;;;152 *perr = OS_ERR_TMR_ISR;
000024 13a0008b MOVNE r0,#0x8b
;;;153 return ((OS_TMR *)0);
000028 1a000018 BNE |L1.144|
;;;154 }
;;;155 OSTmr_Lock();
00002c ebfffffe BL OSTmr_Lock
000030 e59f0898 LDR r0,|L1.2256|
000034 e3a06000 MOV r6,#0
000038 e5904000 LDR r4,[r0,#0] ; OSTmrFreeList
00003c e3540000 CMP r4,#0
000040 01a04006 MOVEQ r4,r6
000044 0a00000b BEQ |L1.120|
000048 e594100c LDR r1,[r4,#0xc]
00004c e5801000 STR r1,[r0,#0] ; OSTmrFreeList
000050 e59f087c LDR r0,|L1.2260|
000054 e584600c STR r6,[r4,#0xc]
000058 e5846010 STR r6,[r4,#0x10]
00005c e1d010b0 LDRH r1,[r0,#0] ; OSTmrUsed
000060 e2811001 ADD r1,r1,#1
000064 e1c010b0 STRH r1,[r0,#0] ; OSTmrUsed
000068 e59f0868 LDR r0,|L1.2264|
00006c e1d010b0 LDRH r1,[r0,#0] ; OSTmrFree
000070 e2411001 SUB r1,r1,#1
000074 e1c010b0 STRH r1,[r0,#0] ; OSTmrFree
|L1.120|
000078 e59f785c LDR r7,|L1.2268|
;;;156 ptmr = OSTmr_Alloc(); /* Obtain a timer from the free pool */
;;;157 if (ptmr == (OS_TMR *)0) {
00007c e3540000 CMP r4,#0
000080 1a000006 BNE |L1.160|
000084 e5970000 LDR r0,[r7,#0] ; OSTmrSem
000088 ebfffffe BL OSSemPost
;;;158 OSTmr_Unlock();
;;;159 *perr = OS_ERR_TMR_NON_AVAIL;
00008c e3a00086 MOV r0,#0x86
|L1.144|
000090 e5c50000 STRB r0,[r5,#0]
;;;160 return ((OS_TMR *)0);
000094 e3a00000 MOV r0,#0
|L1.152|
000098 e8bd5ff0 POP {r4-r12,lr}
;;;161 }
;;;162 ptmr->OSTmrState = OS_TMR_STATE_STOPPED; /* Indicate that timer is not running yet */
;;;163 ptmr->OSTmrDly = dly;
;;;164 ptmr->OSTmrPeriod = period;
;;;165 ptmr->OSTmrOpt = opt;
;;;166 ptmr->OSTmrCallback = callback;
;;;167 ptmr->OSTmrCallbackArg = callback_arg;
;;;168 #if OS_TMR_CFG_NAME_SIZE > 0
;;;169 if (pname !=(INT8U *)0) {
;;;170 len = OS_StrLen(pname); /* Copy timer name */
;;;171 if (len < OS_TMR_CFG_NAME_SIZE) {
;;;172 (void)OS_StrCopy(ptmr->OSTmrName, pname);
;;;173 } else {
;;;174 #if OS_TMR_CFG_NAME_SIZE > 1
;;;175 ptmr->OSTmrName[0] = '#'; /* Invalid size specified */
;;;176 ptmr->OSTmrName[1] = OS_ASCII_NUL;
;;;177 #endif
;;;178 *perr = OS_ERR_TMR_NAME_TOO_LONG;
;;;179 OSTmr_Unlock();
;;;180 return (ptmr);
;;;181 }
;;;182 }
;;;183 #endif
;;;184 OSTmr_Unlock();
;;;185 *perr = OS_ERR_NONE;
;;;186 return (ptmr);
;;;187 }
00009c e12fff1e BX lr
|L1.160|
0000a0 e3a00001 MOV r0,#1 ;162
0000a4 e5c40031 STRB r0,[r4,#0x31] ;162
0000a8 e2840018 ADD r0,r4,#0x18 ;164
0000ac e8800300 STM r0,{r8,r9} ;164
0000b0 e5c4a030 STRB r10,[r4,#0x30] ;165
0000b4 e584b004 STR r11,[r4,#4] ;167
0000b8 e59d0028 LDR r0,[sp,#0x28] ;167
0000bc e5840008 STR r0,[r4,#8] ;169
0000c0 e59d002c LDR r0,[sp,#0x2c] ;169
0000c4 e3500000 CMP r0,#0 ;169
0000c8 0a000005 BEQ |L1.228|
0000cc ebfffffe BL OS_StrLen
0000d0 e3500010 CMP r0,#0x10 ;171
0000d4 2a000006 BCS |L1.244|
0000d8 e59d102c LDR r1,[sp,#0x2c] ;172
0000dc e2840020 ADD r0,r4,#0x20 ;172
0000e0 ebfffffe BL OS_StrCopy
|L1.228|
0000e4 e5970000 LDR r0,[r7,#0] ;172 ; OSTmrSem
0000e8 ebfffffe BL OSSemPost
0000ec e5c56000 STRB r6,[r5,#0] ;185
0000f0 ea000006 B |L1.272|
|L1.244|
0000f4 e3a00023 MOV r0,#0x23 ;175
0000f8 e5c40020 STRB r0,[r4,#0x20] ;175
0000fc e3a0008c MOV r0,#0x8c ;178
000100 e5c46021 STRB r6,[r4,#0x21] ;176
000104 e5c50000 STRB r0,[r5,#0] ;178
000108 e5970000 LDR r0,[r7,#0] ;178 ; OSTmrSem
00010c ebfffffe BL OSSemPost
|L1.272|
000110 e1a00004 MOV r0,r4 ;186
000114 eaffffdf B |L1.152|
;;;188 #endif
ENDP
OSTmr_Free PROC
;;;768 {
;;;769 ptmr->OSTmrState = OS_TMR_STATE_UNUSED; /* Clear timer object fields */
000118 e3a01000 MOV r1,#0
00011c e5c01031 STRB r1,[r0,#0x31]
;;;770 ptmr->OSTmrOpt = OS_TMR_OPT_NONE;
000120 e5c01030 STRB r1,[r0,#0x30]
;;;771 ptmr->OSTmrPeriod = 0;
;;;772 ptmr->OSTmrMatch = 0;
000124 e580101c STR r1,[r0,#0x1c]
;;;773 ptmr->OSTmrCallback = (OS_TMR_CALLBACK)0;
000128 e5801014 STR r1,[r0,#0x14]
;;;774 ptmr->OSTmrCallbackArg = (void *)0;
00012c e5801004 STR r1,[r0,#4]
;;;775 #if OS_TMR_CFG_NAME_SIZE > 1
;;;776 ptmr->OSTmrName[0] = '?'; /* Unknown name */
000130 e3a0203f MOV r2,#0x3f
000134 e5801008 STR r1,[r0,#8]
000138 e5c02020 STRB r2,[r0,#0x20]
;;;777 ptmr->OSTmrName[1] = OS_ASCII_NUL;
00013c e5c01021 STRB r1,[r0,#0x21]
;;;778 #endif
;;;779
;;;780 ptmr->OSTmrPrev = (OS_TCB *)0; /* Chain timer to free list */
000140 e5801010 STR r1,[r0,#0x10]
;;;781 ptmr->OSTmrNext = OSTmrFreeList;
000144 e59f1784 LDR r1,|L1.2256|
000148 e5912000 LDR r2,[r1,#0] ; OSTmrFreeList
;;;782 OSTmrFreeList = ptmr;
00014c e580200c STR r2,[r0,#0xc]
000150 e5810000 STR r0,[r1,#0] ; OSTmrFreeList
;;;783
;;;784 OSTmrUsed--; /* Update timer object statistics */
000154 e59f0778 LDR r0,|L1.2260|
000158 e1d010b0 LDRH r1,[r0,#0] ; OSTmrUsed
00015c e2411001 SUB r1,r1,#1
000160 e1c010b0 STRH r1,[r0,#0] ; OSTmrUsed
;;;785 OSTmrFree++;
000164 e59f076c LDR r0,|L1.2264|
000168 e1d010b0 LDRH r1,[r0,#0] ; OSTmrFree
00016c e2811001 ADD r1,r1,#1
000170 e1c010b0 STRH r1,[r0,#0] ; OSTmrFree
;;;786 }
000174 e12fff1e BX lr
;;;787 #endif
ENDP
OSTmr_Unlink PROC
;;;1006
;;;1007 spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
000178 e5901014 LDR r1,[r0,#0x14]
;;;1008 pspoke = &OSTmrWheelTbl[spoke];
00017c e59f275c LDR r2,|L1.2272|
000180 e2011007 AND r1,r1,#7 ;1007
000184 e0821181 ADD r1,r2,r1,LSL #3
;;;1009
;;;1010 if (pspoke->OSTmrFirst == ptmr) { /* See if timer to remove is at the beginning of list */
000188 e5913000 LDR r3,[r1,#0]
00018c e590200c LDR r2,[r0,#0xc]
000190 e1530000 CMP r3,r0
000194 e3a0c000 MOV r12,#0
000198 1a000003 BNE |L1.428|
;;;1011 ptmr1 = (OS_TMR *)ptmr->OSTmrNext;
;;;1012 pspoke->OSTmrFirst = (void *)ptmr1;
;;;1013 if (ptmr1 != (OS_TMR *)0) {
00019c e3520000 CMP r2,#0
0001a0 e5812000 STR r2,[r1,#0] ;1012
;;;1014 ptmr1->OSTmrPrev = (void *)0;
0001a4 1582c010 STRNE r12,[r2,#0x10]
0001a8 ea000003 B |L1.444|
|L1.428|
;;;1015 }
;;;1016 } else {
;;;1017 ptmr1 = (OS_TMR *)ptmr->OSTmrPrev; /* Remove timer from somewhere in the list */
;;;1018 ptmr2 = (OS_TMR *)ptmr->OSTmrNext;
;;;1019 ptmr1->OSTmrNext = ptmr2;
0001ac e5903010 LDR r3,[r0,#0x10]
;;;1020 if (ptmr2 != (OS_TMR *)0) {
0001b0 e3520000 CMP r2,#0
0001b4 e583200c STR r2,[r3,#0xc] ;1019
;;;1021 ptmr2->OSTmrPrev = (void *)ptmr1;
0001b8 15823010 STRNE r3,[r2,#0x10]
|L1.444|
;;;1022 }
;;;1023 }
;;;1024 ptmr->OSTmrState = OS_TMR_STATE_STOPPED;
0001bc e3a02001 MOV r2,#1
0001c0 e5c02031 STRB r2,[r0,#0x31]
;;;1025 ptmr->OSTmrNext = (void *)0;
;;;1026 ptmr->OSTmrPrev = (void *)0;
0001c4 e580c00c STR r12,[r0,#0xc]
0001c8 e580c010 STR r12,[r0,#0x10]
;;;1027 pspoke->OSTmrEntries--;
0001cc e1d100b4 LDRH r0,[r1,#4]
0001d0 e2400001 SUB r0,r0,#1
0001d4 e1c100b4 STRH r0,[r1,#4]
;;;1028 }
0001d8 e12fff1e BX lr
;;;1029 #endif
ENDP
OSTmrDel PROC
;;;214 INT8U *perr)
;;;215 {
0001dc e92d41f0 PUSH {r4-r8,lr}
0001e0 e1a06000 MOV r6,r0
;;;216 #if OS_ARG_CHK_EN > 0
;;;217 if (perr == (INT8U *)0) { /* Validate arguments */
;;;218 return (OS_FALSE);
;;;219 }
;;;220 if (ptmr == (OS_TMR *)0) {
;;;221 *perr = OS_ERR_TMR_INVALID;
;;;222 return (OS_FALSE);
;;;223 }
;;;224 #endif
;;;225 if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
0001e4 e5d00000 LDRB r0,[r0,#0]
0001e8 e1a04001 MOV r4,r1 ;215
0001ec e3500064 CMP r0,#0x64
;;;226 *perr = OS_ERR_TMR_INVALID_TYPE;
0001f0 13a00089 MOVNE r0,#0x89
;;;227 return (OS_FALSE);
0001f4 1a00001c BNE |L1.620|
;;;228 }
;;;229 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
0001f8 e59f06cc LDR r0,|L1.2252|
0001fc e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000200 e3500000 CMP r0,#0
;;;230 *perr = OS_ERR_TMR_ISR;
000204 13a0008b MOVNE r0,#0x8b
;;;231 return (OS_FALSE);
000208 1a000017 BNE |L1.620|
;;;232 }
;;;233 OSTmr_Lock();
00020c ebfffffe BL OSTmr_Lock
;;;234 switch (ptmr->OSTmrState) {
000210 e5d60031 LDRB r0,[r6,#0x31]
000214 e59f56c0 LDR r5,|L1.2268|
000218 e3500000 CMP r0,#0
00021c 0a00000f BEQ |L1.608|
000220 e3500001 CMP r0,#1
000224 13500002 CMPNE r0,#2
000228 e3a07000 MOV r7,#0
00022c 0a000003 BEQ |L1.576|
000230 e3500003 CMP r0,#3
000234 1a00000f BNE |L1.632|
;;;235 case OS_TMR_STATE_RUNNING:
;;;236 OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
000238 e1a00006 MOV r0,r6
00023c ebfffffe BL OSTmr_Unlink
|L1.576|
;;;237 OSTmr_Free(ptmr); /* Return timer to free list of timers */
;;;238 OSTmr_Unlock();
;;;239 *perr = OS_ERR_NONE;
;;;240 return (OS_TRUE);
;;;241
;;;242 case OS_TMR_STATE_STOPPED: /* Timer has not started or ... */
;;;243 case OS_TMR_STATE_COMPLETED: /* ... timer has completed the ONE-SHOT time */
;;;244 OSTmr_Free(ptmr); /* Return timer to free list of timers */
000240 e1a00006 MOV r0,r6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -