?? os_flag.lst
字號:
802 4 }
803 3 break;
804 3 #endif
805 3 default:
806 3 OS_EXIT_CRITICAL();
807 3 *err = OS_FLAG_ERR_WAIT_TYPE;
808 3 return ((OS_FLAGS)0);
809 3 }
811 2 }
812 1 OS_EXIT_CRITICAL();
813 1 if (sched == TRUE) {
814 2 OS_Sched();
815 2 }
816 1 OS_ENTER_CRITICAL();
817 1 flags_cur = pgrp->OSFlagFlags;
818 1 OS_EXIT_CRITICAL();
819 1 *err = OS_NO_ERR;
820 1 return (flags_cur);
821 1 }
822 /*$PAGE*/
823 /*
824 *********************************************************************************************************
825 * QUERY EVENT FLAG
826 *
827 * Description: This function is used to check the value of the event flag group.
828 *
829 * Arguments : pgrp is a pointer to the desired event flag group.
830 *
831 * err is a pointer to an error code returned to the called:
832 * OS_NO_ERR The call was successfull
833 * OS_FLAG_INVALID_PGRP You passed a NULL pointer
834 * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
835 *
836 * Returns : The current value of the event flag group.
837 *
838 * Called From: Task or ISR
839 *********************************************************************************************************
840 */
841
842 #if OS_FLAG_QUERY_EN > 0
843 OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, INT8U *err) reentrant //using 0
844 {
845 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
846 1 OS_CPU_SR cpu_sr;
847 1 #endif
848 1 OS_FLAGS flags;
849 1
850 1
851 1 #if OS_ARG_CHK_EN > 0
852 1 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
853 2 *err = OS_FLAG_INVALID_PGRP;
854 2 return ((OS_FLAGS)0);
855 2 }
856 1 #endif
857 1 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
C51 COMPILER V7.06 OS_FLAG 07/18/2003 11:05:57 PAGE 15
858 2 *err = OS_ERR_EVENT_TYPE;
859 2 return ((OS_FLAGS)0);
860 2 }
861 1 OS_ENTER_CRITICAL();
862 1 flags = pgrp->OSFlagFlags;
863 1 OS_EXIT_CRITICAL();
864 1 *err = OS_NO_ERR;
865 1 return (flags); /* Return the current value of the event flags */
866 1 }
867 #endif
868
869 /*$PAGE*/
870 /*
871 *********************************************************************************************************
872 * SUSPEND TASK UNTIL EVENT FLAG(s) RECEIVED OR TIMEOUT OCCURS
873 *
874 * Description: This function is internal to uC/OS-II and is used to put a task to sleep until the desired
875 * event flag bit(s) are set.
876 *
877 * Arguments : pgrp is a pointer to the desired event flag group.
878 *
879 * pnode is a pointer to a structure which contains data about the task waiting for
880 * event flag bit(s) to be set.
881 *
882 * flags Is a bit pattern indicating which bit(s) (i.e. flags) you wish to check.
883 * The bits you want are specified by setting the corresponding bits in
884 * 'flags'. e.g. if your application wants to wait for bits 0 and 1 then
885 * 'flags' would contain 0x03.
886 *
887 * wait_type specifies whether you want ALL bits to be set/cleared or ANY of the bits
888 * to be set/cleared.
889 * You can specify the following argument:
890 *
891 * OS_FLAG_WAIT_CLR_ALL You will check ALL bits in 'mask' to be clear (0)
892 * OS_FLAG_WAIT_CLR_ANY You will check ANY bit in 'mask' to be clear (0)
893 * OS_FLAG_WAIT_SET_ALL You will check ALL bits in 'mask' to be set (1)
894 * OS_FLAG_WAIT_SET_ANY You will check ANY bit in 'mask' to be set (1)
895 *
896 * timeout is the desired amount of time that the task will wait for the event flag
897 * bit(s) to be set.
898 *
899 * Returns : none
900 *
901 * Called by : OSFlagPend() OS_FLAG.C
902 *
903 * Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
904 *********************************************************************************************************
905 */
906
907 static void OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16
-U timeout) reentrant //using 0
908 {
909 1 OS_FLAG_NODE *pnode_next;
910 1 INT8U y;
911 1
912 1
913 1 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
914 1 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
915 1 #if OS_TASK_DEL_EN > 0
916 1 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
917 1 #endif
918 1 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
C51 COMPILER V7.06 OS_FLAG 07/18/2003 11:05:57 PAGE 16
919 1 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
920 1 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
921 1 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
922 1 pnode->OSFlagNodePrev = (void *)0;
923 1 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
924 1 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
925 1 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
926 2 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
927 2 }
928 1 pgrp->OSFlagWaitList = (void *)pnode;
929 1
930 1 y = OSTCBCur->OSTCBY; /* Suspend current task until flag(s) received */
931 1 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
932 1 if (OSRdyTbl[y] == 0x00) {
933 2 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
934 2 }
935 1 }
936
937 /*$PAGE*/
938 /*
939 *********************************************************************************************************
940 * INITIALIZE THE EVENT FLAG MODULE
941 *
942 * Description: This function is called by uC/OS-II to initialize the event flag module. Your application
943 * MUST NOT call this function. In other words, this function is internal to uC/OS-II.
944 *
945 * Arguments : none
946 *
947 * Returns : none
948 *
949 * WARNING : You MUST NOT call this function from your code. This is an INTERNAL function to uC/OS-II.
950 *********************************************************************************************************
951 */
952
953 void OS_FlagInit (void) reentrant //using 0
954 {
955 1 #if OS_MAX_FLAGS == 1
OSFlagFreeList = (OS_FLAG_GRP *)&OSFlagTbl[0]; /* Only ONE event flag group! */
OSFlagFreeList->OSFlagType = OS_EVENT_TYPE_UNUSED;
OSFlagFreeList->OSFlagWaitList = (void *)0;
OSFlagFreeList->OSFlagFlags = (OS_FLAGS)0;
#if OS_FLAG_NAME_SIZE > 0
(void)strcpy(OSFlagFreeList->OSFlagName, "?");
#endif
#endif
964 1
965 1 #if OS_MAX_FLAGS >= 2
966 1 INT8U i;
967 1 OS_FLAG_GRP *pgrp1;
968 1 OS_FLAG_GRP *pgrp2;
969 1
970 1
971 1 (void)memset(&OSFlagTbl[0], 0, sizeof(OSFlagTbl)); /* Clear the flag group table */
972 1 pgrp1 = &OSFlagTbl[0];
973 1 pgrp2 = &OSFlagTbl[1];
974 1 for (i = 0; i < (OS_MAX_FLAGS - 1); i++) { /* Init. list of free EVENT FLAGS */
975 2 pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
976 2 pgrp1->OSFlagWaitList = (void *)pgrp2;
977 2 #if OS_FLAG_NAME_SIZE > 0
978 2 (void)strcpy(pgrp1->OSFlagName, "?"); /* Unknown name */
979 2 #endif
980 2 pgrp1++;
C51 COMPILER V7.06 OS_FLAG 07/18/2003 11:05:57 PAGE 17
981 2 pgrp2++;
982 2 }
983 1 pgrp1->OSFlagType = OS_EVENT_TYPE_UNUSED;
984 1 pgrp1->OSFlagWaitList = (void *)0;
985 1 #if OS_FLAG_NAME_SIZE > 0
986 1 (void)strcpy(pgrp1->OSFlagName, "?");
987 1 #endif
988 1 OSFlagFreeList = (OS_FLAG_GRP *)&OSFlagTbl[0];
989 1 #endif
990 1 }
991
992 /*$PAGE*/
993 /*
994 *********************************************************************************************************
995 * MAKE TASK READY-TO-RUN, EVENT(s) OCCURRED
996 *
997 * Description: This function is internal to uC/OS-II and is used to make a task ready-to-run because the
998 * desired event flag bits have been set.
999 *
1000 * Arguments : pnode is a pointer to a structure which contains data about the task waiting for
1001 *
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -