📄 os_time.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_time.o --depend=.\rvmdk\os_time.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_time.crf ..\..\..\..\..\uCOS-II\Source\os_time.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSTimeDly PROC
;;;44 void OSTimeDly (INT16U ticks)
;;;45 {
000000 e92d4010 PUSH {r4,lr}
000004 e1a04000 MOV r4,r0
;;;46 INT8U y;
;;;47 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;48 OS_CPU_SR cpu_sr = 0;
;;;49 #endif
;;;50
;;;51
;;;52
;;;53 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
000008 e59f0208 LDR r0,|L1.536|
00000c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000010 e3500000 CMP r0,#0
000014 1a000015 BNE |L1.112|
;;;54 return;
;;;55 }
;;;56 if (ticks > 0) { /* 0 means no delay! */
000018 e3540000 CMP r4,#0
00001c 0a000013 BEQ |L1.112|
;;;57 OS_ENTER_CRITICAL();
000020 ebfffffe BL OS_CPU_SR_Save
;;;58 y = OSTCBCur->OSTCBY; /* Delay current task */
000024 e59f11f0 LDR r1,|L1.540|
;;;59 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
000028 e59f31f0 LDR r3,|L1.544|
00002c e5912000 LDR r2,[r1,#0] ;58 ; OSTCBCur
000030 e5d21030 LDRB r1,[r2,#0x30] ;58
000034 e5d2e031 LDRB lr,[r2,#0x31]
000038 e7d3c001 LDRB r12,[r3,r1]
00003c e1ccc00e BIC r12,r12,lr
000040 e7c3c001 STRB r12,[r3,r1]
;;;60 if (OSRdyTbl[y] == 0) {
000044 e7d31001 LDRB r1,[r3,r1]
000048 e3510000 CMP r1,#0
;;;61 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
00004c 059f11d0 LDREQ r1,|L1.548|
000050 05d23032 LDRBEQ r3,[r2,#0x32]
000054 05d1c000 LDRBEQ r12,[r1,#0] ; OSRdyGrp
000058 01cc3003 BICEQ r3,r12,r3
00005c 05c13000 STRBEQ r3,[r1,#0] ; OSRdyGrp
;;;62 }
;;;63 OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
000060 e1c242ba STRH r4,[r2,#0x2a]
;;;64 OS_EXIT_CRITICAL();
000064 ebfffffe BL OS_CPU_SR_Restore
;;;65 OS_Sched(); /* Find next task to run! */
000068 e8bd4010 POP {r4,lr}
00006c eafffffe B OS_Sched
|L1.112|
;;;66 }
;;;67 }
000070 e8bd4010 POP {r4,lr}
000074 e12fff1e BX lr
;;;68 /*$PAGE*/
ENDP
OSTimeDlyHMSM PROC
;;;96 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U ms)
;;;97 {
000078 e92d4070 PUSH {r4-r6,lr}
00007c e1a04000 MOV r4,r0
;;;98 INT32U ticks;
;;;99 INT16U loops;
;;;100
;;;101
;;;102 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
000080 e59f0190 LDR r0,|L1.536|
000084 e1a06001 MOV r6,r1 ;97
000088 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00008c e1a05002 MOV r5,r2 ;97
000090 e3500000 CMP r0,#0
;;;103 return (OS_ERR_TIME_DLY_ISR);
000094 13a00055 MOVNE r0,#0x55
000098 1a00001b BNE |L1.268|
;;;104 }
;;;105 #if OS_ARG_CHK_EN > 0
;;;106 if (hours == 0) {
;;;107 if (minutes == 0) {
;;;108 if (seconds == 0) {
;;;109 if (ms == 0) {
;;;110 return (OS_ERR_TIME_ZERO_DLY);
;;;111 }
;;;112 }
;;;113 }
;;;114 }
;;;115 if (minutes > 59) {
;;;116 return (OS_ERR_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
;;;117 }
;;;118 if (seconds > 59) {
;;;119 return (OS_ERR_TIME_INVALID_SECONDS);
;;;120 }
;;;121 if (ms > 999) {
;;;122 return (OS_ERR_TIME_INVALID_MS);
;;;123 }
;;;124 #endif
;;;125 /* Compute the total number of clock ticks required.. */
;;;126 /* .. (rounded to the nearest tick) */
;;;127 ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
00009c e2830005 ADD r0,r3,#5
0000a0 e3a01064 MOV r1,#0x64
0000a4 e0000091 MUL r0,r1,r0
0000a8 e3a01ffa MOV r1,#0x3e8
0000ac ebfffffe BL __aeabi_uidivmod
0000b0 e3a01ee1 MOV r1,#0xe10
0000b4 e0010194 MUL r1,r4,r1
0000b8 e0662206 RSB r2,r6,r6,LSL #4
0000bc e0811102 ADD r1,r1,r2,LSL #2
0000c0 e0811005 ADD r1,r1,r5
0000c4 e3a02019 MOV r2,#0x19
0000c8 e0010192 MUL r1,r2,r1
0000cc e0800101 ADD r0,r0,r1,LSL #2
;;;128 + OS_TICKS_PER_SEC * ((INT32U)ms + 500L / OS_TICKS_PER_SEC) / 1000L;
;;;129 loops = (INT16U)(ticks >> 16); /* Compute the integral number of 65536 tick delays */
0000d0 e1a04820 LSR r4,r0,#16
;;;130 ticks = ticks & 0xFFFFL; /* Obtain the fractional number of ticks */
0000d4 e1a00800 LSL r0,r0,#16
0000d8 e1a00820 LSR r0,r0,#16
;;;131 OSTimeDly((INT16U)ticks);
0000dc ebfffffe BL OSTimeDly
;;;132 while (loops > 0) {
0000e0 ea000006 B |L1.256|
|L1.228|
;;;133 OSTimeDly((INT16U)32768u);
0000e4 e3a00902 MOV r0,#0x8000
0000e8 ebfffffe BL OSTimeDly
;;;134 OSTimeDly((INT16U)32768u);
0000ec e3a00902 MOV r0,#0x8000
0000f0 ebfffffe BL OSTimeDly
;;;135 loops--;
0000f4 e2440001 SUB r0,r4,#1
0000f8 e1a04800 LSL r4,r0,#16
0000fc e1a04824 LSR r4,r4,#16
|L1.256|
000100 e3540000 CMP r4,#0 ;132
000104 1afffff6 BNE |L1.228|
;;;136 }
;;;137 return (OS_ERR_NONE);
000108 e3a00000 MOV r0,#0
|L1.268|
00010c e8bd4070 POP {r4-r6,lr}
;;;138 }
000110 e12fff1e BX lr
;;;139 #endif
ENDP
OSTimeDlyResume PROC
;;;167 INT8U OSTimeDlyResume (INT8U prio)
;;;168 {
000114 e92d4010 PUSH {r4,lr}
;;;169 OS_TCB *ptcb;
;;;170 #if OS_CRITICAL_METHOD == 3 /* Storage for CPU status register */
;;;171 OS_CPU_SR cpu_sr = 0;
;;;172 #endif
;;;173
;;;174
;;;175
;;;176 if (prio >= OS_LOWEST_PRIO) {
000118 e350001f CMP r0,#0x1f
00011c e1a04000 MOV r4,r0 ;168
;;;177 return (OS_ERR_PRIO_INVALID);
000120 23a0002a MOVCS r0,#0x2a
000124 2a000007 BCS |L1.328|
;;;178 }
;;;179 OS_ENTER_CRITICAL();
000128 ebfffffe BL OS_CPU_SR_Save
;;;180 ptcb = OSTCBPrioTbl[prio]; /* Make sure that task exist */
00012c e59f10f4 LDR r1,|L1.552|
000130 e7911104 LDR r1,[r1,r4,LSL #2]
;;;181 if (ptcb == (OS_TCB *)0) {
000134 e3510000 CMP r1,#0
;;;182 OS_EXIT_CRITICAL();
;;;183 return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
;;;184 }
;;;185 if (ptcb == OS_TCB_RESERVED) {
000138 13510001 CMPNE r1,#1
00013c 1a000003 BNE |L1.336|
;;;186 OS_EXIT_CRITICAL();
000140 ebfffffe BL OS_CPU_SR_Restore
;;;187 return (OS_ERR_TASK_NOT_EXIST); /* The task does not exist */
000144 e3a00043 MOV r0,#0x43
|L1.328|
000148 e8bd4010 POP {r4,lr}
;;;188 }
;;;189 if (ptcb->OSTCBDly == 0) { /* See if task is delayed */
;;;190 OS_EXIT_CRITICAL();
;;;191 return (OS_ERR_TIME_NOT_DLY); /* Indicate that task was not delayed */
;;;192 }
;;;193
;;;194 ptcb->OSTCBDly = 0; /* Clear the time delay */
;;;195 if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
;;;196 ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
;;;197 ptcb->OSTCBStatPend = OS_STAT_PEND_TO; /* Indicate PEND timeout */
;;;198 } else {
;;;199 ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
;;;200 }
;;;201 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
;;;202 OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
;;;203 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;204 OS_EXIT_CRITICAL();
;;;205 OS_Sched(); /* See if this is new highest priority */
;;;206 } else {
;;;207 OS_EXIT_CRITICAL(); /* Task may be suspended */
;;;208 }
;;;209 return (OS_ERR_NONE);
;;;210 }
00014c e12fff1e BX lr
|L1.336|
000150 e1d122ba LDRH r2,[r1,#0x2a] ;189
000154 e3520000 CMP r2,#0 ;189
000158 1a000002 BNE |L1.360|
00015c ebfffffe BL OS_CPU_SR_Restore
000160 e3a00050 MOV r0,#0x50 ;191
000164 eafffff7 B |L1.328|
|L1.360|
000168 e3a03000 MOV r3,#0 ;194
00016c e1c132ba STRH r3,[r1,#0x2a] ;194
000170 e5d1202c LDRB r2,[r1,#0x2c] ;195
000174 e3120037 TST r2,#0x37 ;195
000178 13c22037 BICNE r2,r2,#0x37 ;196
00017c 05c1302d STRBEQ r3,[r1,#0x2d] ;199
000180 15c1202c STRBNE r2,[r1,#0x2c] ;196
000184 13a02001 MOVNE r2,#1 ;197
000188 15c1202d STRBNE r2,[r1,#0x2d] ;197
00018c e5d1202c LDRB r2,[r1,#0x2c] ;201
000190 e3120008 TST r2,#8 ;201
000194 1a00000d BNE |L1.464|
000198 e59f2084 LDR r2,|L1.548|
00019c e5d13032 LDRB r3,[r1,#0x32] ;202
0001a0 e5d2c000 LDRB r12,[r2,#0] ;202 ; OSRdyGrp
0001a4 e183300c ORR r3,r3,r12 ;202
0001a8 e5c23000 STRB r3,[r2,#0] ;202 ; OSRdyGrp
0001ac e5d12030 LDRB r2,[r1,#0x30] ;203
0001b0 e59f3068 LDR r3,|L1.544|
0001b4 e5d11031 LDRB r1,[r1,#0x31] ;203
0001b8 e7d3c002 LDRB r12,[r3,r2] ;203
0001bc e181100c ORR r1,r1,r12 ;203
0001c0 e7c31002 STRB r1,[r3,r2] ;203
0001c4 ebfffffe BL OS_CPU_SR_Restore
0001c8 ebfffffe BL OS_Sched
0001cc ea000000 B |L1.468|
|L1.464|
0001d0 ebfffffe BL OS_CPU_SR_Restore
|L1.468|
0001d4 e3a00000 MOV r0,#0 ;209
0001d8 eaffffda B |L1.328|
;;;211 #endif
ENDP
OSTimeGet PROC
;;;227 INT32U OSTimeGet (void)
;;;228 {
0001dc e92d4010 PUSH {r4,lr}
;;;229 INT32U ticks;
;;;230 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;231 OS_CPU_SR cpu_sr = 0;
;;;232 #endif
;;;233
;;;234
;;;235
;;;236 OS_ENTER_CRITICAL();
0001e0 ebfffffe BL OS_CPU_SR_Save
;;;237 ticks = OSTime;
0001e4 e59f1040 LDR r1,|L1.556|
0001e8 e5914000 LDR r4,[r1,#0] ; OSTime
;;;238 OS_EXIT_CRITICAL();
0001ec ebfffffe BL OS_CPU_SR_Restore
;;;239 return (ticks);
0001f0 e1a00004 MOV r0,r4
0001f4 e8bd4010 POP {r4,lr}
;;;240 }
0001f8 e12fff1e BX lr
;;;241 #endif
ENDP
OSTimeSet PROC
;;;256 void OSTimeSet (INT32U ticks)
;;;257 {
0001fc e92d4010 PUSH {r4,lr}
000200 e1a04000 MOV r4,r0
;;;258 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;259 OS_CPU_SR cpu_sr = 0;
;;;260 #endif
;;;261
;;;262
;;;263
;;;264 OS_ENTER_CRITICAL();
000204 ebfffffe BL OS_CPU_SR_Save
;;;265 OSTime = ticks;
000208 e59f101c LDR r1,|L1.556|
00020c e5814000 STR r4,[r1,#0] ; OSTime
;;;266 OS_EXIT_CRITICAL();
000210 e8bd4010 POP {r4,lr}
000214 eafffffe B OS_CPU_SR_Restore
;;;267 }
;;;268 #endif
ENDP
|L1.536|
000218 00000000 DCD OSIntNesting
|L1.540|
00021c 00000000 DCD OSTCBCur
|L1.544|
000220 00000000 DCD OSRdyTbl
|L1.548|
000224 00000000 DCD OSRdyGrp
|L1.552|
000228 00000000 DCD OSTCBPrioTbl
|L1.556|
00022c 00000000 DCD OSTime
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -