aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2015-12-30 03:24:37 -0500
committerBjoern Brandenburg <bbb@mpi-sws.org>2016-03-16 10:33:22 -0400
commite2c555d3dd253e1a15745777bbe6b7c7f9a5597d (patch)
treec066558732e747bd7c5f4d2c4b1eeacf4106862f
parent0d3feb83a642dc05a7d4e06876ce494832ff5db7 (diff)
Add -u (underrun) to rtspin
When debugging slack rules, it's useful to induce random underruns. Note: this is a debug feature and not intended for benchmarking.
-rw-r--r--bin/rtspin.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/bin/rtspin.c b/bin/rtspin.c
index 44073cc..31962ec 100644
--- a/bin/rtspin.c
+++ b/bin/rtspin.c
@@ -185,13 +185,13 @@ static int job(double exec_time, double program_end, int lock_od, double cs_leng
185 } 185 }
186} 186}
187 187
188#define OPTSTR "p:c:wlveo:f:s:q:r:X:L:Q:viR" 188#define OPTSTR "p:c:wlveo:f:s:q:r:X:L:Q:viRu:"
189int main(int argc, char** argv) 189int main(int argc, char** argv)
190{ 190{
191 int ret; 191 int ret;
192 lt_t wcet; 192 lt_t wcet;
193 lt_t period; 193 lt_t period;
194 double wcet_ms, period_ms; 194 double wcet_ms, period_ms, underrun_ms = 0;
195 unsigned int priority = LITMUS_NO_PRIORITY; 195 unsigned int priority = LITMUS_NO_PRIORITY;
196 int migrate = 0; 196 int migrate = 0;
197 int cluster = 0; 197 int cluster = 0;
@@ -266,6 +266,11 @@ int main(int argc, char** argv)
266 case 's': 266 case 's':
267 scale = atof(optarg); 267 scale = atof(optarg);
268 break; 268 break;
269 case 'u':
270 underrun_ms = atof(optarg);
271 if (underrun_ms <= 0)
272 usage("-u: positive argument needed.");
273 break;
269 case 'X': 274 case 'X':
270 protocol = lock_protocol_for_name(optarg); 275 protocol = lock_protocol_for_name(optarg);
271 if (protocol < 0) 276 if (protocol < 0)
@@ -380,6 +385,9 @@ int main(int argc, char** argv)
380 bail_out("failed to create reservation"); 385 bail_out("failed to create reservation");
381 } 386 }
382 387
388 srand48(time(NULL));
389
390
383 init_litmus(); 391 init_litmus();
384 392
385 start = wctime(); 393 start = wctime();
@@ -415,6 +423,7 @@ int main(int argc, char** argv)
415 lock_od, cs_length * 0.001); 423 lock_od, cs_length * 0.001);
416 } 424 }
417 } else { 425 } else {
426 double acet;
418 do { 427 do {
419 if (verbose) { 428 if (verbose) {
420 get_job_no(&job_no); 429 get_job_no(&job_no);
@@ -439,7 +448,15 @@ int main(int argc, char** argv)
439 } 448 }
440 } 449 }
441 /* convert to seconds and scale */ 450 /* convert to seconds and scale */
442 } while (job(wcet_ms * 0.001 * scale, start + duration, 451 acet = (wcet_ms - drand48() * underrun_ms) * 0.001;
452 if (acet < 0)
453 acet = 0;
454 acet *= scale;
455 if (verbose)
456 printf("\ttarget ACET: %6.2fms (%.2f%% of WCET)\n",
457 acet * 1000,
458 (acet * 1000 / wcet_ms) * 100);
459 } while (job(acet, start + duration,
443 lock_od, cs_length * 0.001)); 460 lock_od, cs_length * 0.001));
444 } 461 }
445 462