aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/rtspin.c100
1 files changed, 2 insertions, 98 deletions
diff --git a/bin/rtspin.c b/bin/rtspin.c
index 3e22ffe..01855ab 100644
--- a/bin/rtspin.c
+++ b/bin/rtspin.c
@@ -112,8 +112,6 @@ static void get_exec_times(const char *file, const int column,
112 112
113#define NUMS 4096 113#define NUMS 4096
114static int num[NUMS]; 114static int num[NUMS];
115static double loop_length = 1.0;
116static char* progname;
117 115
118static int loop_once(void) 116static int loop_once(void)
119{ 117{
@@ -125,18 +123,11 @@ static int loop_once(void)
125 123
126static int loop_for(double exec_time, double emergency_exit) 124static int loop_for(double exec_time, double emergency_exit)
127{ 125{
128 double t = 0;
129 int tmp = 0; 126 int tmp = 0;
130/* while (t + loop_length < exec_time) {
131 tmp += loop_once();
132 t += loop_length;
133 }
134*/
135 double start = cputime(); 127 double start = cputime();
136 double now = cputime(); 128 double now = cputime();
137 while (now + loop_length < start + exec_time) { 129 while (now < start + exec_time) {
138 tmp += loop_once(); 130 tmp += loop_once();
139 t += loop_length;
140 now = cputime(); 131 now = cputime();
141 if (emergency_exit && wctime() > emergency_exit) { 132 if (emergency_exit && wctime() > emergency_exit) {
142 /* Oops --- this should only be possible if the execution time tracking 133 /* Oops --- this should only be possible if the execution time tracking
@@ -150,64 +141,6 @@ static int loop_for(double exec_time, double emergency_exit)
150 return tmp; 141 return tmp;
151} 142}
152 143
153static void fine_tune(double interval)
154{
155 double start, end, delta;
156
157 start = wctime();
158 loop_for(interval, 0);
159 end = wctime();
160 delta = (end - start - interval) / interval;
161 if (delta != 0)
162 loop_length = loop_length / (1 - delta);
163}
164
165static void configure_loop(void)
166{
167 double start;
168
169 /* prime cache */
170 loop_once();
171 loop_once();
172 loop_once();
173
174 /* measure */
175 start = wctime();
176 loop_once(); /* hope we didn't get preempted */
177 loop_length = wctime();
178 loop_length -= start;
179
180 /* fine tune */
181 fine_tune(0.1);
182 fine_tune(0.1);
183 fine_tune(0.1);
184}
185
186static void show_loop_length(void)
187{
188 printf("%s/%d: loop_length=%f (%ldus)\n",
189 progname, getpid(), loop_length,
190 (long) (loop_length * 1000000));
191}
192
193static void debug_delay_loop(void)
194{
195 double start, end, delay;
196 show_loop_length();
197 while (1) {
198 for (delay = 0.5; delay > 0.01; delay -= 0.01) {
199 start = wctime();
200 loop_for(delay, 0);
201 end = wctime();
202 printf("%6.4fs: looped for %10.8fs, delta=%11.8fs, error=%7.4f%%\n",
203 delay,
204 end - start,
205 end - start - delay,
206 100 * (end - start - delay) / delay);
207 }
208 }
209}
210
211static int job(double exec_time, double program_end) 144static int job(double exec_time, double program_end)
212{ 145{
213 if (wctime() > program_end) 146 if (wctime() > program_end)
@@ -221,7 +154,7 @@ static int job(double exec_time, double program_end)
221 154
222#define OPTSTR "p:c:wld:veo:f:s:" 155#define OPTSTR "p:c:wld:veo:f:s:"
223 156
224int main(int argc, char** argv) 157int main(int argc, char** argv)
225{ 158{
226 int ret; 159 int ret;
227 lt_t wcet; 160 lt_t wcet;
@@ -231,9 +164,6 @@ int main(int argc, char** argv)
231 int cpu = 0; 164 int cpu = 0;
232 int opt; 165 int opt;
233 int wait = 0; 166 int wait = 0;
234 int test_loop = 0;
235 int skip_config = 0;
236 int verbose = 0;
237 int column = 1; 167 int column = 1;
238 const char *file = NULL; 168 const char *file = NULL;
239 int want_enforcement = 0; 169 int want_enforcement = 0;
@@ -243,8 +173,6 @@ int main(int argc, char** argv)
243 task_class_t class = RT_CLASS_HARD; 173 task_class_t class = RT_CLASS_HARD;
244 int cur_job, num_jobs; 174 int cur_job, num_jobs;
245 175
246 progname = argv[0];
247
248 while ((opt = getopt(argc, argv, OPTSTR)) != -1) { 176 while ((opt = getopt(argc, argv, OPTSTR)) != -1) {
249 switch (opt) { 177 switch (opt) {
250 case 'w': 178 case 'w':
@@ -262,18 +190,6 @@ int main(int argc, char** argv)
262 case 'e': 190 case 'e':
263 want_enforcement = 1; 191 want_enforcement = 1;
264 break; 192 break;
265 case 'l':
266 test_loop = 1;
267 break;
268 case 'd':
269 /* manually configure delay per loop iteration
270 * unit: microseconds */
271 loop_length = atof(optarg) / 1000000;
272 skip_config = 1;
273 break;
274 case 'v':
275 verbose = 1;
276 break;
277 case 'o': 193 case 'o':
278 column = atoi(optarg); 194 column = atoi(optarg);
279 break; 195 break;
@@ -293,15 +209,6 @@ int main(int argc, char** argv)
293 } 209 }
294 } 210 }
295 211
296
297 if (!skip_config)
298 configure_loop();
299
300 if (test_loop) {
301 debug_delay_loop();
302 return 0;
303 }
304
305 if (file) { 212 if (file) {
306 get_exec_times(file, column, &num_jobs, &exec_times); 213 get_exec_times(file, column, &num_jobs, &exec_times);
307 214
@@ -354,9 +261,6 @@ int main(int argc, char** argv)
354 if (ret < 0) 261 if (ret < 0)
355 bail_out("could not setup rt task params"); 262 bail_out("could not setup rt task params");
356 263
357 if (verbose)
358 show_loop_length();
359
360 init_litmus(); 264 init_litmus();
361 265
362 ret = task_mode(LITMUS_RT_TASK); 266 ret = task_mode(LITMUS_RT_TASK);