00001
00002
00003
00004
00005
00006
00007
00008 #include "task.h"
00009 #include "TimerServices.h"
00010 #include <stdlib.h>
00011
00012 ECB *TimerServicesSem;
00013 TCB TTsrv;
00014 static char TSname[] = "TSrvr";
00015 static TSERVICE *TList;
00016
00017 THREAD(TimerServicesTask,arg)
00018 {
00019 TSERVICE *pL;
00020 char sr;
00021
00022 while(1)
00023 {
00024 PendSemaphore(TimerServicesSem,0);
00025 sr = Disable();
00026 pL = TList;
00027 while(pL)
00028 {
00029 pL->Counter--;
00030 if(pL->Counter == 0)
00031 {
00032 pL->Counter = pL->Time;
00033 (*pL->callback)(pL->arg);
00034 }
00035 pL = pL->next;
00036 }
00037 Enable(sr);
00038 }
00039 }
00040
00041
00042 TSERVICE *NewTimerService(unsigned t, unsigned m, void *arg, void (*cb)(void *) )
00043 {
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 TSERVICE *pTS = (TSERVICE *)malloc(sizeof(TSERVICE));
00058 if(pTS)
00059 {
00060 pTS->Time = t;
00061 pTS->Counter = t;
00062 pTS->Mode = m;
00063 pTS->arg = arg;
00064 pTS->callback = cb;
00065 pTS->next = 0;
00066 pTS->prev = 0;
00067 }
00068 return pTS;
00069 }
00070
00071 void DeleteTimerService(TSERVICE *pTS)
00072 {
00073 free(pTS);
00074 }
00075
00076 void StartTimer(TSERVICE *pTS)
00077 {
00078
00079
00080
00081
00082 char sr;
00083 sr = Disable();
00084 pTS->next = TList;
00085 if(TList)
00086 TList->prev = pTS;
00087 TList = pTS;
00088 Enable(sr);
00089 }
00090
00091 void KillTimer(TSERVICE *pTS)
00092 {
00093 char sr = Disable();
00094 if(pTS == TList)
00095 {
00096 TList = pTS->next;
00097 if(TList)
00098 TList->prev = 0;
00099 }
00100 else
00101 {
00102 if(pTS->prev)
00103 pTS->prev->next = pTS->next;
00104 if(pTS->next)
00105 pTS->next->prev = pTS->prev;
00106 }
00107 Enable(sr);
00108 }
00109
00110 void InitTimerServices(void)
00111 {
00112 TimerServicesSem = NewSemaphore(0,SEMAPHORE_MODE_BLOCKING,TSname);
00113 CreateTask(&TTsrv,TimerServicesTask,384,25,TSname,0);
00114 Insert(&ActiveTasks,&TTsrv);
00115 RegisterTickerPost(TimerServicesSem);
00116 }
00117
00118