123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- #include "LH_TaskManager.h"
- LH_TaskList ON_Stack,Running_Stack,Suspend_Stack;
- TaskList_Items LH_UserTsak[TaskNumber];
- int (* Running_TaskFun)(void);
- void TaskManager_Init(void)
- {
- char idx;
- ON_Stack=0,Running_Stack=0;Suspend_Stack = 0;
- for(idx=0;idx<TaskNumber;idx++)
- {
- LH_UserTsak[idx].Task_ID = 0;
- LH_UserTsak[idx].LIst_Next = 0;
- LH_UserTsak[idx]._Fun=0;
- }
- }
- char Start_Tasks(char id,int time)
- {
- LH_TaskList List_Item,List_Item1;
- List_Item1 = List_Item = Suspend_Stack;
- while(List_Item != 0)
- {
- if(List_Item->Task_ID == id)
- {
- DISABLE_INTERRUPT__
- if(List_Item == Suspend_Stack )
- Suspend_Stack = List_Item->LIst_Next;
- else
- List_Item1->LIst_Next = List_Item->LIst_Next;
-
- List_Item->Task_Time = time ;
- if(time == 0)
- Add_WaitList(List_Item) ;
- else
- Add_TimingList(List_Item) ;
-
- ENABLED_INTERRUPT__
- return 1;
-
- }
- List_Item1 = List_Item;
- List_Item = List_Item->LIst_Next;
- }
- return 0;
- }
- char Stop_Tasks(char id)
- {
- LH_TaskList List_Item,List_Item1;
- DISABLE_INTERRUPT__
- if(ON_Stack != 0)
- {
- List_Item1 = List_Item = ON_Stack;
- while(List_Item != 0)
- {
- if(List_Item->Task_ID == id)
- { DISABLE_INTERRUPT__
- if(List_Item == ON_Stack)
- ON_Stack = List_Item->LIst_Next ;
- else
- List_Item1->LIst_Next = List_Item->LIst_Next ;
-
- Add_SuspendList(List_Item) ;
- ENABLED_INTERRUPT__
- return 1;
- }
- List_Item1 = List_Item;
- List_Item = List_Item->LIst_Next;
- }
- }
-
- if(Running_Stack != 0)
- {
- List_Item1 = List_Item = Running_Stack;
- while(List_Item != 0)
- {
- if(List_Item->Task_ID == id)
- { DISABLE_INTERRUPT__
- if(List_Item == Running_Stack)
- Running_Stack = List_Item->LIst_Next ;
- else
- List_Item1->LIst_Next = List_Item->LIst_Next ;
-
- Add_SuspendList(List_Item) ;
- ENABLED_INTERRUPT__
- return 2;
- }
- List_Item1 = List_Item;
- List_Item = List_Item->LIst_Next;
- }
- }
-
-
- ENABLED_INTERRUPT__
- return 0;
- }
- char Delete_Tasks(char id)
- {
-
- LH_TaskList List_Item,List_Item1;
- Stop_Tasks(id);
- DISABLE_INTERRUPT__
- List_Item1 = List_Item = Suspend_Stack;
- while(List_Item != 0)
- {
- if(List_Item->Task_ID == id)
- {
-
- if(List_Item == Suspend_Stack )
- Suspend_Stack = List_Item->LIst_Next;
- else
- List_Item1->LIst_Next = List_Item->LIst_Next;
-
- List_Item->Task_ID = 0 ;
- ENABLED_INTERRUPT__
- return 1;
-
- }
- List_Item1 = List_Item;
- List_Item = List_Item->LIst_Next;
- }
-
- ENABLED_INTERRUPT__
- return 0;
- }
- char UserTimerTask_Create(int (*_Fun)(void),int time)
- {
- char i;
- for(i=0;i<TaskNumber;i++)
- {
- if(LH_UserTsak[i]._Fun == _Fun)
- {
- LH_UserTsak[i].Task_Time=time;
- return 0;
- }
- }
- for(i=0;i<TaskNumber;i++)
- {
- if(LH_UserTsak[i].Task_ID == 0)
- {
- LH_UserTsak[i].Task_ID = -1;
- LH_UserTsak[i]._Fun = _Fun;
- LH_UserTsak[i].Task_Time = time;
- LH_UserTsak[i].LIst_Next = 0;
- Add_TimingList(&LH_UserTsak[i]);
- return 1;
- }
- }
- return 0;
- }
- char UserTask_Create(char id,int (*_Fun)(void),int time)
- {
- char idx;
- for(idx=0;idx<TaskNumber;idx++)
- {
- if(LH_UserTsak[idx].Task_ID == id)
- return 0;
- }
- for(idx=0;idx<TaskNumber;idx++)
- {
- if(LH_UserTsak[idx].Task_ID == 0)
- {
- LH_UserTsak[idx].Task_ID = id;
- LH_UserTsak[idx]._Fun = _Fun;
- LH_UserTsak[idx].Task_Time = time;
- LH_UserTsak[idx].LIst_Next = 0;
-
- if(time > 0)
- {
- Add_TimingList(&LH_UserTsak[idx]);
- }
- else
- {
- Add_SuspendList(&LH_UserTsak[idx]);
-
- }
-
- return 1;
- }
- }
-
- return 0;
- }
- void Add_SuspendList(LH_TaskList LHpStack)
- {
- LH_TaskList List_Item;
- LHpStack->LIst_Next = 0 ;
- do
- {
- if(Suspend_Stack == 0)
- {
- Suspend_Stack = LHpStack;
- break;
- }
-
- List_Item = Suspend_Stack;
- while(List_Item->LIst_Next !=0)
- {
- List_Item = List_Item->LIst_Next;
- }
- List_Item->LIst_Next = LHpStack;
- }while(0);
- }
- void Add_TimingList(LH_TaskList LHpStack)
- {
- LH_TaskList List_Item;
- LHpStack->LIst_Next = 0;
- do
- {
- if(ON_Stack == 0)
- {
- ON_Stack = LHpStack;
- break;
- }
- List_Item = ON_Stack;
- while(List_Item->LIst_Next !=0)
- {
- List_Item = List_Item->LIst_Next;
- }
- List_Item->LIst_Next = LHpStack;
- }while(0);
- }
- void TaskManager_Scheduling(void)
- {
- LH_TaskList list,list1;
- list1 = list = ON_Stack;
- while(list != 0)
- {
- list->Task_Time --;
- if(list->Task_Time == 0)
- {
- if(list == ON_Stack)
- ON_Stack = list->LIst_Next;
- else
- list1->LIst_Next = list->LIst_Next;
-
- Add_WaitList(list);
- }
- list1 = list;
- list = list->LIst_Next;
- }
- }
- void Add_WaitList(LH_TaskList LHpStack)
- {
- LH_TaskList list;
- LHpStack->LIst_Next = 0;
- list = Running_Stack;
- if(list == 0)
- {
- Running_Stack = LHpStack;
- }
- else
- {
- while(list->LIst_Next != 0)
- {
- list = list->LIst_Next;
- }
- list->LIst_Next = LHpStack ;
- }
- }
- void TaskManager_Run(void)
- {
- int time;
- static int id = 0;
- LH_TaskList List_Item;
- while(Running_Stack != 0)
- {
- id = Running_Stack->Task_ID;
- Running_TaskFun = Running_Stack->_Fun;
- time = (*Running_TaskFun)() ;
- if(id == Running_Stack->Task_ID)
- {
- if(Running_Stack->Task_ID > 0)
- {
- List_Item = Running_Stack->LIst_Next;
- if(time >0)
- {
- Running_Stack->Task_Time = time;
- Add_TimingList(Running_Stack) ;
- }
- else
- {
- Add_SuspendList(Running_Stack);
- }
- Running_Stack = List_Item ;
- }
- else
- {
- Running_Stack->Task_ID = 0;
- Running_Stack->_Fun = 0;
- Running_Stack = Running_Stack->LIst_Next;
- }
- }
- }
- }
|