diff options
| author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2015-12-30 03:24:37 -0500 |
|---|---|---|
| committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-03-16 10:33:22 -0400 |
| commit | e2c555d3dd253e1a15745777bbe6b7c7f9a5597d (patch) | |
| tree | c066558732e747bd7c5f4d2c4b1eeacf4106862f | |
| parent | 0d3feb83a642dc05a7d4e06876ce494832ff5db7 (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.c | 23 |
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:" |
| 189 | int main(int argc, char** argv) | 189 | int 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 | ||
