📄 os_time.lst
字号:
##############################################################################
# #
# IAR ARM ANSI C/C++ Compiler V4.40A/W32 EVALUATION 21/Jul/2006 16:23:30 #
# Copyright 1999-2005 IAR Systems. All rights reserved. #
# Time limited license: 22 days left #
# #
# Cpu mode = interwork #
# Endian = little #
# Stack alignment = 4 #
# Source file = E:\Project\ucos-ii\leddisp\uCOS-II\os_time.c #
# Command line = E:\Project\ucos-ii\leddisp\uCOS-II\os_time.c -lCN #
# E:\Project\ucos-ii\leddisp\Debug\List\ -lA #
# E:\Project\ucos-ii\leddisp\Debug\List\ -o #
# E:\Project\ucos-ii\leddisp\Debug\Obj\ -s9 --no_cse #
# --no_unroll --no_inline --no_code_motion --no_tbaa #
# --no_clustering --no_scheduling --debug --cpu_mode #
# thumb --endian little --cpu ARM7TDMI-S #
# --stack_align 4 --interwork -e --fpu None #
# --dlib_config "e:\Program Files\IAR #
# Systems\Embedded Workbench 4.0 #
# Evaluation\ARM\LIB\dl4tptinl8n.h" -I #
# E:\Project\ucos-ii\leddisp\ -I #
# E:\Project\ucos-ii\leddisp\App\ -I #
# E:\Project\ucos-ii\leddisp\ARM\ -I #
# E:\Project\ucos-ii\leddisp\BSP\ -I #
# E:\Project\ucos-ii\leddisp\uCOS-II\ -I "e:\Program #
# Files\IAR Systems\Embedded Workbench 4.0 #
# Evaluation\ARM\INC\" #
# List file = E:\Project\ucos-ii\leddisp\Debug\List\os_time.lst #
# Object file = E:\Project\ucos-ii\leddisp\Debug\Obj\os_time.r79 #
# #
# #
##############################################################################
E:\Project\ucos-ii\leddisp\uCOS-II\os_time.c
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * TIME MANAGEMENT
6 *
7 * (c) Copyright 1992-2003, Jean J. Labrosse, Weston, FL
8 * All Rights Reserved
9 *
10 * File : OS_TIME.C
11 * By : Jean J. Labrosse
12 *********************************************************************************************************
13 */
14
15 #ifndef OS_MASTER_FILE
16 #include <ucos_ii.h>
17 #endif
18
19 /*
20 *********************************************************************************************************
21 * DELAY TASK 'n' TICKS (n from 0 to 65535)
22 *
23 * Description: This function is called to delay execution of the currently running task until the
24 * specified number of system ticks expires. This, of course, directly equates to delaying
25 * the current task for some time to expire. No delay will result If the specified delay is
26 * 0. If the specified delay is greater than 0 then, a context switch will result.
27 *
28 * Arguments : ticks is the time delay that the task will be suspended in number of clock 'ticks'.
29 * Note that by specifying 0, the task will not be delayed.
30 *
31 * Returns : none
32 *********************************************************************************************************
33 */
34
\ In segment CODE, align 4, keep-with-next
35 void OSTimeDly (INT16U ticks)
36 {
\ OSTimeDly:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 0400 MOVS R4,R0
37 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
38 OS_CPU_SR cpu_sr;
39 #endif
40 INT8U y;
41
42
43 if (ticks > 0) { /* 0 means no delay! */
\ 00000004 22D0 BEQ ??OSTimeDly_0
44 OS_ENTER_CRITICAL();
\ 00000006 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
45 y = OSTCBCur->OSTCBY; /* Delay current task */
\ 0000000A 1249 LDR R1,??OSTimeDly_1 ;; OSTCBCur
\ 0000000C 0968 LDR R1,[R1, #+0]
\ 0000000E 2F31 ADDS R1,R1,#+47
\ 00000010 0978 LDRB R1,[R1, #+0]
46 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
\ 00000012 .... LDR R3,??DataTable8 ;; OSRdyTbl
\ 00000014 .... LDR R6,??DataTable8 ;; OSRdyTbl
\ 00000016 755C LDRB R5,[R6, R1]
\ 00000018 0E4E LDR R6,??OSTimeDly_1 ;; OSTCBCur
\ 0000001A 3668 LDR R6,[R6, #+0]
\ 0000001C 3036 ADDS R6,R6,#+48
\ 0000001E 3678 LDRB R6,[R6, #+0]
\ 00000020 B543 BICS R5,R5,R6
\ 00000022 5D54 STRB R5,[R3, R1]
47 if (OSRdyTbl[y] == 0) {
\ 00000024 .... LDR R2,??DataTable8 ;; OSRdyTbl
\ 00000026 515C LDRB R1,[R2, R1]
\ 00000028 0029 CMP R1,#+0
\ 0000002A 08D1 BNE ??OSTimeDly_2
48 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
\ 0000002C .... LDR R1,??DataTable6 ;; OSRdyGrp
\ 0000002E .... LDR R2,??DataTable6 ;; OSRdyGrp
\ 00000030 1278 LDRB R2,[R2, #+0]
\ 00000032 084B LDR R3,??OSTimeDly_1 ;; OSTCBCur
\ 00000034 1B68 LDR R3,[R3, #+0]
\ 00000036 3133 ADDS R3,R3,#+49
\ 00000038 1B78 LDRB R3,[R3, #+0]
\ 0000003A 9A43 BICS R2,R2,R3
\ 0000003C 0A70 STRB R2,[R1, #+0]
49 }
50 OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
\ ??OSTimeDly_2:
\ 0000003E 0549 LDR R1,??OSTimeDly_1 ;; OSTCBCur
\ 00000040 0968 LDR R1,[R1, #+0]
\ 00000042 4C85 STRH R4,[R1, #+42]
51 OS_EXIT_CRITICAL();
\ 00000044 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
52 OS_Sched(); /* Find next task to run! */
\ 00000048 ........ _BLF OS_Sched,??OS_Sched??rT
53 }
54 }
\ ??OSTimeDly_0:
\ 0000004C 70BC POP {R4-R6}
\ 0000004E 01BC POP {R0}
\ 00000050 0047 BX R0 ;; return
\ 00000052 C046 Nop
\ ??OSTimeDly_1:
\ 00000054 ........ DC32 OSTCBCur
55 /*$PAGE*/
56 /*
57 *********************************************************************************************************
58 * DELAY TASK FOR SPECIFIED TIME
59 *
60 * Description: This function is called to delay execution of the currently running task until some time
61 * expires. This call allows you to specify the delay time in HOURS, MINUTES, SECONDS and
62 * MILLISECONDS instead of ticks.
63 *
64 * Arguments : hours specifies the number of hours that the task will be delayed (max. is 255)
65 * minutes specifies the number of minutes (max. 59)
66 * seconds specifies the number of seconds (max. 59)
67 * milli specifies the number of milliseconds (max. 999)
68 *
69 * Returns : OS_NO_ERR
70 * OS_TIME_INVALID_MINUTES
71 * OS_TIME_INVALID_SECONDS
72 * OS_TIME_INVALID_MS
73 * OS_TIME_ZERO_DLY
74 *
75 * Note(s) : The resolution on the milliseconds depends on the tick rate. For example, you can't do
76 * a 10 mS delay if the ticker interrupts every 100 mS. In this case, the delay would be
77 * set to 0. The actual delay is rounded to the nearest tick.
78 *********************************************************************************************************
79 */
80
81 #if OS_TIME_DLY_HMSM_EN > 0
\ In segment CODE, align 4, keep-with-next
82 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)
83 {
\ OSTimeDlyHMSM:
\ 00000000 10B5 PUSH {R4,LR}
84 INT32U ticks;
85 INT16U loops;
86
87
88 if (hours == 0) {
\ 00000002 0028 CMP R0,#+0
\ 00000004 07D1 BNE ??OSTimeDlyHMSM_0
89 if (minutes == 0) {
\ 00000006 0029 CMP R1,#+0
\ 00000008 05D1 BNE ??OSTimeDlyHMSM_0
90 if (seconds == 0) {
\ 0000000A 002A CMP R2,#+0
\ 0000000C 07D1 BNE ??OSTimeDlyHMSM_1
91 if (milli == 0) {
\ 0000000E 002B CMP R3,#+0
\ 00000010 09D1 BNE ??OSTimeDlyHMSM_2
92 return (OS_TIME_ZERO_DLY);
\ 00000012 5420 MOVS R0,#+84
\ 00000014 34E0 B ??OSTimeDlyHMSM_3
93 }
94 }
95 }
96 }
97 if (minutes > 59) {
\ ??OSTimeDlyHMSM_0:
\ 00000016 3C29 CMP R1,#+60
\ 00000018 01D3 BCC ??OSTimeDlyHMSM_1
98 return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
\ 0000001A 5120 MOVS R0,#+81
\ 0000001C 30E0 B ??OSTimeDlyHMSM_3
99 }
100 if (seconds > 59) {
\ ??OSTimeDlyHMSM_1:
\ 0000001E 3C2A CMP R2,#+60
\ 00000020 01D3 BCC ??OSTimeDlyHMSM_2
101 return (OS_TIME_INVALID_SECONDS);
\ 00000022 5220 MOVS R0,#+82
\ 00000024 2CE0 B ??OSTimeDlyHMSM_3
102 }
103 if (milli > 999) {
\ ??OSTimeDlyHMSM_2:
\ 00000026 FA24 MOVS R4,#+250
\ 00000028 A400 LSLS R4,R4,#+2 ;; #+1000
\ 0000002A A342 CMP R3,R4
\ 0000002C 01D3 BCC ??OSTimeDlyHMSM_4
104 return (OS_TIME_INVALID_MILLI);
\ 0000002E 5320 MOVS R0,#+83
\ 00000030 26E0 B ??OSTimeDlyHMSM_3
105 }
106 /* Compute the total number of clock ticks required.. */
107 /* .. (rounded to the nearest tick) */
108 ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
109 + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
\ ??OSTimeDlyHMSM_4:
\ 00000032 E124 MOVS R4,#+225
\ 00000034 2401 LSLS R4,R4,#+4 ;; #+3600
\ 00000036 6043 MULS R0,R4,R0
\ 00000038 3C24 MOVS R4,#+60
\ 0000003A 6143 MULS R1,R4,R1
\ 0000003C 4018 ADDS R0,R0,R1
\ 0000003E 8218 ADDS R2,R0,R2
\ 00000040 6420 MOVS R0,#+100
\ 00000042 4243 MULS R2,R0,R2
\ 00000044 5B1D ADDS R3,R3,#+5
\ 00000046 4343 MULS R3,R0,R3
\ 00000048 1800 MOVS R0,R3
\ 0000004A FA21 MOVS R1,#+250
\ 0000004C 8900 LSLS R1,R1,#+2 ;; #+1000
\ 0000004E ........ _BLF ??divu32_t,??rT??divu32_t
\ 00000052 5018 ADDS R0,R2,R1
110 loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
\ 00000054 040C LSRS R4,R0,#+16
111 ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
112 OSTimeDly((INT16U)ticks);
\ 00000056 0004 LSLS R0,R0,#+16
\ 00000058 000C LSRS R0,R0,#+16
\ 0000005A ........ BL OSTimeDly
\ 0000005E 2000 MOVS R0,R4
\ 00000060 0BD1 BNE ??OSTimeDlyHMSM_5
\ 00000062 0CE0 B ??OSTimeDlyHMSM_6
113 while (loops > 0) {
114 OSTimeDly((INT16U)32768u);
\ ??OSTimeDlyHMSM_7:
\ 00000064 8020 MOVS R0,#+128
\ 00000066 0002 LSLS R0,R0,#+8 ;; #+32768
\ 00000068 ........ BL OSTimeDly
115 OSTimeDly((INT16U)32768u);
\ 0000006C 8020 MOVS R0,#+128
\ 0000006E 0002 LSLS R0,R0,#+8 ;; #+32768
\ 00000070 ........ BL OSTimeDly
116 loops--;
\ 00000074 641E SUBS R4,R4,#+1
\ 00000076 2404 LSLS R4,R4,#+16
\ 00000078 240C LSRS R4,R4,#+16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -