annotate TaskManager/kernel/schedule/SchedTaskArray.cc @ 697:4b6242d03512 draft

TaskArray on going...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 13 Dec 2009 18:45:09 +0900
parents 715bbf0955b5
children 72b2da99e875
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #include "SchedTaskArray.h"
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #include "SchedTask.h"
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT];
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 SchedTaskArray::SchedTaskArray(SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 {
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 savedTask = savedTask_;
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 task = curTask_;
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 array = _array;
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
12 inListData.bound = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
13 inListData.size = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
14 inListData.length = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
15 inListData.element = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
16 outListData.bound = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
17 outListData.size = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
18 outListData.length = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
19 outListData.element = 0;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
20 }
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
21
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
22 /**
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
23 */
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
24 SchedTaskArray::~SchedTaskArray()
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
25 {
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
26 }
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
27
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
28 static void
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
29 bound(ListData *list)
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
30 {
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
31 ListElement *elm = list->element;
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
32 int *bound = list->bound;
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
33 int offset=0;
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
34 for(int i=0;i<list->length;i++) {
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
35 bound[i] = offset;
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
36 offset += elm[i].size;
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
37 }
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 void
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 SchedTaskArray::read()
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 {
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 // object creation をSchedTaskArray生成時にやらないので、
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 // exec の直前のread で十分に間に合う
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 loadSchedTask(scheduler, task);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 // 読むデータが一つもなければ無視
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
50 if (task->inData_count == 0) return;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
51
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
52 inListData.length = task->inData_count;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
53 inListData.size = task->inData_total_size();
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
54 inListData.element = task->inListData();
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
55 inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int));
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 // load Input Data
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
58 readbuf = scheduler->allocate(inListData.size);
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
59 scheduler->dma_loadList(&inListData, readbuf, DMA_READ);
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
60 bound(&inListData);
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 void
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 SchedTaskArray::exec()
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 {
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 scheduler->dma_wait(DMA_READ);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 task_list[task->command].wait(scheduler,task->command);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 task_list[task->command].run(this, readbuf, writebuf);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 free(readbuf);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 // 書き込む領域がなければ無視
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
75
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
76 // User 側で作る方法が必要...
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
77
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
78 if (task->outData_count > 0) {
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
79 outListData.length = task->outData_count;
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
80 outListData.size = task->outData_total_size();
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
81 outListData.element = task->outListData();
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
82 outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int));
696
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
83
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
84 writebuf = scheduler->allocate(outListData.size);
715bbf0955b5 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 695
diff changeset
85 scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE);
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
86 bound(&outListData);
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 void
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 SchedTaskArray::write()
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 {
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 scheduler->dma_wait(DMA_WRITE);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 free(writebuf);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 // このTaskArrayは終り。終了を知らせる。
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 if (task->next() >= last()) {
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
100 SchedTask *s = (SchedTask *)savedTask;
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
101 scheduler->mail_write((memaddr)s->task->self);
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 free(array);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 Task *SchedTaskArray::last()
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 {
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
109 SchedTask *s = (SchedTask *)savedTask;
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
110 return (Task*)(((char*)array)+ s->read_size());
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 SchedTaskBase*
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
114 SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p)
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 {
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 __debug("[SchedTaskArray:%s]\n", __FUNCTION__);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
118 Task *next = task->next();
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
119 if (next < last()) {
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 // Task List が残っているので、次を準備
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array);
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 } else {
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 // このTaskArrayは終り。save していた Task の次を返す。
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 // savedTask の read/exec は実行されない (command = TaskArray)
697
4b6242d03512 TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 696
diff changeset
125 return savedTask->next(scheduler, savedTask);
695
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 }
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130
29bd0882272a TaskArray on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 /* end */