os_time.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 294 行
TXT
294 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_time.o --depend=.\rvmdk\os_time.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_time.crf ..\Source\OS_TIME.C]
ARM
AREA ||.text||, 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 0a000012 BEQ |L1.92|
;;;43 OS_ENTER_CRITICAL();
000010 ef000002 SVC #0x2
;;;44 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* Delay current task */
000014 e59f0204 LDR r0,|L1.544|
000018 e59f3204 LDR r3,|L1.548|
00001c e5900000 LDR r0,[r0,#0] ; OSTCBCur
000020 e5d0102f LDRB r1,[r0,#0x2f]
000024 e5d0c030 LDRB r12,[r0,#0x30]
000028 e7d32001 LDRB r2,[r3,r1]
00002c e1d2200c BICS r2,r2,r12
000030 e7c32001 STRB r2,[r3,r1]
000034 1a000004 BNE |L1.76|
;;;45 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000038 e59f11e8 LDR r1,|L1.552|
00003c e5d02031 LDRB r2,[r0,#0x31]
000040 e5d13000 LDRB r3,[r1,#0] ; OSRdyGrp
000044 e1c32002 BIC r2,r3,r2
000048 e5c12000 STRB r2,[r1,#0] ; OSRdyGrp
|L1.76|
;;;46 }
;;;47 OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
00004c e1c042ba STRH r4,[r0,#0x2a]
;;;48 OS_EXIT_CRITICAL();
000050 ef000003 SVC #0x3
;;;49 OS_Sched(); /* Find next task to run! */
000054 e8bd4010 POP {r4,lr}
000058 eafffffe B OS_Sched
|L1.92|
;;;50 }
;;;51 }
00005c e8bd4010 POP {r4,lr}
000060 e12fff1e BX lr
;;;52 /*$PAGE*/
ENDP
OSTimeDlyHMSM PROC
;;;79 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
;;;80 {
000064 e92d4070 PUSH {r4-r6,lr}
000068 e1a06000 MOV r6,r0
00006c e1a04001 MOV r4,r1
000070 e1a05002 MOV r5,r2
;;;81 INT32U ticks;
;;;82 INT16U loops;
;;;83
;;;84
;;;85 if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {
000074 e1860004 ORR r0,r6,r4
000078 e1800005 ORR r0,r0,r5
00007c e1900003 ORRS r0,r0,r3
000080 0a000029 BEQ |L1.300|
;;;86 if (minutes > 59) {
000084 e354003b CMP r4,#0x3b
000088 9a000002 BLS |L1.152|
;;;87 return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
00008c e3a00051 MOV r0,#0x51
|L1.144|
000090 e8bd4070 POP {r4-r6,lr}
;;;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 }
000094 e12fff1e BX lr
|L1.152|
000098 e355003b CMP r5,#0x3b ;89
00009c 9a000001 BLS |L1.168|
0000a0 e3a00052 MOV r0,#0x52 ;90
0000a4 eafffff9 B |L1.144|
|L1.168|
0000a8 e3530ffa CMP r3,#0x3e8 ;92
0000ac 3a000001 BCC |L1.184|
0000b0 e3a00053 MOV r0,#0x53 ;93
0000b4 eafffff5 B |L1.144|
|L1.184|
0000b8 e2830002 ADD r0,r3,#2 ;97
0000bc e3a010c8 MOV r1,#0xc8 ;97
0000c0 e0000091 MUL r0,r1,r0 ;97
0000c4 e3a01ffa MOV r1,#0x3e8 ;97
0000c8 ebfffffe BL __aeabi_uidivmod
0000cc e3a01ee1 MOV r1,#0xe10 ;97
0000d0 e0010196 MUL r1,r6,r1 ;97
0000d4 e0642204 RSB r2,r4,r4,LSL #4 ;97
0000d8 e0811102 ADD r1,r1,r2,LSL #2 ;97
0000dc e0811005 ADD r1,r1,r5 ;97
0000e0 e3a02019 MOV r2,#0x19 ;97
0000e4 e0010192 MUL r1,r2,r1 ;97
0000e8 e0800181 ADD r0,r0,r1,LSL #3 ;97
0000ec e1a04820 LSR r4,r0,#16 ;99
0000f0 e1a00800 LSL r0,r0,#16 ;100
0000f4 e1a00820 LSR r0,r0,#16 ;100
0000f8 ebfffffe BL OSTimeDly
0000fc ea000006 B |L1.284|
|L1.256|
000100 e3a00902 MOV r0,#0x8000 ;103
000104 ebfffffe BL OSTimeDly
000108 e3a00902 MOV r0,#0x8000 ;104
00010c ebfffffe BL OSTimeDly
000110 e2440001 SUB r0,r4,#1 ;105
000114 e1a04800 LSL r4,r0,#16 ;105
000118 e1a04824 LSR r4,r4,#16 ;105
|L1.284|
00011c e3540000 CMP r4,#0 ;102
000120 1afffff6 BNE |L1.256|
000124 e3a00000 MOV r0,#0 ;107
000128 eaffffd8 B |L1.144|
|L1.300|
00012c e3a00054 MOV r0,#0x54 ;109
000130 eaffffd6 B |L1.144|
;;;111 #endif
ENDP
OSTimeDlyResume PROC
;;;138 INT8U OSTimeDlyResume (INT8U prio)
;;;139 {
000134 e92d4010 PUSH {r4,lr}
000138 e1a04000 MOV r4,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) {
00013c e354000c CMP r4,#0xc
000140 3a000002 BCC |L1.336|
;;;147 return (OS_PRIO_INVALID);
000144 e3a0002a MOV r0,#0x2a
|L1.328|
000148 e8bd4010 POP {r4,lr}
;;;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) == OS_STAT_RDY) { /* 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 }
00014c e12fff1e BX lr
|L1.336|
000150 ef000002 SVC #0x2 ;149
000154 e59f00d0 LDR r0,|L1.556|
000158 e7900104 LDR r0,[r0,r4,LSL #2] ;150
00015c e3500000 CMP r0,#0 ;151
000160 0a00001b BEQ |L1.468|
000164 e1d012ba LDRH r1,[r0,#0x2a] ;152
000168 e3510000 CMP r1,#0 ;152
00016c 0a000015 BEQ |L1.456|
000170 e3a01000 MOV r1,#0 ;153
000174 e1c012ba STRH r1,[r0,#0x2a] ;153
000178 e5d0102c LDRB r1,[r0,#0x2c] ;154
00017c e3110008 TST r1,#8 ;154
000180 1a00000d BNE |L1.444|
000184 e59f109c LDR r1,|L1.552|
000188 e5d02031 LDRB r2,[r0,#0x31] ;155
00018c e5d13000 LDRB r3,[r1,#0] ;155 ; OSRdyGrp
000190 e1822003 ORR r2,r2,r3 ;155
000194 e5c12000 STRB r2,[r1,#0] ;155 ; OSRdyGrp
000198 e5d0102f LDRB r1,[r0,#0x2f] ;156
00019c e59f2080 LDR r2,|L1.548|
0001a0 e5d00030 LDRB r0,[r0,#0x30] ;156
0001a4 e7d23001 LDRB r3,[r2,r1] ;156
0001a8 e1800003 ORR r0,r0,r3 ;156
0001ac e7c20001 STRB r0,[r2,r1] ;156
0001b0 ef000003 SVC #0x3 ;157
0001b4 ebfffffe BL OS_Sched
0001b8 ea000000 B |L1.448|
|L1.444|
0001bc ef000003 SVC #0x3 ;160
|L1.448|
0001c0 e3a00000 MOV r0,#0 ;162
0001c4 eaffffdf B |L1.328|
|L1.456|
0001c8 ef000003 SVC #0x3 ;164
0001cc e3a00050 MOV r0,#0x50 ;165
0001d0 eaffffdc B |L1.328|
|L1.468|
0001d4 ef000003 SVC #0x3 ;168
0001d8 e3a0000b MOV r0,#0xb ;169
0001dc eaffffd9 B |L1.328|
;;;171 #endif
ENDP
OSTimeGet PROC
;;;187 INT32U OSTimeGet (void)
;;;188 {
0001e0 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();
0001e4 ef000002 SVC #0x2
;;;196 ticks = OSTime;
0001e8 e59f0040 LDR r0,|L1.560|
0001ec e5904000 LDR r4,[r0,#0] ; OSTime
;;;197 OS_EXIT_CRITICAL();
0001f0 ef000003 SVC #0x3
;;;198 return (ticks);
0001f4 e1a00004 MOV r0,r4
0001f8 e8bd4010 POP {r4,lr}
;;;199 }
0001fc e12fff1e BX lr
;;;200 #endif
ENDP
OSTimeSet PROC
;;;215 void OSTimeSet (INT32U ticks)
;;;216 {
000200 e92d4010 PUSH {r4,lr}
000204 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();
000208 ef000002 SVC #0x2
;;;223 OSTime = ticks;
00020c e59f001c LDR r0,|L1.560|
000210 e5804000 STR r4,[r0,#0] ; OSTime
;;;224 OS_EXIT_CRITICAL();
000214 ef000003 SVC #0x3
;;;225 }
000218 e8bd4010 POP {r4,lr}
00021c e12fff1e BX lr
;;;226 #endif
ENDP
|L1.544|
000220 00000000 DCD OSTCBCur
|L1.548|
000224 00000000 DCD OSRdyTbl
|L1.552|
000228 00000000 DCD OSRdyGrp
|L1.556|
00022c 00000000 DCD OSTCBPrioTbl
|L1.560|
000230 00000000 DCD OSTime
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?