33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_tmr__c =
"$Id: $";
41 #if OS_CFG_TMR_EN > 0u
48 #define OS_OPT_LINK_DLY (OS_OPT)(0u)
49 #define OS_OPT_LINK_PERIODIC (OS_OPT)(1u)
104 void OSTmrCreate (OS_TMR *p_tmr,
110 void *p_callback_arg,
117 #ifdef OS_SAFETY_CRITICAL
118 if (p_err == (
OS_ERR *)0) {
119 OS_SAFETY_CRITICAL_EXCEPTION();
124 #ifdef OS_SAFETY_CRITICAL_IEC61508
125 if (OSSafetyCriticalStartFlag ==
DEF_TRUE) {
131 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
138 #if OS_CFG_ARG_CHK_EN > 0u
139 if (p_tmr == (OS_TMR *)0) {
168 p_tmr->NamePtr = (
CPU_CHAR *)p_name;
172 p_tmr->Period = (
OS_TICK )period;
173 p_tmr->Opt = (
OS_OPT )opt;
175 p_tmr->CallbackPtrArg = (
void *)p_callback_arg;
176 p_tmr->NextPtr = (OS_TMR *)0;
177 p_tmr->PrevPtr = (OS_TMR *)0;
179 #if OS_CFG_DBG_EN > 0u
180 OS_TmrDbgListAdd(p_tmr);
211 #if OS_CFG_TMR_DEL_EN > 0u
219 #ifdef OS_SAFETY_CRITICAL
220 if (p_err == (
OS_ERR *)0) {
221 OS_SAFETY_CRITICAL_EXCEPTION();
226 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
233 #if OS_CFG_ARG_CHK_EN > 0u
234 if (p_tmr == (OS_TMR *)0) {
240 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
248 #if OS_CFG_DBG_EN > 0u
249 OS_TmrDbgListRemove(p_tmr);
253 switch (p_tmr->State) {
305 OS_TICK OSTmrRemainGet (OS_TMR *p_tmr,
313 #ifdef OS_SAFETY_CRITICAL
314 if (p_err == (
OS_ERR *)0) {
315 OS_SAFETY_CRITICAL_EXCEPTION();
320 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
327 #if OS_CFG_ARG_CHK_EN > 0u
328 if (p_tmr == (OS_TMR *)0) {
334 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
342 switch (p_tmr->State) {
344 remain = p_tmr->Match
346 p_tmr->Remain = remain;
353 if (p_tmr->Dly == 0u) {
354 remain = p_tmr->Period;
361 p_tmr->Remain = remain;
418 #ifdef OS_SAFETY_CRITICAL
419 if (p_err == (
OS_ERR *)0) {
420 OS_SAFETY_CRITICAL_EXCEPTION();
425 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
432 #if OS_CFG_ARG_CHK_EN > 0u
433 if (p_tmr == (OS_TMR *)0) {
439 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
447 switch (p_tmr->State) {
450 OS_TmrLink(p_tmr, OS_OPT_LINK_DLY);
457 OS_TmrLink(p_tmr, OS_OPT_LINK_DLY);
500 OS_STATE OSTmrStateGet (OS_TMR *p_tmr,
508 #ifdef OS_SAFETY_CRITICAL
509 if (p_err == (
OS_ERR *)0) {
510 OS_SAFETY_CRITICAL_EXCEPTION();
515 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
522 #if OS_CFG_ARG_CHK_EN > 0u
523 if (p_tmr == (OS_TMR *)0) {
529 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
537 state = p_tmr->State;
593 void *p_callback_arg,
601 #ifdef OS_SAFETY_CRITICAL
602 if (p_err == (
OS_ERR *)0) {
603 OS_SAFETY_CRITICAL_EXCEPTION();
608 #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
615 #if OS_CFG_ARG_CHK_EN > 0u
616 if (p_tmr == (OS_TMR *)0) {
622 #if OS_CFG_OBJ_TYPE_CHK_EN > 0u
630 switch (p_tmr->State) {
636 p_fnct = p_tmr->CallbackPtr;
638 (*p_fnct)((
void *)p_tmr, p_tmr->CallbackPtrArg);
645 p_fnct = p_tmr->CallbackPtr;
647 (*p_fnct)((
void *)p_tmr, p_callback_arg);
698 void OS_TmrClr (OS_TMR *p_tmr)
702 p_tmr->NamePtr = (
CPU_CHAR *)((
void *)
"?TMR");
709 p_tmr->CallbackPtrArg = (
void *)0;
710 p_tmr->NextPtr = (OS_TMR *)0;
711 p_tmr->PrevPtr = (OS_TMR *)0;
730 #if OS_CFG_DBG_EN > 0u
731 void OS_TmrDbgListAdd (OS_TMR *p_tmr)
733 p_tmr->DbgPrevPtr = (OS_TMR *)0;
734 if (OSTmrDbgListPtr == (OS_TMR *)0) {
735 p_tmr->DbgNextPtr = (OS_TMR *)0;
737 p_tmr->DbgNextPtr = OSTmrDbgListPtr;
738 OSTmrDbgListPtr->DbgPrevPtr = p_tmr;
740 OSTmrDbgListPtr = p_tmr;
745 void OS_TmrDbgListRemove (OS_TMR *p_tmr)
751 p_tmr_prev = p_tmr->DbgPrevPtr;
752 p_tmr_next = p_tmr->DbgNextPtr;
754 if (p_tmr_prev == (OS_TMR *)0) {
755 OSTmrDbgListPtr = p_tmr_next;
756 if (p_tmr_next != (OS_TMR *)0) {
757 p_tmr_next->DbgPrevPtr = (OS_TMR *)0;
759 p_tmr->DbgNextPtr = (OS_TMR *)0;
761 }
else if (p_tmr_next == (OS_TMR *)0) {
762 p_tmr_prev->DbgNextPtr = (OS_TMR *)0;
763 p_tmr->DbgPrevPtr = (OS_TMR *)0;
766 p_tmr_prev->DbgNextPtr = p_tmr_next;
767 p_tmr_next->DbgPrevPtr = p_tmr_prev;
768 p_tmr->DbgNextPtr = (OS_TMR *)0;
769 p_tmr->DbgPrevPtr = (OS_TMR *)0;
795 void OS_TmrInit (
OS_ERR *p_err)
798 OS_TMR_SPOKE *p_spoke;
802 #ifdef OS_SAFETY_CRITICAL
803 if (p_err == (
OS_ERR *)0) {
804 OS_SAFETY_CRITICAL_EXCEPTION();
809 #if OS_CFG_DBG_EN > 0u
810 OSTmrDbgListPtr = (OS_TMR *)0;
818 OSTmrUpdateCtr = OSTmrUpdateCnt;
822 OSTmrTaskTimeMax = (
CPU_TS)0;
825 p_spoke = &OSCfg_TmrWheel[i];
828 p_spoke->FirstPtr = (OS_TMR *)0;
848 (
CPU_CHAR *)((
void *)
"uC/OS-III Timer Task"),
884 void OS_TmrLink (OS_TMR *p_tmr,
887 OS_TMR_SPOKE *p_spoke;
895 if (opt == OS_OPT_LINK_PERIODIC) {
896 p_tmr->Match = p_tmr->Period + OSTmrTickCtr;
898 if (p_tmr->Dly == (
OS_TICK)0) {
899 p_tmr->Match = p_tmr->Period + OSTmrTickCtr;
901 p_tmr->Match = p_tmr->Dly + OSTmrTickCtr;
905 p_spoke = &OSCfg_TmrWheel[spoke];
907 if (p_spoke->FirstPtr == (OS_TMR *)0) {
908 p_tmr->NextPtr = (OS_TMR *)0;
909 p_tmr->PrevPtr = (OS_TMR *)0;
910 p_spoke->FirstPtr = p_tmr;
911 p_spoke->NbrEntries = 1u;
913 p_tmr->Remain = p_tmr->Match
915 p_tmr1 = p_spoke->FirstPtr;
916 while (p_tmr1 != (OS_TMR *)0) {
917 p_tmr1->Remain = p_tmr1->Match
919 if (p_tmr->Remain > p_tmr1->Remain) {
920 if (p_tmr1->NextPtr != (OS_TMR *)0) {
921 p_tmr1 = p_tmr1->NextPtr;
923 p_tmr->NextPtr = (OS_TMR *)0;
924 p_tmr->PrevPtr = p_tmr1;
925 p_tmr1->NextPtr = p_tmr;
926 p_tmr1 = (OS_TMR *)0;
929 if (p_tmr1->PrevPtr == (OS_TMR *)0) {
930 p_tmr->PrevPtr = (OS_TMR *)0;
931 p_tmr->NextPtr = p_tmr1;
932 p_tmr1->PrevPtr = p_tmr;
933 p_spoke->FirstPtr = p_tmr;
935 p_tmr0 = p_tmr1->PrevPtr;
936 p_tmr->PrevPtr = p_tmr0;
937 p_tmr->NextPtr = p_tmr1;
938 p_tmr0->NextPtr = p_tmr;
939 p_tmr1->PrevPtr = p_tmr;
941 p_tmr1 = (OS_TMR *)0;
944 p_spoke->NbrEntries++;
946 if (p_spoke->NbrEntriesMax < p_spoke->NbrEntries) {
947 p_spoke->NbrEntriesMax = p_spoke->NbrEntries;
966 void OS_TmrResetPeak (
void)
968 OS_TMR_SPOKE *p_spoke;
974 p_spoke = (OS_TMR_SPOKE *)&OSCfg_TmrWheel[i];
995 void OS_TmrUnlink (OS_TMR *p_tmr)
997 OS_TMR_SPOKE *p_spoke;
1005 p_spoke = &OSCfg_TmrWheel[spoke];
1007 if (p_spoke->FirstPtr == p_tmr) {
1008 p_tmr1 = (OS_TMR *)p_tmr->NextPtr;
1009 p_spoke->FirstPtr = (OS_TMR *)p_tmr1;
1010 if (p_tmr1 != (OS_TMR *)0) {
1011 p_tmr1->PrevPtr = (OS_TMR *)0;
1014 p_tmr1 = (OS_TMR *)p_tmr->PrevPtr;
1015 p_tmr2 = (OS_TMR *)p_tmr->NextPtr;
1016 p_tmr1->NextPtr = p_tmr2;
1017 if (p_tmr2 != (OS_TMR *)0) {
1018 p_tmr2->PrevPtr = (OS_TMR *)p_tmr1;
1022 p_tmr->NextPtr = (OS_TMR *)0;
1023 p_tmr->PrevPtr = (OS_TMR *)0;
1024 p_spoke->NbrEntries--;
1042 void OS_TmrTask (
void *p_arg)
1047 OS_TMR_SPOKE *p_spoke;
1068 p_spoke = &OSCfg_TmrWheel[spoke];
1069 p_tmr = p_spoke->FirstPtr;
1072 if (p_tmr != (OS_TMR *)0) {
1073 p_tmr_next = (OS_TMR *)p_tmr->NextPtr;
1075 if (OSTmrTickCtr == p_tmr->Match) {
1076 OS_TmrUnlink(p_tmr);
1079 OS_OPT_LINK_PERIODIC);
1083 p_fnct = p_tmr->CallbackPtr;
1085 (*p_fnct)((
void *)p_tmr,
1086 p_tmr->CallbackPtrArg);
1098 if (OSTmrTaskTimeMax < ts_end) {
1099 OSTmrTaskTimeMax = ts_end;