📄 os_flag.lst
字号:
C51 COMPILER V8.08 OS_FLAG 08/19/2008 10:59:08 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE OS_FLAG
OBJECT MODULE PLACED IN .\obj\OS_FLAG.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE uCosii\OS_FLAG.C LARGE OBJECTADVANCED BROWSE DEBUG PRINT(.\lst\OS_FLAG.lst)
- OBJECT(.\obj\OS_FLAG.obj)
line level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * EVENT FLAG MANAGEMENT
6 *
7 * (c) Copyright 2001, 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 "source\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) reentrant;
27 static BOOLEAN OS_FlagTaskRdy(OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy) reentrant;
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)
C51 COMPILER V8.08 OS_FLAG 08/19/2008 10:59:08 PAGE 2
54 * OS_FLAG_WAIT_SET_ANY You will check ANY bit in 'flags' to be set (1)
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
OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err) reentrant
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_FLAGS flags_cur;
OS_FLAGS flags_rdy;
BOOLEAN consume;
#if OS_ARG_CHK_EN > 0
if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
*err = OS_FLAG_INVALID_PGRP;
return ((OS_FLAGS)0);
}
if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
*err = OS_ERR_EVENT_TYPE;
return ((OS_FLAGS)0);
}
#endif
if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
wait_type &= ~OS_FLAG_CONSUME;
consume = TRUE;
} else {
consume = FALSE;
}
/*$PAGE*/
*err = OS_NO_ERR; /* Assume NO error until proven otherwise. */
OS_ENTER_CRITICAL();
switch (wait_type) {
case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
if (flags_rdy == flags) { /* Must match ALL the bits that we want */
if (consume == TRUE) { /* See if we need to consume the flags */
pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
}
} else {
*err = OS_FLAG_ERR_NOT_RDY;
C51 COMPILER V8.08 OS_FLAG 08/19/2008 10:59:08 PAGE 3
}
flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
OS_EXIT_CRITICAL();
break;
case OS_FLAG_WAIT_SET_ANY:
flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
if (consume == TRUE) { /* See if we need to consume the flags */
pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
}
} else {
*err = OS_FLAG_ERR_NOT_RDY;
}
flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
OS_EXIT_CRITICAL();
break;
#if OS_FLAG_WAIT_CLR_EN > 0
case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
if (flags_rdy == flags) { /* Must match ALL the bits that we want */
if (consume == TRUE) { /* See if we need to consume the flags */
pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
}
} else {
*err = OS_FLAG_ERR_NOT_RDY;
}
flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
OS_EXIT_CRITICAL();
break;
case OS_FLAG_WAIT_CLR_ANY:
flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
if (consume == TRUE) { /* See if we need to consume the flags */
pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
}
} else {
*err = OS_FLAG_ERR_NOT_RDY;
}
flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
OS_EXIT_CRITICAL();
break;
#endif
default:
OS_EXIT_CRITICAL();
flags_cur = (OS_FLAGS)0;
*err = OS_FLAG_ERR_WAIT_TYPE;
break;
}
return (flags_cur);
}
#endif
171
172 /*$PAGE*/
173 /*
174 *********************************************************************************************************
175 * CREATE AN EVENT FLAG
176 *
177 * Description: This function is called to create an event flag group.
C51 COMPILER V8.08 OS_FLAG 08/19/2008 10:59:08 PAGE 4
178 *
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) reentrant
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 + -