os_sem.lst
来自「atmega单片机用的ucos系统 占用内存适中 是atmega单片机合适的操作」· LST 代码 · 共 1,188 行 · 第 1/4 页
LST
1,188 行
275:OSsrc/os_sem.c **** *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR
487 .LM67:
488 0186 82E0 ldi r24,lo8(2)
489 0188 3FC0 rjmp .L35
490 .L29:
276:OSsrc/os_sem.c **** return;
277:OSsrc/os_sem.c **** }
278:OSsrc/os_sem.c **** #if OS_ARG_CHK_EN > 0
279:OSsrc/os_sem.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
492 .LM68:
493 018a 2097 sbiw r28,0
494 018c 11F4 brne .L30
280:OSsrc/os_sem.c **** *err = OS_ERR_PEVENT_NULL;
496 .LM69:
497 018e 84E0 ldi r24,lo8(4)
498 0190 3BC0 rjmp .L35
499 .L30:
281:OSsrc/os_sem.c **** return;
282:OSsrc/os_sem.c **** }
283:OSsrc/os_sem.c **** #endif
284:OSsrc/os_sem.c **** if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
501 .LM70:
502 0192 8881 ld r24,Y
503 0194 8330 cpi r24,lo8(3)
504 0196 11F0 breq .L31
285:OSsrc/os_sem.c **** *err = OS_ERR_EVENT_TYPE;
506 .LM71:
507 0198 81E0 ldi r24,lo8(1)
508 019a 36C0 rjmp .L35
509 .L31:
286:OSsrc/os_sem.c **** return;
287:OSsrc/os_sem.c **** }
288:OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
511 .LM72:
512 /* #APP */
513 019c 0FB6 in __tmp_reg__,__SREG__
514 019e F894 cli
515 01a0 0F92 push __tmp_reg__
289:OSsrc/os_sem.c **** if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ..
517 .LM73:
518 /* #NOAPP */
519 01a2 8A81 ldd r24,Y+2
520 01a4 9B81 ldd r25,Y+3
521 01a6 0097 sbiw r24,0
522 01a8 31F0 breq .L32
290:OSsrc/os_sem.c **** pevent->OSEventCnt--; /* ... decrement semaphore only if positive.
524 .LM74:
525 01aa 0197 sbiw r24,1
526 01ac 8A83 std Y+2,r24
527 01ae 9B83 std Y+3,r25
291:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
529 .LM75:
530 /* #APP */
531 01b0 0F90 pop __tmp_reg__
532 01b2 0FBE out __SREG__,__tmp_reg__
533 /* #NOAPP */
534 01b4 30C0 rjmp .L34
535 .L32:
292:OSsrc/os_sem.c **** *err = OS_NO_ERR;
293:OSsrc/os_sem.c **** return;
294:OSsrc/os_sem.c **** }
295:OSsrc/os_sem.c **** /* Otherwise, must wait until event occurs
296:OSsrc/os_sem.c **** OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore
537 .LM76:
538 01b6 E091 0000 lds r30,OSTCBCur
539 01ba F091 0000 lds r31,(OSTCBCur)+1
540 01be 8485 ldd r24,Z+12
541 01c0 8160 ori r24,lo8(1)
542 01c2 8487 std Z+12,r24
297:OSsrc/os_sem.c **** OSTCBCur->OSTCBPendTO = FALSE;
544 .LM77:
545 01c4 E091 0000 lds r30,OSTCBCur
546 01c8 F091 0000 lds r31,(OSTCBCur)+1
547 01cc 1586 std Z+13,__zero_reg__
298:OSsrc/os_sem.c **** OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB
549 .LM78:
550 01ce E091 0000 lds r30,OSTCBCur
551 01d2 F091 0000 lds r31,(OSTCBCur)+1
552 01d6 6287 std Z+10,r22
553 01d8 7387 std Z+11,r23
299:OSsrc/os_sem.c **** OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs
555 .LM79:
556 01da CE01 movw r24,r28
557 01dc 0E94 0000 call OS_EventTaskWait
300:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
559 .LM80:
560 /* #APP */
561 01e0 0F90 pop __tmp_reg__
562 01e2 0FBE out __SREG__,__tmp_reg__
301:OSsrc/os_sem.c **** OS_Sched(); /* Find next highest priority task ready
564 .LM81:
565 /* #NOAPP */
566 01e4 0E94 0000 call OS_Sched
302:OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
568 .LM82:
569 /* #APP */
570 01e8 0FB6 in __tmp_reg__,__SREG__
571 01ea F894 cli
572 01ec 0F92 push __tmp_reg__
303:OSsrc/os_sem.c **** if (OSTCBCur->OSTCBPendTO == TRUE) { /* See if we timedout
574 .LM83:
575 /* #NOAPP */
576 01ee E091 0000 lds r30,OSTCBCur
577 01f2 F091 0000 lds r31,(OSTCBCur)+1
578 01f6 8585 ldd r24,Z+13
579 01f8 8130 cpi r24,lo8(1)
580 01fa 49F4 brne .L33
304:OSsrc/os_sem.c **** OS_EventTO(pevent);
582 .LM84:
583 01fc CE01 movw r24,r28
584 01fe 0E94 0000 call OS_EventTO
305:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
586 .LM85:
587 /* #APP */
588 0202 0F90 pop __tmp_reg__
589 0204 0FBE out __SREG__,__tmp_reg__
306:OSsrc/os_sem.c **** *err = OS_TIMEOUT; /* Indicate that didn't get event within TO
591 .LM86:
592 /* #NOAPP */
593 0206 8AE0 ldi r24,lo8(10)
594 .L35:
595 0208 F801 movw r30,r16
596 020a 8083 st Z,r24
307:OSsrc/os_sem.c **** return;
598 .LM87:
599 020c 06C0 rjmp .L28
600 .L33:
308:OSsrc/os_sem.c **** }
309:OSsrc/os_sem.c **** OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
602 .LM88:
603 020e 1682 std Z+6,__zero_reg__
604 0210 1782 std Z+7,__zero_reg__
310:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
606 .LM89:
607 /* #APP */
608 0212 0F90 pop __tmp_reg__
609 0214 0FBE out __SREG__,__tmp_reg__
610 /* #NOAPP */
611 .L34:
311:OSsrc/os_sem.c **** *err = OS_NO_ERR;
613 .LM90:
614 0216 F801 movw r30,r16
615 0218 1082 st Z,__zero_reg__
616 .L28:
617 /* epilogue: frame size=0 */
618 021a DF91 pop r29
619 021c CF91 pop r28
620 021e 1F91 pop r17
621 0220 0F91 pop r16
622 0222 0895 ret
623 /* epilogue end (size=5) */
624 /* function OSSemPend size 103 (94) */
626 .Lscope3:
629 .global OSSemPost
631 OSSemPost:
312:OSsrc/os_sem.c **** }
313:OSsrc/os_sem.c **** /*$PAGE*/
314:OSsrc/os_sem.c **** /*
315:OSsrc/os_sem.c **** ***************************************************************************************************
316:OSsrc/os_sem.c **** * POST TO A SEMAPHORE
317:OSsrc/os_sem.c **** *
318:OSsrc/os_sem.c **** * Description: This function signals a semaphore
319:OSsrc/os_sem.c **** *
320:OSsrc/os_sem.c **** * Arguments : pevent is a pointer to the event control block associated with the desired
321:OSsrc/os_sem.c **** * semaphore.
322:OSsrc/os_sem.c **** *
323:OSsrc/os_sem.c **** * Returns : OS_NO_ERR The call was successful and the semaphore was signaled.
324:OSsrc/os_sem.c **** * OS_SEM_OVF If the semaphore count exceeded its limit. In other words, you
325:OSsrc/os_sem.c **** * signalled the semaphore more often than you waited on it with ei
326:OSsrc/os_sem.c **** * OSSemAccept() or OSSemPend().
327:OSsrc/os_sem.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
328:OSsrc/os_sem.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
329:OSsrc/os_sem.c **** ***************************************************************************************************
330:OSsrc/os_sem.c **** */
331:OSsrc/os_sem.c ****
332:OSsrc/os_sem.c **** INT8U OSSemPost (OS_EVENT *pevent)
333:OSsrc/os_sem.c **** {
633 .LM91:
634 /* prologue: frame size=0 */
635 /* prologue end (size=0) */
636 0224 FC01 movw r30,r24
334:OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
335:OSsrc/os_sem.c **** OS_CPU_SR cpu_sr;
336:OSsrc/os_sem.c ****
337:OSsrc/os_sem.c ****
338:OSsrc/os_sem.c ****
339:OSsrc/os_sem.c **** cpu_sr = 0; /* Prevent compiler warning
340:OSsrc/os_sem.c **** #endif
341:OSsrc/os_sem.c **** #if OS_ARG_CHK_EN > 0
342:OSsrc/os_sem.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
638 .LM92:
639 0226 892B or r24,r25
640 0228 19F4 brne .L37
343:OSsrc/os_sem.c **** return (OS_ERR_PEVENT_NULL);
642 .LM93:
643 022a 84E0 ldi r24,lo8(4)
644 022c 90E0 ldi r25,hi8(4)
645 022e 0895 ret
646 .L37:
344:OSsrc/os_sem.c **** }
345:OSsrc/os_sem.c **** #endif
346:OSsrc/os_sem.c **** if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
648 .LM94:
649 0230 8081 ld r24,Z
650 0232 8330 cpi r24,lo8(3)
651 0234 19F0 breq .L38
347:OSsrc/os_sem.c **** return (OS_ERR_EVENT_TYPE);
653 .LM95:
654 0236 81E0 ldi r24,lo8(1)
655 0238 90E0 ldi r25,hi8(1)
656 023a 0895 ret
657 .L38:
348:OSsrc/os_sem.c **** }
349:OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
659 .LM96:
660 /* #APP */
661 023c 0FB6 in __tmp_reg__,__SREG__
662 023e F894 cli
663 0240 0F92 push __tmp_reg__
350:OSsrc/os_sem.c **** if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semap
665 .LM97:
666 /* #NOAPP */
667 0242 8181 ldd r24,Z+1
668 0244 8823 tst r24
669 0246 59F0 breq .L39
351:OSsrc/os_sem.c **** (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready HPT waiting on event
671 .LM98:
672 0248 41E0 ldi r20,lo8(1)
673 024a 60E0 ldi r22,lo8(0)
674 024c 70E0 ldi r23,hi8(0)
675 024e CF01 movw r24,r30
676 0250 0E94 0000 call OS_EventTaskRdy
352:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
678 .LM99:
679 /* #APP */
680 0254 0F90 pop __tmp_reg__
681 0256 0FBE out __SREG__,__tmp_reg__
353:OSsrc/os_sem.c **** OS_Sched(); /* Find HPT ready to run
683 .LM100:
684 /* #NOAPP */
685 0258 0E94 0000 call OS_Sched
686 025c 0BC0 rjmp .L41
687 .L39:
354:OSsrc/os_sem.c **** return (OS_NO_ERR);
355:OSsrc/os_sem.c **** }
356:OSsrc/os_sem.c **** if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow
689 .LM101:
690 025e 8281 ldd r24,Z+2
691 0260 9381 ldd r25,Z+3
692 0262 2FEF ldi r18,hi8(-1)
693 0264 8F3F cpi r24,lo8(-1)
694 0266 9207 cpc r25,r18
695 0268 41F0 breq .L40
357:OSsrc/os_sem.c **** pevent->OSEventCnt++; /* Increment semaphore count to register even
697 .LM102:
698 026a 0196 adiw r24,1
699 026c 8283 std Z+2,r24
700 026e 9383 std Z+3,r25
358:OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
702 .LM103:
703 /* #APP */
704 0270 0F90 pop __tmp_reg__
705 0272 0FBE out __SREG__,__tmp_reg__
706 /* #NOAPP */
707 .L41:
359:OSsrc/os_sem.c **** return (OS_NO_ERR);
709 .LM104:
710 0274 80E0 ldi r24,lo8(0)
711 0276 90E0 ldi r25,hi8(0)
712 0278 0895 ret
713 .L40:
360:OSsrc/os_sem.c **** }
361:OSsrc/os_sem.c **** OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum
715 .LM105:
716 /* #APP */
717 027a 0F90 pop __tmp_reg__
718 027c 0FBE out __SREG__,__tmp_reg__
362:OSsrc/os_sem.c **** return (OS_SEM_OVF);
720 .LM106:
721 /* #NOAPP */
722 027e 82E3 ldi r24,lo8(50)
723 0280 90E0 ldi r25,hi8(50)
363:OSsrc/os_sem.c **** }
725 .LM107:
726 0282 0895 ret
727 /* epilogue: frame size=0 */
728 0284 0895 ret
729 /* epilogue end (size=1) */
730 /* function OSSemPost size 58 (57) */
732 .Lscope4:
736 .global OSSemQuery
738 OSSemQuery:
364:OSsrc/os_sem.c **** /*$PAGE*/
365:OSsrc/os_sem.c **** /*
366:OSsrc/os_sem.c **** ***************************************************************************************************
367:OSsrc/os_sem.c **** * QUERY A SEMAPHORE
368:OSsrc/os_sem.c **** *
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?