0
|
1 #ifndef INCLUDED_TASK
|
|
2 #define INCLUDED_TASK
|
|
3
|
|
4 #include "base.h"
|
|
5 #include "types.h"
|
|
6 #include "ListData.h"
|
|
7 #include "SimpleTask.h"
|
|
8
|
|
9 class SchedTask;
|
|
10 class Scheduler;
|
|
11
|
|
12 class Task {
|
|
13 public: // variables
|
|
14 int task_size;
|
|
15 int command;
|
|
16 int param_count;
|
|
17 int inData_count;
|
|
18 int outData_count;
|
|
19 int inData_offset;
|
|
20 int outData_offset;
|
|
21 void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT)));
|
|
22
|
|
23 public: // functions
|
|
24
|
|
25 void print(Scheduler *s);
|
|
26
|
|
27 memaddr *param(int index) {
|
|
28 memaddr p = (memaddr)data + sizeof(memaddr)*index;
|
|
29 return (memaddr *)p;
|
|
30 }
|
|
31
|
|
32 ListElement *inData(int index) {
|
|
33 memaddr p = (memaddr)data + inData_offset;
|
|
34 p += sizeof(ListElement)*index;
|
|
35 return (ListElement*)p;
|
|
36 }
|
|
37
|
|
38 ListElement *outData(int index) {
|
|
39 memaddr p = (memaddr)data + outData_offset;
|
|
40 p += sizeof(ListElement)* index;
|
|
41 return (ListElement*)p;
|
|
42 }
|
|
43
|
|
44 static int calc_size(int params, int ins, int outs) {
|
|
45 int size = round_up16(sizeof(Task))
|
|
46 + round_up16(sizeof(memaddr)*params)
|
|
47 + round_up16(sizeof(ListElement)*ins)
|
|
48 + round_up16(sizeof(ListElement)*outs);
|
|
49 return size;
|
|
50 }
|
|
51
|
|
52 void init(int task_id, int params, int ins, int outs) {
|
|
53 set_task_id(task_id);
|
|
54 param_count = params;
|
|
55 inData_count = ins;
|
|
56 outData_count = outs;
|
|
57 inData_offset = round_up16(sizeof(memaddr)*params);
|
|
58 outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins);
|
|
59 //task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs);
|
|
60
|
|
61 task_size = round_up16(sizeof(Task))
|
|
62 + round_up16(sizeof(memaddr)*params)
|
|
63 + round_up16(sizeof(ListElement)*ins)
|
|
64 + round_up16(sizeof(ListElement)*outs);
|
|
65
|
|
66 }
|
|
67
|
|
68 int size() {
|
|
69 return task_size;
|
|
70 }
|
|
71
|
|
72 int inData_total_size() {
|
|
73 int size = 0;
|
|
74 ListElement *in= inData(0);
|
|
75 for(int i=0; i< inData_count; i++) {
|
|
76 size += in[i].size;
|
|
77 }
|
|
78 return size;
|
|
79 }
|
|
80 int outData_total_size() {
|
|
81 int size = 0;
|
|
82 ListElement *out= outData(0);
|
|
83 for(int i=0; i< outData_count; i++) {
|
|
84 size += out[i].size;
|
|
85 }
|
|
86 return size;
|
|
87 }
|
|
88
|
|
89 void set_inData_t( int index, memaddr addr, int size) {
|
|
90 ListElement *list = inData(index);
|
|
91 #ifdef EARLY_TOUCH
|
|
92 if ((unsigned long)addr&0xf) {
|
|
93 printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
|
|
94 command, index, (unsigned long)addr, size);
|
|
95 }
|
|
96 char *p = (char *)addr; int b = *p;
|
|
97 p = (char *)(addr+size-1); b += *p;
|
|
98 #endif
|
|
99 #ifdef __CERIUM_CELL__
|
|
100 list->addr = (uint32)addr;
|
|
101 #else
|
|
102 list->addr = addr;
|
|
103 #endif
|
|
104 list->size = size;
|
|
105 }
|
|
106
|
|
107 void set_outData_t(int index, memaddr addr, int size) {
|
|
108 ListElement *list = outData(index);
|
|
109 #ifdef EARLY_TOUCH
|
|
110 if ((unsigned long)addr&0xf) {
|
|
111 printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
|
|
112 command, index, (unsigned long)addr, size);
|
|
113 }
|
|
114 char *p = (char *)addr; int b = *p;
|
|
115 p = (char *)(addr+size-1); b += *p;
|
|
116 #endif
|
|
117 #ifdef __CERIUM_CELL__
|
|
118 list->addr = (uint32)addr;
|
|
119 #else
|
|
120 list->addr = addr;
|
|
121 #endif
|
|
122 list->size = size;
|
|
123 }
|
|
124 void set_task_id(int id) { command = id; }
|
|
125 void set_param_t(int index, memaddr param) {
|
|
126 memaddr *p = (memaddr*)this->param(index);
|
|
127 *p = param;
|
|
128 }
|
|
129
|
|
130 Task * next()
|
|
131 {
|
|
132 char *p = (char*)this;
|
|
133 p += size();
|
|
134 return (Task*)p;
|
|
135 }
|
|
136
|
|
137
|
|
138 #define set_param(index,param) set_param_t(index, (memaddr) (param))
|
|
139
|
|
140 #define set_inData(index, addr, size) \
|
|
141 set_inData_t(index, (memaddr)(addr), (size));
|
|
142 #define set_outData(index, addr, size) \
|
|
143 set_outData_t(index, (memaddr)(addr), (size));
|
|
144 } __attribute__ ((aligned (DEFAULT_ALIGNMENT))) ;
|
|
145
|
|
146 typedef Task* TaskPtr;
|
|
147
|
|
148 #endif
|