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