📄 os_tmr.lst
字号:
811 OS_TMR *ptmr2;
812
813
814 OS_MemClr((INT8U *)&OSTmrTbl[0], sizeof(OSTmrTbl)); /* Clear all the TMRs */
815 OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */
816
817 ptmr1 = &OSTmrTbl[0];
818 ptmr2 = &OSTmrTbl[1];
819 for (i = 0; i < (OS_TMR_CFG_MAX - 1); i++) { /* Init. list of free TMRs */
820 ptmr1->OSTmrType = OS_TMR_TYPE;
821 ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
822 ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */
823 #if OS_TMR_CFG_NAME_SIZE > 1
824 ptmr1->OSTmrName[0] = '?'; /* Unknown name */
825 ptmr1->OSTmrName[1] = OS_ASCII_NUL;
826 #endif
827 ptmr1++;
828 ptmr2++;
829 }
830 ptmr1->OSTmrType = OS_TMR_TYPE;
831 ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
832 ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */
833 #if OS_TMR_CFG_NAME_SIZE > 1
834 ptmr1->OSTmrName[0] = '?'; /* Unknown name */
835 ptmr1->OSTmrName[1] = OS_ASCII_NUL;
836 #endif
837 OSTmrTime = 0;
838 OSTmrUsed = 0;
839 OSTmrFree = OS_TMR_CFG_MAX;
840 OSTmrFreeList = &OSTmrTbl[0];
841 OSTmrSem = OSSemCreate(1);
842 OSTmrSemSignal = OSSemCreate(0);
843
844 #if OS_EVENT_NAME_SIZE > 18
845 OSEventNameSet(OSTmrSem, (INT8U *)"uC/OS-II TmrLock", &err);/* Assign names to semaphores */
846 #else
847 #if OS_EVENT_NAME_SIZE > 10
848 OSEventNameSet(OSTmrSem, (INT8U *)"OS-TmrLock", &err);
849 #endif
850 #endif
851
852 #if OS_EVENT_NAME_SIZE > 18
853 OSEventNameSet(OSTmrSemSignal, (INT8U *)"uC/OS-II TmrSignal", &err);
854 #else
855 #if OS_EVENT_NAME_SIZE > 10
856 OSEventNameSet(OSTmrSemSignal, (INT8U *)"OS-TmrSig", &err);
857 #endif
858 #endif
859
860 OSTmr_InitTask();
861 }
862 #endif
863
864 /*$PAGE*/
865 /*
866 ************************************************************************************************************************
867 * INITIALIZE THE TIMER MANAGEMENT TASK
868 *
869 * Description: This function is called by OSTmrInit() to create the timer management task.
870 *
871 * Arguments : none
872 *
873 * Returns : none
874 ************************************************************************************************************************
875 */
876
877 #if OS_TMR_EN > 0
878 static void OSTmr_InitTask (void)
879 {
880 #if OS_TASK_NAME_SIZE > 6
881 INT8U err;
882 #endif
883
884
885 #if OS_TASK_CREATE_EXT_EN > 0
886 #if OS_STK_GROWTH == 1
887 (void)OSTaskCreateExt(OSTmr_Task,
888 (void *)0, /* No arguments passed to OSTmrTask() */
889 &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1], /* Set Top-Of-Stack */
890 OS_TASK_TMR_PRIO,
891 OS_TASK_TMR_ID,
892 &OSTmrTaskStk[0], /* Set Bottom-Of-Stack */
893 OS_TASK_TMR_STK_SIZE,
894 (void *)0, /* No TCB extension */
895 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
896 #else
897 (void)OSTaskCreateExt(OSTmr_Task,
898 (void *)0, /* No arguments passed to OSTmrTask() */
899 &OSTmrTaskStk[0], /* Set Top-Of-Stack */
900 OS_TASK_TMR_PRIO,
901 OS_TASK_TMR_ID,
902 &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1], /* Set Bottom-Of-Stack */
903 OS_TASK_TMR_STK_SIZE,
904 (void *)0, /* No TCB extension */
905 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
906 #endif
907 #else
908 #if OS_STK_GROWTH == 1
909 (void)OSTaskCreate(OSTmr_Task,
910 (void *)0,
911 &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1],
912 OS_TASK_TMR_PRIO);
913 #else
914 (void)OSTaskCreate(OSTmr_Task,
915 (void *)0,
916 &OSTmrTaskStk[0],
917 OS_TASK_TMR_PRIO);
918 #endif
919 #endif
920
921 #if OS_TASK_NAME_SIZE > 12
922 OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"uC/OS-II Tmr", &err);
923 #else
924 #if OS_TASK_NAME_SIZE > 6
925 OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"OS-Tmr", &err);
926 #endif
927 #endif
928 }
929 #endif
930
931 /*$PAGE*/
932 /*
933 ************************************************************************************************************************
934 * INSERT A TIMER INTO THE TIMER WHEEL
935 *
936 * Description: This function is called to insert the timer into the timer wheel. The timer is always inserted at the
937 * beginning of the list.
938 *
939 * Arguments : ptmr Is a pointer to the timer to insert.
940 *
941 * type Is either:
942 * OS_TMR_LINK_PERIODIC Means to re-insert the timer after a period expired
943 * OS_TMR_LINK_DLY Means to insert the timer the first time
944 *
945 * Returns : none
946 ************************************************************************************************************************
947 */
948
949 #if OS_TMR_EN > 0
950 static void OSTmr_Link (OS_TMR *ptmr, INT8U type)
951 {
952 OS_TMR *ptmr1;
953 OS_TMR_WHEEL *pspoke;
954 INT16U spoke;
955
956
957 ptmr->OSTmrState = OS_TMR_STATE_RUNNING;
958 if (type == OS_TMR_LINK_PERIODIC) { /* Determine when timer will expire */
959 ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
960 } else {
961 if (ptmr->OSTmrDly == 0) {
962 ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
963 } else {
964 ptmr->OSTmrMatch = ptmr->OSTmrDly + OSTmrTime;
965 }
966 }
967 spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
968 pspoke = &OSTmrWheelTbl[spoke];
969
970 if (pspoke->OSTmrFirst == (OS_TMR *)0) { /* Link into timer wheel */
971 pspoke->OSTmrFirst = ptmr;
972 ptmr->OSTmrNext = (OS_TMR *)0;
973 pspoke->OSTmrEntries = 1;
974 } else {
975 ptmr1 = pspoke->OSTmrFirst; /* Point to first timer in the spoke */
976 pspoke->OSTmrFirst = ptmr;
977 ptmr->OSTmrNext = (void *)ptmr1;
978 ptmr1->OSTmrPrev = (void *)ptmr;
979 pspoke->OSTmrEntries++;
980 }
981 ptmr->OSTmrPrev = (void *)0; /* Timer always inserted as first node in list */
982 }
983 #endif
984
985 /*$PAGE*/
986 /*
987 ************************************************************************************************************************
988 * REMOVE A TIMER FROM THE TIMER WHEEL
989 *
990 * Description: This function is called to remove the timer from the timer wheel.
991 *
992 * Arguments : ptmr Is a pointer to the timer to remove.
993 *
994 * Returns : none
995 ************************************************************************************************************************
996 */
997
998 #if OS_TMR_EN > 0
999 static void OSTmr_Unlink (OS_TMR *ptmr)
1000 {
1001 OS_TMR *ptmr1;
1002 OS_TMR *ptmr2;
1003 OS_TMR_WHEEL *pspoke;
1004 INT16U spoke;
1005
1006
1007 spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
1008 pspoke = &OSTmrWheelTbl[spoke];
1009
1010 if (pspoke->OSTmrFirst == ptmr) { /* See if timer to remove is at the beginning of list */
1011 ptmr1 = (OS_TMR *)ptmr->OSTmrNext;
1012 pspoke->OSTmrFirst = (OS_TMR *)ptmr1;
1013 if (ptmr1 != (OS_TMR *)0) {
1014 ptmr1->OSTmrPrev = (void *)0;
1015 }
1016 } else {
1017 ptmr1 = (OS_TMR *)ptmr->OSTmrPrev; /* Remove timer from somewhere in the list */
1018 ptmr2 = (OS_TMR *)ptmr->OSTmrNext;
1019 ptmr1->OSTmrNext = ptmr2;
1020 if (ptmr2 != (OS_TMR *)0) {
1021 ptmr2->OSTmrPrev = (void *)ptmr1;
1022 }
1023 }
1024 ptmr->OSTmrState = OS_TMR_STATE_STOPPED;
1025 ptmr->OSTmrNext = (void *)0;
1026 pt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -