?? os_time.lst
字號:
C51 COMPILER V7.06 OS_TIME 07/18/2003 11:06:05 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE OS_TIME
OBJECT MODULE PLACED IN .\os_time.obj
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE ..\keilc51\os_time.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\os_time.lst) O
-BJECT(.\os_time.obj)
stmt level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * TIME MANAGEMENT
6 *
7 * (c) Copyright 1992-2002, 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 "includes.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
35 void OSTimeDly (INT16U ticks) reentrant //using 0
36 {
37 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
38 1 OS_CPU_SR cpu_sr;
39 1 #endif
40 1 INT8U y;
41 1
42 1
43 1 if (ticks > 0) { /* 0 means no delay! */
44 2 OS_ENTER_CRITICAL();
45 2 y = OSTCBCur->OSTCBY; /* Delay current task */
46 2 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
47 2 if (OSRdyTbl[y] == 0) {
48 3 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
49 3 }
50 2 OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
51 2 OS_EXIT_CRITICAL();
52 2 OS_Sched(); /* Find next task to run! */
53 2 }
54 1 }
C51 COMPILER V7.06 OS_TIME 07/18/2003 11:06:05 PAGE 2
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
82 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) reentrant //using 0
83 {
84 1 INT32U ticks;
85 1 INT16U loops;
86 1
87 1
88 1 if (hours == 0) {
89 2 if (minutes == 0) {
90 3 if (seconds == 0) {
91 4 if (milli == 0) {
92 5 return (OS_TIME_ZERO_DLY);
93 5 }
94 4 }
95 3 }
96 2 }
97 1 if (minutes > 59) {
98 2 return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */
99 2 }
100 1 if (seconds > 59) {
101 2 return (OS_TIME_INVALID_SECONDS);
102 2 }
103 1 if (milli > 999) {
104 2 return (OS_TIME_INVALID_MILLI);
105 2 }
106 1 /* Compute the total number of clock ticks required.. */
107 1 /* .. (rounded to the nearest tick) */
108 1 ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC
109 1 + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;
110 1 loops = (INT16U)(ticks / 65536L); /* Compute the integral number of 65536 tick delays */
111 1 ticks = ticks % 65536L; /* Obtain the fractional number of ticks */
112 1 OSTimeDly((INT16U)ticks);
113 1 while (loops > 0) {
114 2 OSTimeDly((INT16U)32768u);
115 2 OSTimeDly((INT16U)32768u);
116 2 loops--;
C51 COMPILER V7.06 OS_TIME 07/18/2003 11:06:05 PAGE 3
117 2 }
118 1 return (OS_NO_ERR);
119 1 }
120 #endif
121 /*$PAGE*/
122 /*
123 *********************************************************************************************************
124 * RESUME A DELAYED TASK
125 *
126 * Description: This function is used resume a task that has been delayed through a call to either
127 * OSTimeDly() or OSTimeDlyHMSM(). Note that you MUST NOT call this function to resume a
128 * task that is waiting for an event with timeout. This situation would make the task look
129 * like a timeout occurred (unless you desire this effect). Also, you cannot resume a task
130 * that has called OSTimeDlyHMSM() with a combined time that exceeds 65535 clock ticks. In
131 * other words, if the clock tick runs at 100 Hz then, you will not be able to resume a
132 * delayed task that called OSTimeDlyHMSM(0, 10, 55, 350) or higher.
133 *
134 * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second.
135 *
136 * Arguments : prio specifies the priority of the task to resume
137 *
138 * Returns : OS_NO_ERR Task has been resumed
139 * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
140 * (i.e. >= OS_LOWEST_PRIO)
141 * OS_TIME_NOT_DLY Task is not waiting for time to expire
142 * OS_TASK_NOT_EXIST The desired task has not been created
143 *********************************************************************************************************
144 */
145
146 #if OS_TIME_DLY_RESUME_EN > 0
147 INT8U OSTimeDlyResume (INT8U prio) reentrant //using 0
148 {
149 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
150 1 OS_CPU_SR cpu_sr;
151 1 #endif
152 1 OS_TCB *ptcb;
153 1
154 1
155 1 if (prio >= OS_LOWEST_PRIO) {
156 2 return (OS_PRIO_INVALID);
157 2 }
158 1 OS_ENTER_CRITICAL();
159 1 ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* Make sure that task exist */
160 1 if (ptcb != (OS_TCB *)0) {
161 2 if (ptcb->OSTCBDly != 0) { /* See if task is delayed */
162 3 ptcb->OSTCBDly = 0; /* Clear the time delay */
163 3 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* See if task is ready to run */
164 4 OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
165 4 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
166 4 OS_EXIT_CRITICAL();
167 4 OS_Sched(); /* See if this is new highest priority */
168 4 } else {
169 4 OS_EXIT_CRITICAL(); /* Task may be suspended */
170 4 }
171 3 return (OS_NO_ERR);
172 3 } else {
173 3 OS_EXIT_CRITICAL();
174 3 return (OS_TIME_NOT_DLY); /* Indicate that task was not delayed */
175 3 }
176 2 }
177 1 OS_EXIT_CRITICAL();
178 1 return (OS_TASK_NOT_EXIST); /* The task does not exist */
C51 COMPILER V7.06 OS_TIME 07/18/2003 11:06:05 PAGE 4
179 1 }
180 #endif
181 /*$PAGE*/
182 /*
183 *********************************************************************************************************
184 * GET CURRENT SYSTEM TIME
185 *
186 * Description: This function is used by your application to obtain the current value of the 32-bit
187 * counter which keeps track of the number of clock ticks.
188 *
189 * Arguments : none
190 *
191 * Returns : The current value of OSTime
192 *********************************************************************************************************
193 */
194
195 #if OS_TIME_GET_SET_EN > 0
196 INT32U OSTimeGet (void) reentrant //using 0
197 {
198 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
199 1 OS_CPU_SR cpu_sr;
200 1 #endif
201 1 INT32U ticks;
202 1
203 1
204 1 OS_ENTER_CRITICAL();
205 1 ticks = OSTime;
206 1 OS_EXIT_CRITICAL();
207 1 return (ticks);
208 1 }
209 #endif
210
211 /*
212 *********************************************************************************************************
213 * SET SYSTEM CLOCK
214 *
215 * Description: This function sets the 32-bit counter which keeps track of the number of clock ticks.
216 *
217 * Arguments : ticks specifies the new value that OSTime needs to take.
218 *
219 * Returns : none
220 *********************************************************************************************************
221 */
222
223 #if OS_TIME_GET_SET_EN > 0
224 void OSTimeSet (INT32U ticks) reentrant //using 0
225 {
226 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
227 1 OS_CPU_SR cpu_sr;
228 1 #endif
229 1
230 1
231 1 OS_ENTER_CRITICAL();
232 1 OSTime = ticks;
233 1 OS_EXIT_CRITICAL();
234 1 }
235 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1091 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V7.06 OS_TIME 07/18/2003 11:06:05 PAGE 5
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -