📄 os_sem.lst
字号:
121 *********************************************************************************************************
122 */
123
124 void OSSemPend (OS_EVENT DT_XDATA *pevent, INT16U timeout, INT8U DT_XDATA *err) REENTRANT
125 {
126 1 OS_ENTER_CRITICAL();
127 1 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
128 2 OS_EXIT_CRITICAL();
129 2 *err = OS_ERR_EVENT_TYPE;
130 2 }
131 1 if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
132 2 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
133 2 OS_EXIT_CRITICAL();
134 2 *err = OS_NO_ERR;
135 2 } else if (OSIntNesting > 0) { /* See if called from ISR ... */
136 2 OS_EXIT_CRITICAL(); /* ... can't PEND from an ISR */
137 2 *err = OS_ERR_PEND_ISR;
138 2 } else { /* Otherwise, must wait until event occurs */
139 2 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
140 2 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
141 2 OSEventTaskWait(pevent); /* Suspend task until event or timeout occurs */
142 2 OS_EXIT_CRITICAL();
143 2 OSSched(); /* Find next highest priority task ready */
144 2 OS_ENTER_CRITICAL();
145 2 if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
146 3 OSEventTO(pevent);
147 3 OS_EXIT_CRITICAL();
148 3 *err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
149 3 } else {
150 3 OSTCBCur->OSTCBEventPtr = (OS_EVENT DT_XDATA *)0;
151 3 OS_EXIT_CRITICAL();
152 3 *err = OS_NO_ERR;
153 3 }
154 2 }
155 1 }
156 /*$PAGE*/
157 /*
158 *********************************************************************************************************
159 * POST TO A SEMAPHORE
160 *
161 * Description: This function signals a semaphore
162 *
163 * Arguments : pevent is a pointer to the event control block associated with the desired
164 * semaphore.
165 *
166 * Returns : OS_NO_ERR The call was successful and the semaphore was signaled.
167 * OS_SEM_OVF If the semaphore count exceeded its limit. In other words, you have
168 * signalled the semaphore more often than you waited on it with either
169 * OSSemAccept() or OSSemPend().
170 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
171 *********************************************************************************************************
172 */
173
174 INT8U OSSemPost (OS_EVENT DT_XDATA *pevent) REENTRANT
175 {
176 1 OS_ENTER_CRITICAL();
C51 COMPILER V7.02a OS_SEM 10/16/2006 15:27:51 PAGE 4
177 1 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
178 2 OS_EXIT_CRITICAL();
179 2 return (OS_ERR_EVENT_TYPE);
180 2 }
181 1 if (pevent->OSEventGrp) { /* See if any task waiting for semaphore */
182 2 OSEventTaskRdy(pevent, (void DT_XDATA *)0, OS_STAT_SEM); /* Ready highest prio task waiting on
-event */
183 2 OS_EXIT_CRITICAL();
184 2 OSSched(); /* Find highest priority task ready to run */
185 2 return (OS_NO_ERR);
186 2 } else {
187 2 if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
188 3 pevent->OSEventCnt++; /* Increment semaphore count to register event */
189 3 OS_EXIT_CRITICAL();
190 3 return (OS_NO_ERR);
191 3 } else { /* Semaphore value has reached its maximum */
192 3 OS_EXIT_CRITICAL();
193 3 return (OS_SEM_OVF);
194 3 }
195 2 }
196 1 }
197 /*
198 *********************************************************************************************************
199 * QUERY A SEMAPHORE
200 *
201 * Description: This function obtains information about a semaphore
202 *
203 * Arguments : pevent is a pointer to the event control block associated with the desired
204 * semaphore
205 *
206 * ppdata is a pointer to a structure that will contain information about the
207 * semaphore.
208 *
209 * Returns : OS_NO_ERR The call was successful and the message was sent
210 * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non semaphore.
211 *********************************************************************************************************
212 */
213
214 INT8U OSSemQuery (OS_EVENT DT_XDATA *pevent, OS_SEM_DATA DT_XDATA *ppdata) REENTRANT
215 {
216 1 INT8U i;
217 1 INT8U DT_XDATA *psrc;
218 1 INT8U DT_XDATA *pdest;
219 1
220 1
221 1 OS_ENTER_CRITICAL();
222 1 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
223 2 OS_EXIT_CRITICAL();
224 2 return (OS_ERR_EVENT_TYPE);
225 2 }
226 1 ppdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
227 1 psrc = &pevent->OSEventTbl[0];
228 1 pdest = &ppdata->OSEventTbl[0];
229 1 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
230 2 *pdest++ = *psrc++;
231 2 }
232 1 ppdata->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
233 1 OS_EXIT_CRITICAL();
234 1 return (OS_NO_ERR);
235 1 }
236 #endif
C51 COMPILER V7.02a OS_SEM 10/16/2006 15:27:51 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 944 ----
CONSTANT SIZE = ---- ----
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 + -