📄 os_time.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_time.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\OS_TIME.C]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
OSTimeDly PROC
;;;35 void OSTimeDly (INT16U ticks)
;;;36 {
000000 e92d4010 PUSH {r4,lr}
000004 e1a04000 MOV r4,r0
;;;37 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;38 OS_CPU_SR cpu_sr;
;;;39 #endif
;;;40
;;;41
;;;42 if (ticks > 0) { /* 0 means no delay! */
000008 e3540000 CMP r4,#0
00000c da00001d BLE |L1.136|
;;;43 OS_ENTER_CRITICAL();
000010 ef000002 SVC 0x2 ; formerly SWI
;;;44 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* Delay current task */
000014 e59f0240 LDR r0,|L1.604|
000018 e5900000 LDR r0,[r0,#0] ; OSTCBCur
00001c e5d0001f LDRB r0,[r0,#0x1f]
000020 e59f1238 LDR r1,|L1.608|
000024 e7d10000 LDRB r0,[r1,r0]
000028 e59f122c LDR r1,|L1.604|
00002c e5911000 LDR r1,[r1,#0] ; OSTCBCur
000030 e5d11020 LDRB r1,[r1,#0x20]
000034 e1c00001 BIC r0,r0,r1
000038 e21000ff ANDS r0,r0,#0xff
00003c e59f1218 LDR r1,|L1.604|
000040 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000044 e5d1101f LDRB r1,[r1,#0x1f]
000048 e59f2210 LDR r2,|L1.608|
00004c e7c20001 STRB r0,[r2,r1]
000050 1a000007 BNE |L1.116|
;;;45 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000054 e59f0200 LDR r0,|L1.604|
000058 e5900000 LDR r0,[r0,#0] ; OSTCBCur
00005c e5d00021 LDRB r0,[r0,#0x21]
000060 e59f11fc LDR r1,|L1.612|
000064 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000068 e1c10000 BIC r0,r1,r0
00006c e59f11f0 LDR r1,|L1.612|
000070 e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
;;;46 }
;;;47 OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
|L1.116|
000074 e59f01e0 LDR r0,|L1.604|
000078 e5900000 LDR r0,[r0,#0] ; OSTCBCur
00007c e1c041ba STRH r4,[r0,#0x1a]
;;;48 OS_EXIT_CRITICAL();
000080 ef000003 SVC 0x3 ; formerly SWI
;;;49 OS_Sched(); /* Find next task to run! */
000084 ebfffffe BL OS_Sched
;;;50 }
;;;51 }
|L1.136|
000088 e8bd8010 POP {r4,pc}
ENDP
OSTimeDlyHMSM PROC
;;;79 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
;;;80 {
00008c e92d47f0 PUSH {r4-r10,lr}
000090 e1a04000 MOV r4,r0
000094 e1a05001 MOV r5,r1
000098 e1a06002 MOV r6,r2
00009c e1a07003 MOV r7,r3
;;;81 INT32U ticks;
;;;82 INT16U loops;
;;;83
;;;84
;;;85 if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
0000a0 e3540000 CMP r4,#0
0000a4 ca000005 BGT |L1.192|
0000a8 e3550000 CMP r5,#0
0000ac ca000003 BGT |L1.192|
0000b0 e3560000 CMP r6,#0
0000b4 ca000001 BGT |L1.192|
0000b8 e3570000 CMP r7,#0
0000bc da000029 BLE |L1.360|
;;;86 if (minutes > 59) {
|L1.192|
0000c0 e355003b CMP r5,#0x3b
0000c4 da000001 BLE |L1.208|
;;;87 return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
0000c8 e3a00051 MOV r0,#0x51
;;;88 }
;;;89 if (seconds > 59) {
;;;90 return (OS_TIME_INVALID_SECONDS);
;;;91 }
;;;92 if (milli > 999) {
;;;93 return (OS_TIME_INVALID_MILLI);
;;;94 }
;;;95 /* Compute the total number of clock ticks required.. */
;;;96 /* .. (rounded to the nearest tick) */
;;;97 ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
;;;98 + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
;;;99 loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
;;;100 ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
;;;101 OSTimeDly((INT16U)ticks);
;;;102 while (loops > 0) {
;;;103 OSTimeDly(32768);
;;;104 OSTimeDly(32768);
;;;105 loops--;
;;;106 }
;;;107 return (OS_NO_ERR);
;;;108 }
;;;109 return (OS_TIME_ZERO_DLY);
;;;110 }
|L1.204|
0000cc e8bd87f0 POP {r4-r10,pc}
|L1.208|
0000d0 e356003b CMP r6,#0x3b ;89
0000d4 da000001 BLE |L1.224| ;89
0000d8 e3a00052 MOV r0,#0x52 ;90
0000dc eafffffa B |L1.204| ;90
|L1.224|
0000e0 e3570ffa CMP r7,#0x3e8 ;92
0000e4 ba000001 BLT |L1.240| ;92
0000e8 e3a00053 MOV r0,#0x53 ;93
0000ec eafffff6 B |L1.204| ;93
|L1.240|
0000f0 e2871002 ADD r1,r7,#2 ;97
0000f4 e3a020c8 MOV r2,#0xc8 ;97
0000f8 e0000291 MUL r0,r1,r2 ;97
0000fc e3a01ffa MOV r1,#0x3e8 ;97
000100 ebfffffe BL __aeabi_uidivmod ;97
000104 e3a01ee1 MOV r1,#0xe10 ;97
000108 e0010194 MUL r1,r4,r1 ;97
00010c e0652205 RSB r2,r5,r5,LSL #4 ;97
000110 e0811102 ADD r1,r1,r2,LSL #2 ;97
000114 e0811006 ADD r1,r1,r6 ;97
000118 e3a02019 MOV r2,#0x19 ;97
00011c e0010192 MUL r1,r2,r1 ;97
000120 e0808181 ADD r8,r0,r1,LSL #3 ;97
000124 e59f013c LDR r0,|L1.616| ;99
000128 e0009828 AND r9,r0,r8,LSR #16 ;99
00012c e0088000 AND r8,r8,r0 ;100
000130 e1a00008 MOV r0,r8 ;101
000134 ebfffffe BL OSTimeDly ;101
000138 ea000006 B |L1.344| ;102
|L1.316|
00013c e3a00902 MOV r0,#0x8000 ;103
000140 ebfffffe BL OSTimeDly ;103
000144 e3a00902 MOV r0,#0x8000 ;104
000148 ebfffffe BL OSTimeDly ;104
00014c e2490001 SUB r0,r9,#1 ;105
000150 e1a09800 LSL r9,r0,#16 ;105
000154 e1a09829 LSR r9,r9,#16 ;105
|L1.344|
000158 e3590000 CMP r9,#0 ;102
00015c cafffff6 BGT |L1.316| ;102
000160 e3a00000 MOV r0,#0 ;107
000164 eaffffd8 B |L1.204| ;107
|L1.360|
000168 e3a00054 MOV r0,#0x54 ;109
00016c eaffffd6 B |L1.204| ;109
ENDP
OSTimeDlyResume PROC
;;;138 INT8U OSTimeDlyResume (INT8U prio)
;;;139 {
000170 e92d4070 PUSH {r4-r6,lr}
000174 e1a05000 MOV r5,r0
;;;140 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;141 OS_CPU_SR cpu_sr;
;;;142 #endif
;;;143 OS_TCB *ptcb;
;;;144
;;;145
;;;146 if (prio >= OS_LOWEST_PRIO) {
000178 e355000c CMP r5,#0xc
00017c ba000001 BLT |L1.392|
;;;147 return (OS_PRIO_INVALID);
000180 e3a0002a MOV r0,#0x2a
;;;148 }
;;;149 OS_ENTER_CRITICAL();
;;;150 ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* Make sure that task exist */
;;;151 if (ptcb != (OS_TCB *)0) {
;;;152 if (ptcb->OSTCBDly != 0) { /* See if task is delayed */
;;;153 ptcb->OSTCBDly = 0; /* Clear the time delay */
;;;154 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00) { /* See if task is ready to run */
;;;155 OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
;;;156 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;157 OS_EXIT_CRITICAL();
;;;158 OS_Sched(); /* See if this is new highest priority */
;;;159 } else {
;;;160 OS_EXIT_CRITICAL(); /* Task may be suspended */
;;;161 }
;;;162 return (OS_NO_ERR);
;;;163 } else {
;;;164 OS_EXIT_CRITICAL();
;;;165 return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */
;;;166 }
;;;167 }
;;;168 OS_EXIT_CRITICAL();
;;;169 return (OS_TASK_NOT_EXIST); /* The task does not exist */
;;;170 }
|L1.388|
000184 e8bd8070 POP {r4-r6,pc}
|L1.392|
000188 ef000002 SVC 0x2 ; formerly SWI ;149
00018c e59f00d8 LDR r0,|L1.620| ;150
000190 e7904105 LDR r4,[r0,r5,LSL #2] ;150
000194 e3540000 CMP r4,#0 ;151
000198 0a00001e BEQ |L1.536| ;151
00019c e1d401ba LDRH r0,[r4,#0x1a] ;152
0001a0 e3500000 CMP r0,#0 ;152
0001a4 0a000018 BEQ |L1.524| ;152
0001a8 e3a00000 MOV r0,#0 ;153
0001ac e1c401ba STRH r0,[r4,#0x1a] ;153
0001b0 e5d4001c LDRB r0,[r4,#0x1c] ;154
0001b4 e3100008 TST r0,#8 ;154
0001b8 1a000010 BNE |L1.512| ;154
0001bc e5d40021 LDRB r0,[r4,#0x21] ;155
0001c0 e59f109c LDR r1,|L1.612| ;155
0001c4 e5d11000 LDRB r1,[r1,#0] ;155 ; OSRdyGrp
0001c8 e1800001 ORR r0,r0,r1 ;155
0001cc e59f1090 LDR r1,|L1.612| ;155
0001d0 e5c10000 STRB r0,[r1,#0] ;155 ; OSRdyGrp
0001d4 e5d4001f LDRB r0,[r4,#0x1f] ;156
0001d8 e59f1080 LDR r1,|L1.608| ;156
0001dc e7d10000 LDRB r0,[r1,r0] ;156
0001e0 e5d41020 LDRB r1,[r4,#0x20] ;156
0001e4 e1800001 ORR r0,r0,r1 ;156
0001e8 e5d4101f LDRB r1,[r4,#0x1f] ;156
0001ec e59f206c LDR r2,|L1.608| ;156
0001f0 e7c20001 STRB r0,[r2,r1] ;156
0001f4 ef000003 SVC 0x3 ; formerly SWI ;157
0001f8 ebfffffe BL OS_Sched ;158
0001fc ea000000 B |L1.516| ;158
|L1.512|
000200 ef000003 SVC 0x3 ; formerly SWI ;160
|L1.516|
000204 e3a00000 MOV r0,#0 ;162
000208 eaffffdd B |L1.388| ;162
|L1.524|
00020c ef000003 SVC 0x3 ; formerly SWI ;164
000210 e3a00050 MOV r0,#0x50 ;165
000214 eaffffda B |L1.388| ;165
|L1.536|
000218 ef000003 SVC 0x3 ; formerly SWI ;168
00021c e3a0000b MOV r0,#0xb ;169
000220 eaffffd7 B |L1.388| ;169
ENDP
OSTimeGet PROC
;;;187 INT32U OSTimeGet (void)
;;;188 {
000224 e92d4010 PUSH {r4,lr}
;;;189 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;190 OS_CPU_SR cpu_sr;
;;;191 #endif
;;;192 INT32U ticks;
;;;193
;;;194
;;;195 OS_ENTER_CRITICAL();
000228 ef000002 SVC 0x2 ; formerly SWI
;;;196 ticks = OSTime;
00022c e59f003c LDR r0,|L1.624|
000230 e5904000 LDR r4,[r0,#0] ; OSTime
;;;197 OS_EXIT_CRITICAL();
000234 ef000003 SVC 0x3 ; formerly SWI
;;;198 return (ticks);
000238 e1a00004 MOV r0,r4
;;;199 }
00023c e8bd8010 POP {r4,pc}
ENDP
OSTimeSet PROC
;;;215 void OSTimeSet (INT32U ticks)
;;;216 {
000240 e92d4010 PUSH {r4,lr}
000244 e1a04000 MOV r4,r0
;;;217 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;218 OS_CPU_SR cpu_sr;
;;;219 #endif
;;;220
;;;221
;;;222 OS_ENTER_CRITICAL();
000248 ef000002 SVC 0x2 ; formerly SWI
;;;223 OSTime = ticks;
00024c e59f001c LDR r0,|L1.624|
000250 e5804000 STR r4,[r0,#0] ; OSTime
;;;224 OS_EXIT_CRITICAL();
000254 ef000003 SVC 0x3 ; formerly SWI
;;;225 }
000258 e8bd8010 POP {r4,pc}
|L1.604|
00025c 00000000 DCD OSTCBCur
|L1.608|
000260 00000000 DCD OSRdyTbl
|L1.612|
000264 00000000 DCD OSRdyGrp
|L1.616|
000268 0000ffff DCD 0x0000ffff
|L1.620|
00026c 00000000 DCD OSTCBPrioTbl
|L1.624|
000270 00000000 DCD OSTime
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -