UCOS_TI_LM3S_Keil
 全部 结构体 文件 函数 变量 类型定义 宏定义 
os_tmr.c 文件参考
#include <ucos_ii.h>
os_tmr.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define OS_TMR_LINK_DLY   0u
 
#define OS_TMR_LINK_PERIODIC   1u
 

函数

static OS_TMROSTmr_Alloc (void)
 
static void OSTmr_Free (OS_TMR *ptmr)
 
static void OSTmr_InitTask (void)
 
static void OSTmr_Link (OS_TMR *ptmr, INT8U type)
 
static void OSTmr_Unlink (OS_TMR *ptmr)
 
static void OSTmr_Task (void *p_arg)
 
OS_TMROSTmrCreate (INT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK callback, void *callback_arg, INT8U *pname, INT8U *perr)
 
BOOLEAN OSTmrDel (OS_TMR *ptmr, INT8U *perr)
 
INT8U OSTmrNameGet (OS_TMR *ptmr, INT8U **pdest, INT8U *perr)
 
INT32U OSTmrRemainGet (OS_TMR *ptmr, INT8U *perr)
 
INT8U OSTmrStateGet (OS_TMR *ptmr, INT8U *perr)
 
BOOLEAN OSTmrStart (OS_TMR *ptmr, INT8U *perr)
 
BOOLEAN OSTmrStop (OS_TMR *ptmr, INT8U opt, void *callback_arg, INT8U *perr)
 
INT8U OSTmrSignal (void)
 
void OSTmr_Init (void)
 

宏定义说明

#define OS_TMR_LINK_DLY   0u

在文件 os_tmr.c46 行定义.

参考自 OSTmrStart().

#define OS_TMR_LINK_PERIODIC   1u

在文件 os_tmr.c47 行定义.

参考自 OSTmr_Link() , 以及 OSTmr_Task().

函数说明

static OS_TMR * OSTmr_Alloc ( void  )
static

在文件 os_tmr.c714 行定义.

参考 OSTmrFree, OSTmrFreeList, OS_TMR::OSTmrNext, OS_TMR::OSTmrPrev , 以及 OSTmrUsed.

参考自 OSTmrCreate().

715 {
716  OS_TMR *ptmr;
717 
718 
719  if (OSTmrFreeList == (OS_TMR *)0) {
720  return ((OS_TMR *)0);
721  }
722  ptmr = (OS_TMR *)OSTmrFreeList;
723  OSTmrFreeList = (OS_TMR *)ptmr->OSTmrNext;
724  ptmr->OSTmrNext = (OS_TCB *)0;
725  ptmr->OSTmrPrev = (OS_TCB *)0;
726  OSTmrUsed++;
727  OSTmrFree--;
728  return (ptmr);
729 }

这是这个函数的调用关系图:

static void OSTmr_Free ( OS_TMR ptmr)
static

在文件 os_tmr.c746 行定义.

参考 OS_TMR_OPT_NONE, OS_TMR_STATE_UNUSED, OS_TMR::OSTmrCallback, OS_TMR::OSTmrCallbackArg, OSTmrFree, OSTmrFreeList, OS_TMR::OSTmrMatch, OS_TMR::OSTmrName, OS_TMR::OSTmrNext, OS_TMR::OSTmrOpt, OS_TMR::OSTmrPeriod, OS_TMR::OSTmrPrev, OS_TMR::OSTmrState , 以及 OSTmrUsed.

参考自 OSTmrDel().

747 {
748  ptmr->OSTmrState = OS_TMR_STATE_UNUSED; /* Clear timer object fields */
749  ptmr->OSTmrOpt = OS_TMR_OPT_NONE;
750  ptmr->OSTmrPeriod = 0u;
751  ptmr->OSTmrMatch = 0u;
752  ptmr->OSTmrCallback = (OS_TMR_CALLBACK)0;
753  ptmr->OSTmrCallbackArg = (void *)0;
754 #if OS_TMR_CFG_NAME_EN > 0u
755  ptmr->OSTmrName = (INT8U *)"?";
756 #endif
757 
758  ptmr->OSTmrPrev = (OS_TCB *)0; /* Chain timer to free list */
759  ptmr->OSTmrNext = OSTmrFreeList;
760  OSTmrFreeList = ptmr;
761 
762  OSTmrUsed--; /* Update timer object statistics */
763  OSTmrFree++;
764 }

这是这个函数的调用关系图:

static void OSTmr_InitTask ( void  )
static

在文件 os_tmr.c842 行定义.

参考 OS_TASK_OPT_STK_CHK, OS_TASK_OPT_STK_CLR, OS_TASK_TMR_ID, OS_TASK_TMR_PRIO, OS_TASK_TMR_STK_SIZE, OSTaskCreate(), OSTaskCreateExt(), OSTaskNameSet(), OSTmr_Task() , 以及 OSTmrTaskStk.

参考自 OSTmr_Init().

843 {
844 #if OS_TASK_NAME_EN > 0u
845  INT8U err;
846 #endif
847 
848 
849 #if OS_TASK_CREATE_EXT_EN > 0u
850  #if OS_STK_GROWTH == 1u
852  (void *)0, /* No arguments passed to OSTmrTask() */
853  &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1], /* Set Top-Of-Stack */
856  &OSTmrTaskStk[0], /* Set Bottom-Of-Stack */
858  (void *)0, /* No TCB extension */
859  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
860  #else
862  (void *)0, /* No arguments passed to OSTmrTask() */
863  &OSTmrTaskStk[0], /* Set Top-Of-Stack */
866  &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1u], /* Set Bottom-Of-Stack */
868  (void *)0, /* No TCB extension */
869  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear stack */
870  #endif
871 #else
872  #if OS_STK_GROWTH == 1u
873  (void)OSTaskCreate(OSTmr_Task,
874  (void *)0,
875  &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1u],
877  #else
878  (void)OSTaskCreate(OSTmr_Task,
879  (void *)0,
880  &OSTmrTaskStk[0],
882  #endif
883 #endif
884 
885 #if OS_TASK_NAME_EN > 0u
886  OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"uC/OS-II Tmr", &err);
887 #endif
888 }

函数调用图:

这是这个函数的调用关系图:

static void OSTmr_Link ( OS_TMR ptmr,
INT8U  type 
)
static

在文件 os_tmr.c910 行定义.

参考 OS_TMR_CFG_WHEEL_SIZE, OS_TMR_LINK_PERIODIC, OS_TMR_STATE_RUNNING, OS_TMR::OSTmrDly, OS_TMR_WHEEL::OSTmrEntries, OS_TMR_WHEEL::OSTmrFirst, OS_TMR::OSTmrMatch, OS_TMR::OSTmrNext, OS_TMR::OSTmrPeriod, OS_TMR::OSTmrPrev, OS_TMR::OSTmrState, OSTmrTime , 以及 OSTmrWheelTbl.

参考自 OSTmr_Task() , 以及 OSTmrStart().

912 {
913  OS_TMR *ptmr1;
914  OS_TMR_WHEEL *pspoke;
915  INT16U spoke;
916 
917 
919  if (type == OS_TMR_LINK_PERIODIC) { /* Determine when timer will expire */
920  ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
921  } else {
922  if (ptmr->OSTmrDly == 0u) {
923  ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
924  } else {
925  ptmr->OSTmrMatch = ptmr->OSTmrDly + OSTmrTime;
926  }
927  }
928  spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
929  pspoke = &OSTmrWheelTbl[spoke];
930 
931  if (pspoke->OSTmrFirst == (OS_TMR *)0) { /* Link into timer wheel */
932  pspoke->OSTmrFirst = ptmr;
933  ptmr->OSTmrNext = (OS_TMR *)0;
934  pspoke->OSTmrEntries = 1u;
935  } else {
936  ptmr1 = pspoke->OSTmrFirst; /* Point to first timer in the spoke */
937  pspoke->OSTmrFirst = ptmr;
938  ptmr->OSTmrNext = (void *)ptmr1;
939  ptmr1->OSTmrPrev = (void *)ptmr;
940  pspoke->OSTmrEntries++;
941  }
942  ptmr->OSTmrPrev = (void *)0; /* Timer always inserted as first node in list */
943 }

这是这个函数的调用关系图:

static void OSTmr_Unlink ( OS_TMR ptmr)
static

在文件 os_tmr.c960 行定义.

参考 OS_TMR_CFG_WHEEL_SIZE, OS_TMR_STATE_STOPPED, OS_TMR_WHEEL::OSTmrEntries, OS_TMR_WHEEL::OSTmrFirst, OS_TMR::OSTmrMatch, OS_TMR::OSTmrNext, OS_TMR::OSTmrPrev, OS_TMR::OSTmrState , 以及 OSTmrWheelTbl.

参考自 OSTmr_Task(), OSTmrDel(), OSTmrStart() , 以及 OSTmrStop().

961 {
962  OS_TMR *ptmr1;
963  OS_TMR *ptmr2;
964  OS_TMR_WHEEL *pspoke;
965  INT16U spoke;
966 
967 
968  spoke = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
969  pspoke = &OSTmrWheelTbl[spoke];
970 
971  if (pspoke->OSTmrFirst == ptmr) { /* See if timer to remove is at the beginning of list */
972  ptmr1 = (OS_TMR *)ptmr->OSTmrNext;
973  pspoke->OSTmrFirst = (OS_TMR *)ptmr1;
974  if (ptmr1 != (OS_TMR *)0) {
975  ptmr1->OSTmrPrev = (void *)0;
976  }
977  } else {
978  ptmr1 = (OS_TMR *)ptmr->OSTmrPrev; /* Remove timer from somewhere in the list */
979  ptmr2 = (OS_TMR *)ptmr->OSTmrNext;
980  ptmr1->OSTmrNext = ptmr2;
981  if (ptmr2 != (OS_TMR *)0) {
982  ptmr2->OSTmrPrev = (void *)ptmr1;
983  }
984  }
986  ptmr->OSTmrNext = (void *)0;
987  ptmr->OSTmrPrev = (void *)0;
988  pspoke->OSTmrEntries--;
989 }

这是这个函数的调用关系图:

static void OSTmr_Task ( void *  p_arg)
static

在文件 os_tmr.c1006 行定义.

参考 OS_TMR_CFG_WHEEL_SIZE, OS_TMR_LINK_PERIODIC, OS_TMR_OPT_PERIODIC, OS_TMR_STATE_COMPLETED, OSSchedLock(), OSSchedUnlock(), OSSemPend(), OSTmr_Link(), OSTmr_Unlink(), OS_TMR::OSTmrCallback, OS_TMR::OSTmrCallbackArg, OS_TMR_WHEEL::OSTmrFirst, OS_TMR::OSTmrMatch, OS_TMR::OSTmrNext, OS_TMR::OSTmrOpt, OSTmrSemSignal, OS_TMR::OSTmrState, OSTmrTime , 以及 OSTmrWheelTbl.

参考自 OSTmr_InitTask().

1007 {
1008  INT8U err;
1009  OS_TMR *ptmr;
1010  OS_TMR *ptmr_next;
1011  OS_TMR_CALLBACK pfnct;
1012  OS_TMR_WHEEL *pspoke;
1013  INT16U spoke;
1014 
1015 
1016  (void)p_arg; /* Not using 'p_arg', prevent compiler warning */
1017  for (;;) {
1018  OSSemPend(OSTmrSemSignal, 0u, &err); /* Wait for signal indicating time to update timers */
1019  OSSchedLock();
1020  OSTmrTime++; /* Increment the current time */
1021  spoke = (INT16U)(OSTmrTime % OS_TMR_CFG_WHEEL_SIZE); /* Position on current timer wheel entry */
1022  pspoke = &OSTmrWheelTbl[spoke];
1023  ptmr = pspoke->OSTmrFirst;
1024  while (ptmr != (OS_TMR *)0) {
1025  ptmr_next = (OS_TMR *)ptmr->OSTmrNext; /* Point to next timer to update because current ... */
1026  /* ... timer could get unlinked from the wheel. */
1027  if (OSTmrTime == ptmr->OSTmrMatch) { /* Process each timer that expires */
1028  OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
1029  if (ptmr->OSTmrOpt == OS_TMR_OPT_PERIODIC) {
1030  OSTmr_Link(ptmr, OS_TMR_LINK_PERIODIC); /* Recalculate new position of timer in wheel */
1031  } else {
1032  ptmr->OSTmrState = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
1033  }
1034  pfnct = ptmr->OSTmrCallback; /* Execute callback function if available */
1035  if (pfnct != (OS_TMR_CALLBACK)0) {
1036  (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);
1037  }
1038  }
1039  ptmr = ptmr_next;
1040  }
1041  OSSchedUnlock();
1042  }
1043 }

函数调用图:

这是这个函数的调用关系图:

OS_TMR* OSTmrCreate ( INT32U  dly,
INT32U  period,
INT8U  opt,
OS_TMR_CALLBACK  callback,
void *  callback_arg,
INT8U pname,
INT8U perr 
)

在文件 os_tmr.c108 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INVALID_DLY, OS_ERR_TMR_INVALID_OPT, OS_ERR_TMR_INVALID_PERIOD, OS_ERR_TMR_ISR, OS_ERR_TMR_NON_AVAIL, OS_TMR_OPT_ONE_SHOT, OS_TMR_OPT_PERIODIC, OS_TMR_STATE_STOPPED, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Alloc(), OS_TMR::OSTmrCallback, OS_TMR::OSTmrCallbackArg, OS_TMR::OSTmrDly, OS_TMR::OSTmrName, OS_TMR::OSTmrOpt, OS_TMR::OSTmrPeriod , 以及 OS_TMR::OSTmrState.

115 {
116  OS_TMR *ptmr;
117 
118 
119 #if OS_ARG_CHK_EN > 0u
120  if (perr == (INT8U *)0) { /* Validate arguments */
121  return ((OS_TMR *)0);
122  }
123  switch (opt) {
124  case OS_TMR_OPT_PERIODIC:
125  if (period == 0u) {
127  return ((OS_TMR *)0);
128  }
129  break;
130 
131  case OS_TMR_OPT_ONE_SHOT:
132  if (dly == 0u) {
133  *perr = OS_ERR_TMR_INVALID_DLY;
134  return ((OS_TMR *)0);
135  }
136  break;
137 
138  default:
139  *perr = OS_ERR_TMR_INVALID_OPT;
140  return ((OS_TMR *)0);
141  }
142 #endif
143  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
144  *perr = OS_ERR_TMR_ISR;
145  return ((OS_TMR *)0);
146  }
147  OSSchedLock();
148  ptmr = OSTmr_Alloc(); /* Obtain a timer from the free pool */
149  if (ptmr == (OS_TMR *)0) {
150  OSSchedUnlock();
151  *perr = OS_ERR_TMR_NON_AVAIL;
152  return ((OS_TMR *)0);
153  }
154  ptmr->OSTmrState = OS_TMR_STATE_STOPPED; /* Indicate that timer is not running yet */
155  ptmr->OSTmrDly = dly;
156  ptmr->OSTmrPeriod = period;
157  ptmr->OSTmrOpt = opt;
158  ptmr->OSTmrCallback = callback;
159  ptmr->OSTmrCallbackArg = callback_arg;
160 #if OS_TMR_CFG_NAME_EN > 0u
161  ptmr->OSTmrName = pname;
162 #endif
163  OSSchedUnlock();
164  *perr = OS_ERR_NONE;
165  return (ptmr);
166 }

函数调用图:

BOOLEAN OSTmrDel ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c192 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_FALSE, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OS_TRUE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Free(), OSTmr_Unlink(), OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

194 {
195 #if OS_ARG_CHK_EN > 0u
196  if (perr == (INT8U *)0) { /* Validate arguments */
197  return (OS_FALSE);
198  }
199  if (ptmr == (OS_TMR *)0) {
200  *perr = OS_ERR_TMR_INVALID;
201  return (OS_FALSE);
202  }
203 #endif
204  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
205  *perr = OS_ERR_TMR_INVALID_TYPE;
206  return (OS_FALSE);
207  }
208  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
209  *perr = OS_ERR_TMR_ISR;
210  return (OS_FALSE);
211  }
212  OSSchedLock();
213  switch (ptmr->OSTmrState) {
215  OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
216  OSTmr_Free(ptmr); /* Return timer to free list of timers */
217  OSSchedUnlock();
218  *perr = OS_ERR_NONE;
219  return (OS_TRUE);
220 
221  case OS_TMR_STATE_STOPPED: /* Timer has not started or ... */
222  case OS_TMR_STATE_COMPLETED: /* ... timer has completed the ONE-SHOT time */
223  OSTmr_Free(ptmr); /* Return timer to free list of timers */
224  OSSchedUnlock();
225  *perr = OS_ERR_NONE;
226  return (OS_TRUE);
227 
228  case OS_TMR_STATE_UNUSED: /* Already deleted */
229  OSSchedUnlock();
230  *perr = OS_ERR_TMR_INACTIVE;
231  return (OS_FALSE);
232 
233  default:
234  OSSchedUnlock();
235  *perr = OS_ERR_TMR_INVALID_STATE;
236  return (OS_FALSE);
237  }
238 }

函数调用图:

INT8U OSTmrNameGet ( OS_TMR ptmr,
INT8U **  pdest,
INT8U perr 
)

在文件 os_tmr.c266 行定义.

参考 OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_DEST, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_StrLen(), OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OS_TMR::OSTmrName, OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

269 {
270  INT8U len;
271 
272 
273 #if OS_ARG_CHK_EN > 0u
274  if (perr == (INT8U *)0) {
275  return (0u);
276  }
277  if (pdest == (INT8U **)0) {
278  *perr = OS_ERR_TMR_INVALID_DEST;
279  return (0u);
280  }
281  if (ptmr == (OS_TMR *)0) {
282  *perr = OS_ERR_TMR_INVALID;
283  return (0u);
284  }
285 #endif
286  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
287  *perr = OS_ERR_TMR_INVALID_TYPE;
288  return (0u);
289  }
290  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
291  *perr = OS_ERR_NAME_GET_ISR;
292  return (0u);
293  }
294  OSSchedLock();
295  switch (ptmr->OSTmrState) {
299  *pdest = ptmr->OSTmrName;
300  len = OS_StrLen(*pdest);
301  OSSchedUnlock();
302  *perr = OS_ERR_NONE;
303  return (len);
304 
305  case OS_TMR_STATE_UNUSED: /* Timer is not allocated */
306  OSSchedUnlock();
307  *perr = OS_ERR_TMR_INACTIVE;
308  return (0u);
309 
310  default:
311  OSSchedUnlock();
312  *perr = OS_ERR_TMR_INVALID_STATE;
313  return (0u);
314  }
315 }

函数调用图:

INT32U OSTmrRemainGet ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c342 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_TMR_OPT_ONE_SHOT, OS_TMR_OPT_PERIODIC, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OS_TMR::OSTmrDly, OS_TMR::OSTmrMatch, OS_TMR::OSTmrOpt, OS_TMR::OSTmrPeriod, OS_TMR::OSTmrState, OSTmrTime , 以及 OS_TMR::OSTmrType.

344 {
345  INT32U remain;
346 
347 
348 #if OS_ARG_CHK_EN > 0u
349  if (perr == (INT8U *)0) {
350  return (0u);
351  }
352  if (ptmr == (OS_TMR *)0) {
353  *perr = OS_ERR_TMR_INVALID;
354  return (0u);
355  }
356 #endif
357  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
358  *perr = OS_ERR_TMR_INVALID_TYPE;
359  return (0u);
360  }
361  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
362  *perr = OS_ERR_TMR_ISR;
363  return (0u);
364  }
365  OSSchedLock();
366  switch (ptmr->OSTmrState) {
368  remain = ptmr->OSTmrMatch - OSTmrTime; /* Determine how much time is left to timeout */
369  OSSchedUnlock();
370  *perr = OS_ERR_NONE;
371  return (remain);
372 
373  case OS_TMR_STATE_STOPPED: /* It's assumed that the timer has not started yet */
374  switch (ptmr->OSTmrOpt) {
375  case OS_TMR_OPT_PERIODIC:
376  if (ptmr->OSTmrDly == 0u) {
377  remain = ptmr->OSTmrPeriod;
378  } else {
379  remain = ptmr->OSTmrDly;
380  }
381  OSSchedUnlock();
382  *perr = OS_ERR_NONE;
383  break;
384 
385  case OS_TMR_OPT_ONE_SHOT:
386  default:
387  remain = ptmr->OSTmrDly;
388  OSSchedUnlock();
389  *perr = OS_ERR_NONE;
390  break;
391  }
392  return (remain);
393 
394  case OS_TMR_STATE_COMPLETED: /* Only ONE-SHOT that timed out can be in this state */
395  OSSchedUnlock();
396  *perr = OS_ERR_NONE;
397  return (0u);
398 
399  case OS_TMR_STATE_UNUSED:
400  OSSchedUnlock();
401  *perr = OS_ERR_TMR_INACTIVE;
402  return (0u);
403 
404  default:
405  OSSchedUnlock();
406  *perr = OS_ERR_TMR_INVALID_STATE;
407  return (0u);
408  }
409 }

函数调用图:

INT8U OSTmrStateGet ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c439 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

441 {
442  INT8U state;
443 
444 
445 #if OS_ARG_CHK_EN > 0u
446  if (perr == (INT8U *)0) {
447  return (0u);
448  }
449  if (ptmr == (OS_TMR *)0) {
450  *perr = OS_ERR_TMR_INVALID;
451  return (0u);
452  }
453 #endif
454  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
455  *perr = OS_ERR_TMR_INVALID_TYPE;
456  return (0u);
457  }
458  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
459  *perr = OS_ERR_TMR_ISR;
460  return (0u);
461  }
462  OSSchedLock();
463  state = ptmr->OSTmrState;
464  switch (state) {
465  case OS_TMR_STATE_UNUSED:
466  case OS_TMR_STATE_STOPPED:
468  case OS_TMR_STATE_RUNNING:
469  *perr = OS_ERR_NONE;
470  break;
471 
472  default:
473  *perr = OS_ERR_TMR_INVALID_STATE;
474  break;
475  }
476  OSSchedUnlock();
477  return (state);
478 }

函数调用图:

BOOLEAN OSTmrStart ( OS_TMR ptmr,
INT8U perr 
)

在文件 os_tmr.c504 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_FALSE, OS_TMR_LINK_DLY, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OS_TRUE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Link(), OSTmr_Unlink(), OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

506 {
507 #if OS_ARG_CHK_EN > 0u
508  if (perr == (INT8U *)0) { /* Validate arguments */
509  return (OS_FALSE);
510  }
511  if (ptmr == (OS_TMR *)0) {
512  *perr = OS_ERR_TMR_INVALID;
513  return (OS_FALSE);
514  }
515 #endif
516  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
517  *perr = OS_ERR_TMR_INVALID_TYPE;
518  return (OS_FALSE);
519  }
520  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
521  *perr = OS_ERR_TMR_ISR;
522  return (OS_FALSE);
523  }
524  OSSchedLock();
525  switch (ptmr->OSTmrState) {
526  case OS_TMR_STATE_RUNNING: /* Restart the timer */
527  OSTmr_Unlink(ptmr); /* ... Stop the timer */
528  OSTmr_Link(ptmr, OS_TMR_LINK_DLY); /* ... Link timer to timer wheel */
529  OSSchedUnlock();
530  *perr = OS_ERR_NONE;
531  return (OS_TRUE);
532 
533  case OS_TMR_STATE_STOPPED: /* Start the timer */
535  OSTmr_Link(ptmr, OS_TMR_LINK_DLY); /* ... Link timer to timer wheel */
536  OSSchedUnlock();
537  *perr = OS_ERR_NONE;
538  return (OS_TRUE);
539 
540  case OS_TMR_STATE_UNUSED: /* Timer not created */
541  OSSchedUnlock();
542  *perr = OS_ERR_TMR_INACTIVE;
543  return (OS_FALSE);
544 
545  default:
546  OSSchedUnlock();
547  *perr = OS_ERR_TMR_INVALID_STATE;
548  return (OS_FALSE);
549  }
550 }

函数调用图:

BOOLEAN OSTmrStop ( OS_TMR ptmr,
INT8U  opt,
void *  callback_arg,
INT8U perr 
)

在文件 os_tmr.c591 行定义.

参考 OS_ERR_NONE, OS_ERR_TMR_INACTIVE, OS_ERR_TMR_INVALID, OS_ERR_TMR_INVALID_OPT, OS_ERR_TMR_INVALID_STATE, OS_ERR_TMR_INVALID_TYPE, OS_ERR_TMR_ISR, OS_ERR_TMR_NO_CALLBACK, OS_ERR_TMR_STOPPED, OS_FALSE, OS_TMR_OPT_CALLBACK, OS_TMR_OPT_CALLBACK_ARG, OS_TMR_OPT_NONE, OS_TMR_STATE_COMPLETED, OS_TMR_STATE_RUNNING, OS_TMR_STATE_STOPPED, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OS_TRUE, OSIntNesting, OSSchedLock(), OSSchedUnlock(), OSTmr_Unlink(), OS_TMR::OSTmrCallback, OS_TMR::OSTmrCallbackArg, OS_TMR::OSTmrState , 以及 OS_TMR::OSTmrType.

595 {
596  OS_TMR_CALLBACK pfnct;
597 
598 
599 #if OS_ARG_CHK_EN > 0u
600  if (perr == (INT8U *)0) { /* Validate arguments */
601  return (OS_FALSE);
602  }
603  if (ptmr == (OS_TMR *)0) {
604  *perr = OS_ERR_TMR_INVALID;
605  return (OS_FALSE);
606  }
607 #endif
608  if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
609  *perr = OS_ERR_TMR_INVALID_TYPE;
610  return (OS_FALSE);
611  }
612  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
613  *perr = OS_ERR_TMR_ISR;
614  return (OS_FALSE);
615  }
616  OSSchedLock();
617  switch (ptmr->OSTmrState) {
619  OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
620  *perr = OS_ERR_NONE;
621  switch (opt) {
622  case OS_TMR_OPT_CALLBACK:
623  pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
624  if (pfnct != (OS_TMR_CALLBACK)0) {
625  (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg); /* Use callback arg when timer was created */
626  } else {
627  *perr = OS_ERR_TMR_NO_CALLBACK;
628  }
629  break;
630 
632  pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
633  if (pfnct != (OS_TMR_CALLBACK)0) {
634  (*pfnct)((void *)ptmr, callback_arg); /* ... using the 'callback_arg' provided in call */
635  } else {
636  *perr = OS_ERR_TMR_NO_CALLBACK;
637  }
638  break;
639 
640  case OS_TMR_OPT_NONE:
641  break;
642 
643  default:
644  *perr = OS_ERR_TMR_INVALID_OPT;
645  break;
646  }
647  OSSchedUnlock();
648  return (OS_TRUE);
649 
650  case OS_TMR_STATE_COMPLETED: /* Timer has already completed the ONE-SHOT or ... */
651  case OS_TMR_STATE_STOPPED: /* ... timer has not started yet. */
652  OSSchedUnlock();
653  *perr = OS_ERR_TMR_STOPPED;
654  return (OS_TRUE);
655 
656  case OS_TMR_STATE_UNUSED: /* Timer was not created */
657  OSSchedUnlock();
658  *perr = OS_ERR_TMR_INACTIVE;
659  return (OS_FALSE);
660 
661  default:
662  OSSchedUnlock();
663  *perr = OS_ERR_TMR_INVALID_STATE;
664  return (OS_FALSE);
665  }
666 }

函数调用图:

INT8U OSTmrSignal ( void  )

在文件 os_tmr.c690 行定义.

参考 OSSemPost() , 以及 OSTmrSemSignal.

参考自 OSTimeTickHook().

691 {
692  INT8U err;
693 
694 
695  err = OSSemPost(OSTmrSemSignal);
696  return (err);
697 }

函数调用图:

这是这个函数的调用关系图:

void OSTmr_Init ( void  )

在文件 os_tmr.c782 行定义.

参考 OS_MemClr(), OS_TMR_CFG_MAX, OS_TMR_STATE_UNUSED, OS_TMR_TYPE, OSEventNameSet(), OSSemCreate(), OSTmr_InitTask(), OSTmrFree, OSTmrFreeList, OS_TMR::OSTmrName, OS_TMR::OSTmrNext, OSTmrSem, OSTmrSemSignal, OS_TMR::OSTmrState, OSTmrTbl, OSTmrTime, OS_TMR::OSTmrType, OSTmrUsed , 以及 OSTmrWheelTbl.

参考自 OSInit().

783 {
784 #if OS_EVENT_NAME_EN > 0u
785  INT8U err;
786 #endif
787  INT16U i;
788  OS_TMR *ptmr1;
789  OS_TMR *ptmr2;
790 
791 
792  OS_MemClr((INT8U *)&OSTmrTbl[0], sizeof(OSTmrTbl)); /* Clear all the TMRs */
793  OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */
794 
795  ptmr1 = &OSTmrTbl[0];
796  ptmr2 = &OSTmrTbl[1];
797  for (i = 0u; i < (OS_TMR_CFG_MAX - 1u); i++) { /* Init. list of free TMRs */
798  ptmr1->OSTmrType = OS_TMR_TYPE;
799  ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
800  ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */
801 #if OS_TMR_CFG_NAME_EN > 0u
802  ptmr1->OSTmrName = (INT8U *)"?";
803 #endif
804  ptmr1++;
805  ptmr2++;
806  }
807  ptmr1->OSTmrType = OS_TMR_TYPE;
808  ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
809  ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */
810 #if OS_TMR_CFG_NAME_EN > 0u
811  ptmr1->OSTmrName = (INT8U *)"?";
812 #endif
813  OSTmrTime = 0u;
814  OSTmrUsed = 0u;
816  OSTmrFreeList = &OSTmrTbl[0];
817  OSTmrSem = OSSemCreate(1u);
819 
820 #if OS_EVENT_NAME_EN > 0u
821  OSEventNameSet(OSTmrSem, (INT8U *)"uC/OS-II TmrLock", &err);/* Assign names to semaphores */
822  OSEventNameSet(OSTmrSemSignal, (INT8U *)"uC/OS-II TmrSignal", &err);
823 #endif
824 
825  OSTmr_InitTask();
826 }

函数调用图:

这是这个函数的调用关系图: