📄 os_q.lst
字号:
480:os/source/os_q.c **** #endif
481:os/source/os_q.c **** OS_ENTER_CRITICAL();
748 .LM95:
749 /* #APP */
750 026e F894 cli
482:os/source/os_q.c **** if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue
752 .LM96:
753 /* #NOAPP */
754 0270 8181 ldd r24,Z+1
755 0272 8823 tst r24
756 0274 41F0 breq .L26
483:os/source/os_q.c **** OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* Ready highest priority task waiting on eve
758 .LM97:
759 0276 44E0 ldi r20,lo8(4)
760 0278 CF01 movw r24,r30
761 027a 0E94 0000 call OS_EventTaskRdy
484:os/source/os_q.c **** OS_EXIT_CRITICAL();
763 .LM98:
764 /* #APP */
765 027e 7894 sei
485:os/source/os_q.c **** OS_Sched(); /* Find highest priority task ready to run
767 .LM99:
768 /* #NOAPP */
769 0280 0E94 0000 call OS_Sched
770 0284 27C0 rjmp .L29
771 .L26:
486:os/source/os_q.c **** return (OS_NO_ERR);
487:os/source/os_q.c **** }
488:os/source/os_q.c **** pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block
773 .LM100:
774 0286 A481 ldd r26,Z+4
775 0288 B581 ldd r27,Z+5
489:os/source/os_q.c **** if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full
777 .LM101:
778 028a ED01 movw r28,r26
779 028c 4C85 ldd r20,Y+12
780 028e 5D85 ldd r21,Y+13
781 0290 8A85 ldd r24,Y+10
782 0292 9B85 ldd r25,Y+11
783 0294 4817 cp r20,r24
784 0296 5907 cpc r21,r25
785 0298 20F0 brlo .L27
490:os/source/os_q.c **** OS_EXIT_CRITICAL();
787 .LM102:
788 /* #APP */
789 029a 7894 sei
491:os/source/os_q.c **** return (OS_Q_FULL);
791 .LM103:
792 /* #NOAPP */
793 029c 8EE1 ldi r24,lo8(30)
794 029e 90E0 ldi r25,hi8(30)
795 02a0 1BC0 rjmp .L25
796 .L27:
492:os/source/os_q.c **** }
493:os/source/os_q.c **** if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue en
798 .LM104:
799 02a2 FD01 movw r30,r26
800 02a4 2085 ldd r18,Z+8
801 02a6 3185 ldd r19,Z+9
802 02a8 8281 ldd r24,Z+2
803 02aa 9381 ldd r25,Z+3
804 02ac 2817 cp r18,r24
805 02ae 3907 cpc r19,r25
806 02b0 21F4 brne .L28
494:os/source/os_q.c **** pq->OSQOut = pq->OSQEnd;
808 .LM105:
809 02b2 8481 ldd r24,Z+4
810 02b4 9581 ldd r25,Z+5
811 02b6 9187 std Z+9,r25
812 02b8 8087 std Z+8,r24
813 .L28:
495:os/source/os_q.c **** }
496:os/source/os_q.c **** pq->OSQOut--;
815 .LM106:
816 02ba ED01 movw r28,r26
817 02bc E885 ldd r30,Y+8
818 02be F985 ldd r31,Y+9
819 02c0 3297 sbiw r30,2
820 02c2 F987 std Y+9,r31
821 02c4 E887 std Y+8,r30
497:os/source/os_q.c **** *pq->OSQOut = msg; /* Insert message into queue
823 .LM107:
824 02c6 7183 std Z+1,r23
825 02c8 6083 st Z,r22
498:os/source/os_q.c **** pq->OSQEntries++; /* Update the nbr of entries in the queue
827 .LM108:
828 02ca 4F5F subi r20,lo8(-(1))
829 02cc 5F4F sbci r21,hi8(-(1))
830 02ce 5D87 std Y+13,r21
831 02d0 4C87 std Y+12,r20
499:os/source/os_q.c **** OS_EXIT_CRITICAL();
833 .LM109:
834 /* #APP */
835 02d2 7894 sei
836 /* #NOAPP */
837 .L29:
500:os/source/os_q.c **** return (OS_NO_ERR);
839 .LM110:
840 02d4 80E0 ldi r24,lo8(0)
841 02d6 90E0 ldi r25,hi8(0)
842 .L25:
843 /* epilogue: frame size=0 */
844 02d8 DF91 pop r29
845 02da CF91 pop r28
846 02dc 0895 ret
847 /* epilogue end (size=3) */
848 /* function OSQPostFront size 63 (58) */
853 .Lscope5:
858 .global OSQPostOpt
860 OSQPostOpt:
501:os/source/os_q.c **** }
502:os/source/os_q.c **** #endif
503:os/source/os_q.c **** /*$PAGE*/
504:os/source/os_q.c **** /*
505:os/source/os_q.c **** ***************************************************************************************************
506:os/source/os_q.c **** * POST MESSAGE TO A QUEUE
507:os/source/os_q.c **** *
508:os/source/os_q.c **** * Description: This function sends a message to a queue. This call has been added to reduce code s
509:os/source/os_q.c **** * since it can replace both OSQPost() and OSQPostFront(). Also, this function adds th
510:os/source/os_q.c **** * capability to broadcast a message to ALL tasks waiting on the message queue.
511:os/source/os_q.c **** *
512:os/source/os_q.c **** * Arguments : pevent is a pointer to the event control block associated with the desired qu
513:os/source/os_q.c **** *
514:os/source/os_q.c **** * msg is a pointer to the message to send. You MUST NOT send a NULL pointer
515:os/source/os_q.c **** *
516:os/source/os_q.c **** * opt determines the type of POST performed:
517:os/source/os_q.c **** * OS_POST_OPT_NONE POST to a single waiting task
518:os/source/os_q.c **** * (Identical to OSQPost())
519:os/source/os_q.c **** * OS_POST_OPT_BROADCAST POST to ALL tasks that are waiting on the que
520:os/source/os_q.c **** * OS_POST_OPT_FRONT POST as LIFO (Simulates OSQPostFront())
521:os/source/os_q.c **** *
522:os/source/os_q.c **** * Below is a list of ALL the possible combination of these flags:
523:os/source/os_q.c **** *
524:os/source/os_q.c **** * 1) OS_POST_OPT_NONE
525:os/source/os_q.c **** * identical to OSQPost()
526:os/source/os_q.c **** *
527:os/source/os_q.c **** * 2) OS_POST_OPT_FRONT
528:os/source/os_q.c **** * identical to OSQPostFront()
529:os/source/os_q.c **** *
530:os/source/os_q.c **** * 3) OS_POST_OPT_BROADCAST
531:os/source/os_q.c **** * identical to OSQPost() but will broadcast 'msg' to ALL waiting
532:os/source/os_q.c **** *
533:os/source/os_q.c **** * 4) OS_POST_OPT_FRONT + OS_POST_OPT_BROADCAST is identical to
534:os/source/os_q.c **** * OSQPostFront() except that will broadcast 'msg' to ALL waiting
535:os/source/os_q.c **** *
536:os/source/os_q.c **** * Returns : OS_NO_ERR The call was successful and the message was sent
537:os/source/os_q.c **** * OS_Q_FULL If the queue cannot accept any more messages because it is ful
538:os/source/os_q.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a queue.
539:os/source/os_q.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
540:os/source/os_q.c **** * OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
541:os/source/os_q.c **** *
542:os/source/os_q.c **** * Warning : Interrupts can be disabled for a long time if you do a 'broadcast'. In fact, the
543:os/source/os_q.c **** * interrupt disable time is proportional to the number of tasks waiting on the queue.
544:os/source/os_q.c **** ***************************************************************************************************
545:os/source/os_q.c **** */
546:os/source/os_q.c ****
547:os/source/os_q.c **** #if OS_Q_POST_OPT_EN > 0
548:os/source/os_q.c **** INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
549:os/source/os_q.c **** {
862 .LM111:
863 /* prologue: frame size=0 */
864 02de 0F93 push r16
865 02e0 1F93 push r17
866 02e2 CF93 push r28
867 02e4 DF93 push r29
868 /* prologue end (size=4) */
869 02e6 EC01 movw r28,r24
870 02e8 8B01 movw r16,r22
550:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
551:os/source/os_q.c **** OS_CPU_SR cpu_sr;
552:os/source/os_q.c **** #endif
553:os/source/os_q.c **** OS_Q *pq;
554:os/source/os_q.c ****
555:os/source/os_q.c ****
556:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
557:os/source/os_q.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
558:os/source/os_q.c **** return (OS_ERR_PEVENT_NULL);
559:os/source/os_q.c **** }
560:os/source/os_q.c **** if (msg == (void *)0) { /* Make sure we are not posting a NULL pointe
561:os/source/os_q.c **** return (OS_ERR_POST_NULL_PTR);
562:os/source/os_q.c **** }
563:os/source/os_q.c **** if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type
564:os/source/os_q.c **** return (OS_ERR_EVENT_TYPE);
565:os/source/os_q.c **** }
566:os/source/os_q.c **** #endif
567:os/source/os_q.c **** OS_ENTER_CRITICAL();
872 .LM112:
873 /* #APP */
874 02ea F894 cli
568:os/source/os_q.c **** if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue
876 .LM113:
877 /* #NOAPP */
878 02ec 8981 ldd r24,Y+1
879 02ee 8823 tst r24
880 02f0 99F0 breq .L31
569:os/source/os_q.c **** if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting task
882 .LM114:
883 02f2 40FF sbrs r20,0
884 02f4 09C0 rjmp .L32
885 .L35:
570:os/source/os_q.c **** while (pevent->OSEventGrp != 0x00) { /* Yes, Post to ALL tasks waiting on queue
571:os/source/os_q.c **** OS_EventTaskRdy(pevent, msg, OS_STAT_Q);
887 .LM115:
888 02f6 44E0 ldi r20,lo8(4)
889 02f8 B801 movw r22,r16
890 02fa CE01 movw r24,r28
891 02fc 0E94 0000 call OS_EventTaskRdy
892 0300 8981 ldd r24,Y+1
893 0302 8823 tst r24
894 0304 C1F7 brne .L35
895 0306 04C0 rjmp .L36
896 .L32:
572:os/source/os_q.c **** }
573:os/source/os_q.c **** } else {
574:os/source/os_q.c **** OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* No, Post to HPT waiting on queue
898 .LM116:
899 0308 44E0 ldi r20,lo8(4)
900 030a CE01 movw r24,r28
901 030c 0E94 0000 call OS_EventTaskRdy
902 .L36:
575:os/source/os_q.c **** }
576:os/source/os_q.c **** OS_EXIT_CRITICAL();
904 .LM117:
905 /* #APP */
906 0310 7894 sei
577:os/source/os_q.c **** OS_Sched(); /* Find highest priority task ready to run
908 .LM118:
909 /* #NOAPP */
910 0312 0E94 0000 call OS_Sched
911 0316 3BC0 rjmp .L44
912 .L31:
578:os/source/os_q.c **** return (OS_NO_ERR);
579:os/source/os_q.c **** }
580:os/source/os_q.c **** pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block
914 .LM119:
915 0318 AC81 ldd r26,Y+4
916 031a BD81 ldd r27,Y+5
581:os/source/os_q.c **** if (pq->OSQEntries >= pq->O
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -