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