📄 os_sem.lst
字号:
451 .LM63:
452 0148 05C0 rjmp .L9
453 .L25:
237:../OSsrc/os_sem.c ****
238:../OSsrc/os_sem.c **** default:
239:../OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
455 .LM64:
456 /* #APP */
457 014a 7894 sei
240:../OSsrc/os_sem.c **** *perr = OS_ERR_INVALID_OPT;
459 .LM65:
460 /* #NOAPP */
461 014c 87E0 ldi r24,lo8(7)
462 .L28:
463 014e F801 movw r30,r16
464 0150 8083 st Z,r24
465 .L29:
241:../OSsrc/os_sem.c **** pevent_return = pevent;
467 .LM66:
468 0152 CE01 movw r24,r28
469 .L9:
470 /* epilogue: frame size=0 */
471 0154 DF91 pop r29
472 0156 CF91 pop r28
473 0158 1F91 pop r17
474 015a 0F91 pop r16
475 015c FF90 pop r15
476 015e 0895 ret
477 /* epilogue end (size=6) */
478 /* function OSSemDel size 118 (107) */
484 .Lscope2:
489 .global OSSemPend
491 OSSemPend:
242:../OSsrc/os_sem.c **** break;
243:../OSsrc/os_sem.c **** }
244:../OSsrc/os_sem.c **** return (pevent_return);
245:../OSsrc/os_sem.c **** }
246:../OSsrc/os_sem.c **** #endif
247:../OSsrc/os_sem.c ****
248:../OSsrc/os_sem.c **** /*$PAGE*/
249:../OSsrc/os_sem.c **** /*
250:../OSsrc/os_sem.c **** ***************************************************************************************************
251:../OSsrc/os_sem.c **** * PEND ON SEMAPHORE
252:../OSsrc/os_sem.c **** *
253:../OSsrc/os_sem.c **** * Description: This function waits for a semaphore.
254:../OSsrc/os_sem.c **** *
255:../OSsrc/os_sem.c **** * Arguments : pevent is a pointer to the event control block associated with the desired
256:../OSsrc/os_sem.c **** * semaphore.
257:../OSsrc/os_sem.c **** *
258:../OSsrc/os_sem.c **** * timeout is an optional timeout period (in clock ticks). If non-zero, your tas
259:../OSsrc/os_sem.c **** * wait for the resource up to the amount of time specified by this argum
260:../OSsrc/os_sem.c **** * If you specify 0, however, your task will wait forever at the specifie
261:../OSsrc/os_sem.c **** * semaphore or, until the resource becomes available (or the event occur
262:../OSsrc/os_sem.c **** *
263:../OSsrc/os_sem.c **** * perr is a pointer to where an error message will be deposited. Possible er
264:../OSsrc/os_sem.c **** * messages are:
265:../OSsrc/os_sem.c **** *
266:../OSsrc/os_sem.c **** * OS_ERR_NONE The call was successful and your task owns the res
267:../OSsrc/os_sem.c **** * or, the event you are waiting for occurred.
268:../OSsrc/os_sem.c **** * OS_ERR_TIMEOUT The semaphore was not received within the specifie
269:../OSsrc/os_sem.c **** * 'timeout'.
270:../OSsrc/os_sem.c **** * OS_ERR_PEND_ABORT The wait on the semaphore was aborted.
271:../OSsrc/os_sem.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore.
272:../OSsrc/os_sem.c **** * OS_ERR_PEND_ISR If you called this function from an ISR and the re
273:../OSsrc/os_sem.c **** * would lead to a suspension.
274:../OSsrc/os_sem.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
275:../OSsrc/os_sem.c **** * OS_ERR_PEND_LOCKED If you called this function when the scheduler is
276:../OSsrc/os_sem.c **** *
277:../OSsrc/os_sem.c **** * Returns : none
278:../OSsrc/os_sem.c **** ***************************************************************************************************
279:../OSsrc/os_sem.c **** */
280:../OSsrc/os_sem.c ****
281:../OSsrc/os_sem.c **** void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
282:../OSsrc/os_sem.c **** {
493 .LM67:
494 /* prologue: frame size=0 */
495 0160 EF92 push r14
496 0162 FF92 push r15
497 0164 1F93 push r17
498 0166 CF93 push r28
499 0168 DF93 push r29
500 /* prologue end (size=5) */
501 016a 7C01 movw r14,r24
502 016c EA01 movw r28,r20
283:../OSsrc/os_sem.c **** INT8U pend_stat;
284:../OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
285:../OSsrc/os_sem.c **** OS_CPU_SR cpu_sr = 0;
286:../OSsrc/os_sem.c **** #endif
287:../OSsrc/os_sem.c ****
288:../OSsrc/os_sem.c ****
289:../OSsrc/os_sem.c ****
290:../OSsrc/os_sem.c **** #if OS_ARG_CHK_EN > 0
291:../OSsrc/os_sem.c **** if (perr == (INT8U *)0) { /* Validate 'perr'
504 .LM68:
505 016e 452B or r20,r21
506 0170 09F4 brne .+2
507 0172 50C0 rjmp .L30
292:../OSsrc/os_sem.c **** return;
293:../OSsrc/os_sem.c **** }
294:../OSsrc/os_sem.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
509 .LM69:
510 0174 0097 sbiw r24,0
511 0176 11F4 brne .L32
295:../OSsrc/os_sem.c **** *perr = OS_ERR_PEVENT_NULL;
513 .LM70:
514 0178 84E0 ldi r24,lo8(4)
515 017a 46C0 rjmp .L42
516 .L32:
296:../OSsrc/os_sem.c **** return;
297:../OSsrc/os_sem.c **** }
298:../OSsrc/os_sem.c **** #endif
299:../OSsrc/os_sem.c **** if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
518 .LM71:
519 017c FC01 movw r30,r24
520 017e 8081 ld r24,Z
521 0180 8330 cpi r24,lo8(3)
522 0182 11F0 breq .L33
300:../OSsrc/os_sem.c **** *perr = OS_ERR_EVENT_TYPE;
524 .LM72:
525 0184 81E0 ldi r24,lo8(1)
526 0186 40C0 rjmp .L42
527 .L33:
301:../OSsrc/os_sem.c **** return;
302:../OSsrc/os_sem.c **** }
303:../OSsrc/os_sem.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
529 .LM73:
530 0188 8091 0000 lds r24,OSIntNesting
531 018c 8823 tst r24
532 018e 11F0 breq .L34
304:../OSsrc/os_sem.c **** *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR
534 .LM74:
535 0190 82E0 ldi r24,lo8(2)
536 0192 3AC0 rjmp .L42
537 .L34:
305:../OSsrc/os_sem.c **** return;
306:../OSsrc/os_sem.c **** }
307:../OSsrc/os_sem.c **** if (OSLockNesting > 0) { /* See if called with scheduler locked ...
539 .LM75:
540 0194 8091 0000 lds r24,OSLockNesting
541 0198 8823 tst r24
542 019a 11F0 breq .L35
308:../OSsrc/os_sem.c **** *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked
544 .LM76:
545 019c 8DE0 ldi r24,lo8(13)
546 019e 34C0 rjmp .L42
547 .L35:
309:../OSsrc/os_sem.c **** return;
310:../OSsrc/os_sem.c **** }
311:../OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
549 .LM77:
550 /* #APP */
551 01a0 F894 cli
312:../OSsrc/os_sem.c **** if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ..
553 .LM78:
554 /* #NOAPP */
555 01a2 F701 movw r30,r14
556 01a4 8381 ldd r24,Z+3
557 01a6 9481 ldd r25,Z+4
558 01a8 0097 sbiw r24,0
559 01aa 29F0 breq .L36
313:../OSsrc/os_sem.c **** pevent->OSEventCnt--; /* ... decrement semaphore only if positive.
561 .LM79:
562 01ac 0197 sbiw r24,1
563 01ae 9483 std Z+4,r25
564 01b0 8383 std Z+3,r24
314:../OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
566 .LM80:
567 /* #APP */
568 01b2 7894 sei
569 /* #NOAPP */
570 01b4 2EC0 rjmp .L43
571 .L36:
315:../OSsrc/os_sem.c **** *perr = OS_ERR_NONE;
316:../OSsrc/os_sem.c **** return;
317:../OSsrc/os_sem.c **** }
318:../OSsrc/os_sem.c **** /* Otherwise, must wait until event occurs
319:../OSsrc/os_sem.c **** OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore
573 .LM81:
574 01b6 E091 0000 lds r30,OSTCBCur
575 01ba F091 0000 lds r31,(OSTCBCur)+1
576 01be 818D ldd r24,Z+25
577 01c0 8160 ori r24,lo8(1)
578 01c2 818F std Z+25,r24
320:../OSsrc/os_sem.c **** OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
580 .LM82:
581 01c4 E091 0000 lds r30,OSTCBCur
582 01c8 F091 0000 lds r31,(OSTCBCur)+1
583 01cc 128E std Z+26,__zero_reg__
321:../OSsrc/os_sem.c **** OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB
585 .LM83:
586 01ce E091 0000 lds r30,OSTCBCur
587 01d2 F091 0000 lds r31,(OSTCBCur)+1
588 01d6 708F std Z+24,r23
589 01d8 678B std Z+23,r22
322:../OSsrc/os_sem.c **** OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs
591 .LM84:
592 01da C701 movw r24,r14
593 01dc 0E94 0000 call OS_EventTaskWait
323:../OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
595 .LM85:
596 /* #APP */
597 01e0 7894 sei
324:../OSsrc/os_sem.c **** OS_Sched(); /* Find next highest priority task ready
599 .LM86:
600 /* #NOAPP */
601 01e2 0E94 0000 call OS_Sched
325:../OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
603 .LM87:
604 /* #APP */
605 01e6 F894 cli
326:../OSsrc/os_sem.c **** if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed-out or aborted
607 .LM88:
608 /* #NOAPP */
609 01e8 E091 0000 lds r30,OSTCBCur
610 01ec F091 0000 lds r31,(OSTCBCur)+1
611 01f0 128D ldd r17,Z+26
612 01f2 1123 tst r17
613 01f4 59F0 breq .L37
327:../OSsrc/os_sem.c **** pend_stat = OSTCBCur->OSTCBStatPend;
328:../OSsrc/os_sem.c **** OS_EventTOAbort(pevent);
615 .LM89:
616 01f6 C701 movw r24,r14
617 01f8 0E94 0000 call OS_EventTOAbort
329:../OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
619 .LM90:
620 /* #APP */
621 01fc 7894 sei
330:../OSsrc/os_sem.c **** switch (pend_stat) {
623 .LM91:
624 /* #NOAPP */
625 01fe 1230 cpi r17,lo8(2)
626 0200 11F0 breq .L41
331:../OSsrc/os_sem.c **** case OS_STAT_PEND_TO:
332:../OSsrc/os_sem.c **** default:
333:../OSsrc/os_sem.c **** *perr = OS_ERR_TIMEOUT; /* Indicate that didn't get event within TO
628 .LM92:
629 0202 8AE0 ldi r24,lo8(10)
630 0204 01C0 rjmp .L42
631 .L41:
334:../OSsrc/os_sem.c **** break;
335:../OSsrc/os_sem.c ****
336:../OSsrc/os_sem.c **** case OS_STAT_PEND_ABORT:
337:../OSsrc/os_sem.c **** *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted
633 .LM93:
634 0206 8EE0 ldi r24,lo8(14)
635 .L42:
636 0208 8883 st Y,r24
338:../OSsrc/os_sem.c **** break;
339:../OSsrc/os_sem.c **** }
340:../OSsrc/os_sem.c **** return;
638 .LM94:
639 020a 04C0 rjmp .L30
640 .L37:
341:../OSsrc/os_sem.c **** }
342:../OSsrc/os_sem.c **** OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -