view src/Scheduler.cbc @ 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
children
line wrap: on
line source

#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);
}