📄 os_sem.ls1
字号:
192 ; *****************************************************************************************
****************
193 ; */
194 ;
195 ; void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err) reentrant
196 ; {
197 ; OS_ENTER_CRITICAL();
198 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
*/
199 ; OS_EXIT_CRITICAL();
200 ; *err = OS_ERR_EVENT_TYPE;
201 ; }
202 ; if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource av
ailable ... */
203 ; pevent->OSEventCnt--; /* ... decrement semaphore only if
positive. */
204 ; OS_EXIT_CRITICAL();
205 ; *err = OS_NO_ERR;
206 ; } else if (OSIntNesting > 0) { /* See if called from ISR ...
*/
207 ; OS_EXIT_CRITICAL(); /* ... can't PEND from an ISR
*/
208 ; *err = OS_ERR_PEND_ISR;
209 ; } else { /* Otherwise, must wait until event
occurs */
210 ; OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on
semaphore */
211 ; OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB
*/
212 ; OSEventTaskWait(pevent); /* Suspend task until event or time
out occurs */
213 ; OS_EXIT_CRITICAL();
A51 MACRO ASSEMBLER OS_SEM 09/09/2007 21:13:34 PAGE 5
214 ; OSSched(); /* Find next highest priority task
ready */
215 ; OS_ENTER_CRITICAL();
216 ; if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still wai
ting for event*/
217 ; OSEventTO(pevent);
218 ; OS_EXIT_CRITICAL();
219 ; *err = OS_TIMEOUT; /* Indicate that didn't get event w
ithin TO */
220 ; } else {
221 ; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
222 ; OS_EXIT_CRITICAL();
223 ; *err = OS_NO_ERR;
224 ; }
225 ; }
226 ; }
227 ; /*$PAGE*/
228 ; /*
229 ; *****************************************************************************************
****************
230 ; * POST TO A SEMAPHORE
231 ; *
232 ; * Description: This function signals a semaphore
233 ; *
234 ; * Arguments : pevent is a pointer to the event control block associated with the
desired
235 ; * semaphore.
236 ; *
237 ; * Returns : OS_NO_ERR The call was successful and the semaphore was signaled.
238 ; * OS_SEM_OVF If the semaphore count exceeded its limit. In other wo
rds, you have
239 ; * signalled the semaphore more often than you waited on i
t with either
240 ; * OSSemAccept() or OSSemPend().
241 ; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
242 ; *****************************************************************************************
****************
243 ; */
244 ;
245 ; INT8U OSSemPost (OS_EVENT *pevent) reentrant
246 ; {
247 ; OS_ENTER_CRITICAL();
248 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
*/
249 ; OS_EXIT_CRITICAL();
250 ; return (OS_ERR_EVENT_TYPE);
251 ; }
252 ; if (pevent->OSEventGrp) { /* See if any task waiting for
semaphore */
253 ; OSEventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task wai
ting on event */
254 ; OS_EXIT_CRITICAL();
255 ; OSSched(); /* Find highest priority task ready
to run */
256 ; return (OS_NO_ERR);
257 ; } else {
258 ; if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not ove
rflow */
259 ; pevent->OSEventCnt++; /* Increment semaphore count to reg
ister event */
260 ; OS_EXIT_CRITICAL();
261 ; return (OS_NO_ERR);
262 ; } else { /* Semaphore value has reached its
maximum */
263 ; OS_EXIT_CRITICAL();
264 ; return (OS_SEM_OVF);
A51 MACRO ASSEMBLER OS_SEM 09/09/2007 21:13:34 PAGE 6
265 ; }
266 ; }
267 ; }
268 ; /*
269 ; *****************************************************************************************
****************
270 ; * QUERY A SEMAPHORE
271 ; *
272 ; * Description: This function obtains information about a semaphore
273 ; *
274 ; * Arguments : pevent is a pointer to the event control block associated with the
desired
275 ; * semaphore
276 ; *
277 ; * pdata is a pointer to a structure that will contain information ab
out the
278 ; * semaphore.
279 ; *
280 ; * Returns : OS_NO_ERR The call was successful and the message was sent
281 ; * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non semapho
re.
282 ; *****************************************************************************************
****************
283 ; */
284 ;
285 ; INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *ppdata) reentrant
286 ; {
287 ; INT8U i;
288 ; INT8U *psrc;
289 ; INT8U *pdest;
290 ;
291 ;
292 ; OS_ENTER_CRITICAL();
293 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
*/
294 ; OS_EXIT_CRITICAL();
295 ; return (OS_ERR_EVENT_TYPE);
296 ; }
297 ; ppdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait
list */
298 ; psrc = &pevent->OSEventTbl[0];
299 ; pdest = &ppdata->OSEventTbl[0];
300 ; for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
301 ; *pdest++ = *psrc++;
302 ; }
303 ; ppdata->OSCnt = pevent->OSEventCnt; /* Get semaphore count
*/
304 ; OS_EXIT_CRITICAL();
305 ; return (OS_NO_ERR);
306 ; }
307 ; #endif
308 ; *** sync lost ***
309 ; *** sync lost ***
310 ; *** sync lost ***
311 END
A51 MACRO ASSEMBLER OS_SEM 09/09/2007 21:13:34 PAGE 7
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
AC . . . . . . . . B ADDR 00D0H.6 A
ACC. . . . . . . . D ADDR 00E0H A
B. . . . . . . . . D ADDR 00F0H A
CY . . . . . . . . B ADDR 00D0H.7 A
DPH. . . . . . . . D ADDR 0083H A
DPL. . . . . . . . D ADDR 0082H A
EA . . . . . . . . B ADDR 00A8H.7 A
ES . . . . . . . . B ADDR 00A8H.4 A
ET0. . . . . . . . B ADDR 00A8H.1 A
ET1. . . . . . . . B ADDR 00A8H.3 A
EX0. . . . . . . . B ADDR 00A8H.0 A
EX1. . . . . . . . B ADDR 00A8H.2 A
F0 . . . . . . . . B ADDR 00D0H.5 A
IE . . . . . . . . D ADDR 00A8H A
IE0. . . . . . . . B ADDR 0088H.1 A
IE1. . . . . . . . B ADDR 0088H.3 A
INT0 . . . . . . . B ADDR 00B0H.2 A
INT1 . . . . . . . B ADDR 00B0H.3 A
IP . . . . . . . . D ADDR 00B8H A
IT0. . . . . . . . B ADDR 0088H.0 A
IT1. . . . . . . . B ADDR 0088H.2 A
OS_SEM . . . . . . N NUMB -----
OV . . . . . . . . B ADDR 00D0H.2 A
P. . . . . . . . . B ADDR 00D0H.0 A
P0 . . . . . . . . D ADDR 0080H A
P1 . . . . . . . . D ADDR 0090H A
P2 . . . . . . . . D ADDR 00A0H A
P3 . . . . . . . . D ADDR 00B0H A
PCON . . . . . . . D ADDR 0087H A
PS . . . . . . . . B ADDR 00B8H.4 A
PSW. . . . . . . . D ADDR 00D0H A
PT0. . . . . . . . B ADDR 00B8H.1 A
PT1. . . . . . . . B ADDR 00B8H.3 A
PX0. . . . . . . . B ADDR 00B8H.0 A
PX1. . . . . . . . B ADDR 00B8H.2 A
RB8. . . . . . . . B ADDR 0098H.2 A
RD . . . . . . . . B ADDR 00B0H.7 A
REN. . . . . . . . B ADDR 0098H.4 A
RI . . . . . . . . B ADDR 0098H.0 A
RS0. . . . . . . . B ADDR 00D0H.3 A
RS1. . . . . . . . B ADDR 00D0H.4 A
RXD. . . . . . . . B ADDR 00B0H.0 A
SBUF . . . . . . . D ADDR 0099H A
SCON . . . . . . . D ADDR 0098H A
SM0. . . . . . . . B ADDR 0098H.7 A
SM1. . . . . . . . B ADDR 0098H.6 A
SM2. . . . . . . . B ADDR 0098H.5 A
SP . . . . . . . . D ADDR 0081H A
T0 . . . . . . . . B ADDR 00B0H.4 A
T1 . . . . . . . . B ADDR 00B0H.5 A
TB8. . . . . . . . B ADDR 0098H.3 A
TCON . . . . . . . D ADDR 0088H A
TF0. . . . . . . . B ADDR 0088H.5 A
TF1. . . . . . . . B ADDR 0088H.7 A
TH0. . . . . . . . D ADDR 008CH A
TH1. . . . . . . . D ADDR 008DH A
TI . . . . . . . . B ADDR 0098H.1 A
TL0. . . . . . . . D ADDR 008AH A
TL1. . . . . . . . D ADDR 008BH A
TMOD . . . . . . . D ADDR 0089H A
A51 MACRO ASSEMBLER OS_SEM 09/09/2007 21:13:34 PAGE 8
TR0. . . . . . . . B ADDR 0088H.4 A
TR1. . . . . . . . B ADDR 0088H.6 A
TXD. . . . . . . . B ADDR 00B0H.1 A
WR . . . . . . . . B ADDR 00B0H.6 A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -