annotate TaskManager/kernel/schedule/SchedTask.cc @ 42:aa11038dbdc1

*** empty log message ***
author gongo
date Thu, 14 Feb 2008 18:27:37 +0900
parents
children 70a0ac46133e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
1 #include "SchedTask.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
2 #include "SchedTaskList.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
3 #include "SchedNop2Ready.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
4 #include "DmaManager.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
5 #include "error.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
6 #include "TaskManager.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
7 #include "SymTable.h"
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
8
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
9 SymTable *TaskManager::symtb;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
10
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
11 SchedTask::SchedTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf,
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
12 DmaManager* cn)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
13 {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
14 list = _list;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
15 task = _task;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
16 readbuf = rbuf;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
17 writebuf = wbuf;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
18 connector = cn;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
19 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
20
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
21 void
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
22 SchedTask::read(void)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
23 {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
24 __debug("[SchedTask:%s]\n", __FUNCTION__);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
25
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
26 //task = &list->tasks[--list->length];
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
27 connector->dma_load(readbuf, task->in_addr, task->in_size, DMA_READ);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
28 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
29
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
30 void
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
31 SchedTask::exec(void)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
32 {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
33 __debug("[SchedTask:%s]\n", __FUNCTION__);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
34
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
35 connector->dma_wait(DMA_READ);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
36
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
37 __debug(" task->command = %d\n", task->command);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
38 __debug(" task->in_size = %d\n", task->in_size);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
39 __debug(" task->in_addr = 0x%x\n", task->in_addr);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
40 __debug(" task->out_addr = 0x%x\n", task->out_addr);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
41 __debug(" list->next = 0x%x\n", (unsigned int)list->next);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
42 __debug(" list->length = 0x%x\n", (unsigned int)list->length);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
43
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
44 // obsolute
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
45 // task->in_size = func_list[task->command](writebuf, readbuf);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
46
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
47 // ごちゃごちゃしてるな
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
48 // 最初から void* じゃなくて 関数ポインタ としていれるべきか?
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
49 int (*func)(void*, void*)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
50 = (int (*)(void*,void*))TaskManager::get_address(task->command);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
51 task->in_size = func(writebuf, readbuf);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
52 connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
53 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
54
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
55 void
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
56 SchedTask::write(void)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
57 {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
58 __debug("[SchedTask:%s]\n", __FUNCTION__);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
59
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
60 connector->dma_wait(DMA_WRITE);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
61 connector->mail_write((unsigned int)task->self);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
62 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
63
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
64 SchedTaskBase*
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
65 SchedTask::next(Scheduler *m, SchedTaskBase *p)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
66 {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
67 __debug("[SchedTask:%s]\n", __FUNCTION__);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
68
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
69 delete p;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
70
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
71 // ここ直さねば。どうやって if 文消そう?
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
72 // オブジェクト増やせばいいのかな
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
73 if (list->length == 0) {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
74 if (list->next == 0) {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
75 return new SchedNop2Ready(connector);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
76 } else {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
77 return new SchedTaskList((unsigned int)list->next,
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
78 m->get_curListBuf(), connector);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
79 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
80 } else {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
81 //return new SchedTask(list, m->get_curReadBuf(),
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
82 //m->get_curWriteBuf(), connector);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
83
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
84 // 本当は、ここで task->command に対応する、
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
85 // SchedTask を継承する class を作ればいい。。。はず
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
86 return new SchedTask(list, &list->tasks[--list->length],
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
87 m->get_curReadBuf(), m->get_curWriteBuf(),
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
88 connector);
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
89 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
90 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
91
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
92 #if 0
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
93 SchedTask
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
94 createSchedTask(TaskListPtr list, void *rbuf, void *wbuf, DmaManager *cn)
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
95 {
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
96 TaskPtr task;
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
97
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
98 task = &list->tasks[--list->length];
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
99
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
100 }
aa11038dbdc1 *** empty log message ***
gongo
parents:
diff changeset
101 #endif