# HG changeset patch # User kent # Date 1263449286 -32400 # Node ID 29835fc96f9fb2a1436d57185863cabae0350cec # Parent b61658aaeef288bdc256ef3710e09e9438b517be add Scheduler add some documents. diff -r b61658aaeef2 -r 29835fc96f9f .hgignore --- a/.hgignore Wed Jan 13 18:04:55 2010 +0900 +++ b/.hgignore Thu Jan 14 15:08:06 2010 +0900 @@ -1,8 +1,14 @@ syntax: glob +bak/* +autom4te.cache/* + *.o + +*.~ .*.swp .*.swo + GTAGS GRTAGS GSYMS diff -r b61658aaeef2 -r 29835fc96f9f COPYING --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/COPYING Thu Jan 14 15:08:06 2010 +0900 @@ -0,0 +1,1 @@ +/usr/share/automake-1.10/COPYING \ No newline at end of file diff -r b61658aaeef2 -r 29835fc96f9f INSTALL --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/INSTALL Thu Jan 14 15:08:06 2010 +0900 @@ -0,0 +1,1 @@ +/usr/share/automake-1.10/INSTALL \ No newline at end of file diff -r b61658aaeef2 -r 29835fc96f9f docs/CbCTaskManager.asta Binary file docs/CbCTaskManager.asta has changed diff -r b61658aaeef2 -r 29835fc96f9f docs/Scheduler-StateMachine.png Binary file docs/Scheduler-StateMachine.png has changed diff -r b61658aaeef2 -r 29835fc96f9f examples/gdb.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/gdb.sh Thu Jan 14 15:08:06 2010 +0900 @@ -0,0 +1,24 @@ + +# funcitons=$(readelf -s ../src/libTaskManager.a|gawk ' +# { +# if( == FUNC && != 0) { +# print ; +# } +# }') +functions="searchStartTask searchStartTask_1 startTask createTask taskSetData start addNewTask finishTask finishTask_1 noEvent getTask executed finishTask_iter finishTask_end taskSetWait destroyList listEmpty listAddFirst listAddLast listGetLast listGetFirst listPollLast listPollFirst listRemove createIterator destroyIterator listIterhasNext listIterNext listIterRemove destroyQueue queuePut queueTake queueOffer queuePoll queuePeek startTaskManager schedEntry executeTask checkEvent selectCode checkEvent_real printTasks exitTaskManager taskSpawn" + +tmp=$(mktemp) +for func in $functions; do + echo "b $func" + echo "commands" + echo "silent" + echo "bt 1" + echo "c" + echo "end" +done > $tmp +gdb --command=$tmp $1 +rm -f $tmp + + + + diff -r b61658aaeef2 -r 29835fc96f9f src/Fifo/Scheduler.cbc --- a/src/Fifo/Scheduler.cbc Wed Jan 13 18:04:55 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -//#include "Task.h" -#include -#include -#include "TaskManager.h" -#include "List.h" - -enum wait{ - NOWAIT=0, - WAIT=1, -}; -extern __code checkNewCode(TaskScheduler *, enum wait); - -__code (*scheduler)(void*,Taskrun,void*,void*); - -typedef List SchedTaskList; -#define addSchedTask(a,b) (SchedTaskList*)_listAddFirst((List*)(a),(void*)(b)) -#define removeTask(a,b) (SchedTaskList*)_listRemove((List*)(a),(void*)(b)) -// inline functionのがいいか - -__code schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff); - -extern void *allocate(size_t); - -#if 0 -__code -addCode(TaskScheduler *tsched, ID id, Taskrun code0, void *rbuff, void *wbuff) -{ - SchedTask *newst; - newst = allocate(sizeof(SchedTask)); //これはAbstractLayerで生成してもいいのだが… - newst->nextcode = code0; - newst->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい - newst->wbuff = wbuff; - - /* regist new task to schedtasks list. */ - tsched->schedtasks = addSchedTask(tsched->schedtasks, newst); - - goto selectCode(tsched); -} -#endif - -__code -selectCode(TaskScheduler *tsched) -{ - SchedTask *task; - if (tsched->schedtasks) { - task = (SchedTask*)_listGetLastData(tsched->schedtasks); - tsched->running = task; - - /* goto user-defined task. */ - goto task->nextcode(tsched, task->task->rbuff, task->task->wbuff); - } else { - /* no task we have. */ - //goto checkNewCode(); - goto noCode(tsched); - } -} - -__code -schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff) -{ - /* schedulerd */ - if ( nextcode==NULL ) { - /* the task finished. */ - tsched->schedtasks = - _listRemove(tsched->schedtasks, tsched->running); - tsched->exittasks = - _listAddFirst(tsched->exittasks, tsched->running); - goto selectCode(tsched); - /* - ID id = tsched->running->id; - tsched->schedtasks = - removeTask(tsched->schedtasks, tsched->running); - free(tsched->running); - tsched->running = NULL; - goto exitCode(tsched, id); - */ - } else { - /* save the next code segment for the task. */ - tsched->running->nextcode = nextcode; - tsched->running->rbuff = rbuff; - tsched->running->wbuff = wbuff; - /* move last task to first to be fair. */ - tsched->schedtasks = _listMoveLasttoFirst(tsched->schedtasks); - goto selectCode(tsched, NOWAIT); - } -} - - diff -r b61658aaeef2 -r 29835fc96f9f src/Fifo/Scheduler.h --- a/src/Fifo/Scheduler.h Wed Jan 13 18:04:55 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -#ifndef _TASKSCHEDULER_H -#define _TASKSCHEDULER_H -#include -#include "List.h" -#include "Task.h" -typedef uint32_t ID; - -typedef struct _SchedTask { - ID id; // task identifier; - Taskrun nextcode; - void *rbuff; - void *wbuff; -} SchedTask; - -typedef struct _scheduler { - SchedTask *running; - List *runnable; - //Scheduler schedule; -} TaskScheduler; - - -__code initScheduler(__code (*)(TaskScheduler *,void *), void *); -__code addCode(TaskScheduler *, ID, Taskrun, void *, void *); -__code selectCode(TaskScheduler *); - -#endif /* _TASKSCHEDULER_H */ diff -r b61658aaeef2 -r 29835fc96f9f src/Fifo/interface.h --- a/src/Fifo/interface.h Wed Jan 13 18:04:55 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#ifndef _INTERFACE_H -#define _INTERFACE_H -// included by user. - -typedef __code (*Taskrun)(void*, void*, void*); -//extern __code (*scheduler)(void*,Taskrun,void*,void*); - -#define ENDTASK ((Taskrun)NULL) - -#endif /* _INTERFACE_H */ - - diff -r b61658aaeef2 -r 29835fc96f9f src/Scheduler.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Scheduler.cbc Thu Jan 14 15:08:06 2010 +0900 @@ -0,0 +1,89 @@ +#include "Debug.h" +#include "Scheduler.h" + +typedef struct _Scheduler { + TaskQueue newTaskQ; + TaskQUeue finishTaskQ; + SchedTask taskp; /* previous task. */ + SchedTask taskc; /* current task. */ + SchedTask taskn; /* next task. */ + + __code (*read)(struct _Scheduler*); + __code (*exec)(struct _Scheduler*); + __code (*write)(struct _Scheduler*); +} Scheduler; + +__code +schedulerStart() +{ + sched->taskp = NoTask; + sched->taskc = NoTask; + goto getNewTask(); +} + +__code +loop(Scheduler *sched) +{ + sched->taskp = sched->taskc; + sched->taskc = sched->taskn; + sched->taskn = NULL; + if (/*have no task*/) { /* sched->taskp==NOP&&sched->taskp==NOP */ + // state patternできるか? + goto waitNewTask(sched); + } else { + goto getNewTask(sched); + } +} + +__code +getNewTask(Scheduler *sched) +{ + /* we should always have 3 tasks; previous, current and next. */ + sched->taskn = queuePoll(newTaskQ); + if (!sched->taskn) { + sched->taskn = NoTask; /* default task which do nothing. */ + } + goto sched->read(sched); +} + +__code +waitNewTask(Scheduler *sched) +{ + /* wait new task. */ + sched->taskn = queueTake(newTaskQ); + goto sched->read(sched); +} + + + +/* depending implementation. */ +__code +read(Scheduler *sched) +{ + /* start DMA for readbuffer of a next task. */ + /* wait for finishing DMA for readbuffer of a current task. */ + goto sched->exec(sched); +} +__code +execute(Scheduler *sched) +{ + /* execute current task. */ + goto sched->write(sched); +} +__code +write(Scheduler *sched) +{ + /* wait for finishing DMA for writebuffer of a previous task. */ + /* start DMA for writebuffer of a current task. */ + goto finishTask(sched); +} + +__code +finishTask(Scheduler *sched) +{ + queueOffer(sched->finishTaskQ, sched->taskp); + goto loop(sched); +} + + + diff -r b61658aaeef2 -r 29835fc96f9f taskmanager-config.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskmanager-config.in Thu Jan 14 15:08:06 2010 +0900 @@ -0,0 +1,38 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ + +usage="\ +Usage: taskmanager-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]" + +if [ $# -eq 0 ]; then + echo "$usage" 1>&2 + exit 1 +fi + +while [ ! x"$1" = "x" ]; do + case $1 in + --prefix) + echo $prefix + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo @TM_VERSION@ + ;; + --cflags) + echo -I@includedir@ @TM_CFLAGS@ + ;; + --libs) + echo -L@libdir@ @TM_RLD_FLAGS@ @TM_LIBS@ + ;; + *) + echo "$usage" 1>&2 + exit 1 + ;; + esac + shift +done