changeset 20:29835fc96f9f default tip

add Scheduler add some documents.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Thu, 14 Jan 2010 15:08:06 +0900
parents b61658aaeef2
children
files .hgignore COPYING INSTALL docs/CbCTaskManager.asta docs/Scheduler-StateMachine.png examples/gdb.sh src/Fifo/Scheduler.cbc src/Fifo/Scheduler.h src/Fifo/interface.h src/Scheduler.cbc taskmanager-config.in
diffstat 11 files changed, 159 insertions(+), 126 deletions(-) [+]
line wrap: on
line diff
--- 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
--- /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
--- /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
Binary file docs/CbCTaskManager.asta has changed
Binary file docs/Scheduler-StateMachine.png has changed
--- /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
+
+
+
+
--- 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 <stdint.h>
-#include <stdlib.h>
-#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);
-	}
-}
-
-
--- 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 <stdint.h>
-#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 */
--- 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 */
-
-
--- /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);
+}
+
+
+
--- /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