📄 os_flag.lst
字号:
C51 COMPILER V6.23a OS_FLAG 12/09/2004 16:50:25 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE OS_FLAG
OBJECT MODULE PLACED IN OS_FLAG.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE OS_FLAG.C LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * EVENT FLAG MANAGEMENT
6 *
7 * (c) Copyright 2001-2002, Jean J. Labrosse, Weston, FL
8 * All Rights Reserved
9 *
10 * File : OS_FLAG.C
11 * By : Jean J. Labrosse
12 *********************************************************************************************************
13 */
14
15 #ifndef OS_MASTER_FILE
16 #include "INCLUDES.H"
17 #endif
18
19 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
20 /*
21 *********************************************************************************************************
22 * LOCAL PROTOTYPES
23 *********************************************************************************************************
24 */
25
26 static void OS_FlagBlock(OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT
-16U timeout) KCREENTRANT;
27 static BOOLEAN OS_FlagTaskRdy(OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy) KCREENTRANT;
28
29 /*$PAGE*/
30 /*
31 *********************************************************************************************************
32 * CHECK THE STATUS OF FLAGS IN AN EVENT FLAG GROUP
33 *
34 * Description: This function is called to check the status of a combination of bits to be set or cleared
35 * in an event flag group. Your application can check for ANY bit to be set/cleared or ALL
36 * bits to be set/cleared.
37 *
38 * This call does not block if the desired flags are not present.
39 *
40 * Arguments : pgrp is a pointer to the desired event flag group.
41 *
42 * flags Is a bit pattern indicating which bit(s) (i.e. flags) you wish to check.
43 * The bits you want are specified by setting the corresponding bits in
44 * 'flags'. e.g. if your application wants to wait for bits 0 and 1 then
45 * 'flags' would contain 0x03.
46 *
47 * wait_type specifies whether you want ALL bits to be set/cleared or ANY of the bits
48 * to be set/cleared.
49 * You can specify the following argument:
50 *
51 * OS_FLAG_WAIT_CLR_ALL You will check ALL bits in 'flags' to be clear (0)
52 * OS_FLAG_WAIT_CLR_ANY You will check ANY bit in 'flags' to be clear (0)
53 * OS_FLAG_WAIT_SET_ALL You will check ALL bits in 'flags' to be set (1)
54 * OS_FLAG_WAIT_SET_ANY You will check ANY bit in 'flags' to be set (1)
C51 COMPILER V6.23a OS_FLAG 12/09/2004 16:50:25 PAGE 2
55 *
56 * NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
57 * the call. Example, to wait for any flag in a group AND then clear
58 * the flags that are present, set 'wait_type' to:
59 *
60 * OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
61 *
62 * err is a pointer to an error code and can be:
63 * OS_NO_ERR No error
64 * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
65 * OS_FLAG_ERR_WAIT_TYPE You didn't specify a proper 'wait_type' argument.
66 * OS_FLAG_INVALID_PGRP You passed a NULL pointer instead of the event flag
67 * group handle.
68 * OS_FLAG_ERR_NOT_RDY The desired flags you are waiting for are not
69 * available.
70 *
71 * Returns : The state of the flags in the event flag group.
72 *
73 * Called from: Task or ISR
74 *********************************************************************************************************
75 */
76
77 #if OS_FLAG_ACCEPT_EN > 0
78 OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err) KCREENTRANT
79 {
80 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
83 1 OS_FLAGS flags_cur;
84 1 OS_FLAGS flags_rdy;
85 1 BOOLEAN consume;
86 1
87 1
88 1 #if OS_ARG_CHK_EN > 0
89 1 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
90 2 *err = OS_FLAG_INVALID_PGRP;
91 2 return ((OS_FLAGS)0);
92 2 }
93 1 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
94 2 *err = OS_ERR_EVENT_TYPE;
95 2 return ((OS_FLAGS)0);
96 2 }
97 1 #endif
98 1 if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
99 2 wait_type &= ~OS_FLAG_CONSUME;
100 2 consume = TRUE;
101 2 } else {
102 2 consume = FALSE;
103 2 }
104 1 /*$PAGE*/
105 1 *err = OS_NO_ERR; /* Assume NO error until proven otherwise. */
106 1 OS_ENTER_CRITICAL();
107 1 switch (wait_type) {
108 2 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
109 2 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
110 2 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
111 3 if (consume == TRUE) { /* See if we need to consume the flags */
112 4 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
113 4 }
114 3 } else {
115 3 *err = OS_FLAG_ERR_NOT_RDY;
116 3 }
C51 COMPILER V6.23a OS_FLAG 12/09/2004 16:50:25 PAGE 3
117 2 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
118 2 OS_EXIT_CRITICAL();
119 2 break;
120 2
121 2 case OS_FLAG_WAIT_SET_ANY:
122 2 flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
123 2 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
124 3 if (consume == TRUE) { /* See if we need to consume the flags */
125 4 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
126 4 }
127 3 } else {
128 3 *err = OS_FLAG_ERR_NOT_RDY;
129 3 }
130 2 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
131 2 OS_EXIT_CRITICAL();
132 2 break;
133 2
134 2 #if OS_FLAG_WAIT_CLR_EN > 0
135 2 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
136 2 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
137 2 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
138 3 if (consume == TRUE) { /* See if we need to consume the flags */
139 4 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
140 4 }
141 3 } else {
142 3 *err = OS_FLAG_ERR_NOT_RDY;
143 3 }
144 2 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
145 2 OS_EXIT_CRITICAL();
146 2 break;
147 2
148 2 case OS_FLAG_WAIT_CLR_ANY:
149 2 flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
150 2 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
151 3 if (consume == TRUE) { /* See if we need to consume the flags */
152 4 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
153 4 }
154 3 } else {
155 3 *err = OS_FLAG_ERR_NOT_RDY;
156 3 }
157 2 flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
158 2 OS_EXIT_CRITICAL();
159 2 break;
160 2 #endif
161 2
162 2 default:
163 2 OS_EXIT_CRITICAL();
164 2 flags_cur = (OS_FLAGS)0;
165 2 *err = OS_FLAG_ERR_WAIT_TYPE;
166 2 break;
167 2 }
168 1 return (flags_cur);
169 1 }
170 #endif
171
172 /*$PAGE*/
173 /*
174 *********************************************************************************************************
175 * CREATE AN EVENT FLAG
176 *
177 * Description: This function is called to create an event flag group.
178 *
C51 COMPILER V6.23a OS_FLAG 12/09/2004 16:50:25 PAGE 4
179 * Arguments : flags Contains the initial value to store in the event flag group.
180 *
181 * err is a pointer to an error code which will be returned to your application:
182 * OS_NO_ERR if the call was successful.
183 * OS_ERR_CREATE_ISR if you attempted to create an Event Flag from an
184 * ISR.
185 * OS_FLAG_GRP_DEPLETED if there are no more event flag groups
186 *
187 * Returns : A pointer to an event flag group or a NULL pointer if no more groups are available.
188 *
189 * Called from: Task ONLY
190 *********************************************************************************************************
191 */
192
193 OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err) KCREENTRANT
194 {
195 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
198 1 OS_FLAG_GRP *pgrp;
199 1
200 1
201 1 if (OSIntNesting > 0) { /* See if called from ISR ... */
202 2 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
203 2 return ((OS_FLAG_GRP *)0);
204 2 }
205 1 OS_ENTER_CRITICAL();
206 1 pgrp = OSFlagFreeList; /* Get next free event flag */
207 1 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
208 2 /* Adjust free list */
209 2 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
210 2 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
211 2 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
212 2 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
213 2 OS_EXIT_CRITICAL();
214 2 *err = OS_NO_ERR;
215 2 } else {
216 2 OS_EXIT_CRITICAL();
217 2 *err = OS_FLAG_GRP_DEPLETED;
218 2 }
219 1 return (pgrp); /* Return pointer to event flag group */
220 1 }
221
222 /*$PAGE*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -