From 102b50373d656e42abbd1c953ce908e52f6e8706 Mon Sep 17 00:00:00 2001 From: Bjoern Brandenburg Date: Fri, 11 Jan 2013 10:26:33 +0100 Subject: rt_launch: add support for -q This mirrors the option in rtspin. --- bin/rt_launch.c | 18 ++++++++++++------ include/litmus.h | 6 +++--- src/task.c | 10 ++++++---- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/bin/rt_launch.c b/bin/rt_launch.c index 3863031..16d6ed7 100644 --- a/bin/rt_launch.c +++ b/bin/rt_launch.c @@ -29,7 +29,7 @@ int launch(void *task_info_p) { } void usage(char *error) { - fprintf(stderr, "%s\nUsage: rt_launch [-w][-v][-p cpu][-c hrt | srt | be] wcet period program [arg1 arg2 ...]\n" + fprintf(stderr, "%s\nUsage: rt_launch [-w][-v][-p cpu][-q prio][-c hrt | srt | be] wcet period program [arg1 arg2 ...]\n" "\t-w\tSynchronous release\n" "\t-v\tVerbose\n" "\t-p\tcpu (or initial cpu)\n" @@ -41,7 +41,7 @@ void usage(char *error) { } -#define OPTSTR "p:c:vw" +#define OPTSTR "p:c:vwq:" int main(int argc, char** argv) { @@ -55,6 +55,7 @@ int main(int argc, char** argv) int wait = 0; startup_info_t info; task_class_t class = RT_CLASS_HARD; + unsigned int priority = LITMUS_LOWEST_PRIORITY; while ((opt = getopt(argc, argv, OPTSTR)) != -1) { switch (opt) { @@ -68,6 +69,11 @@ int main(int argc, char** argv) cpu = atoi(optarg); migrate = 1; break; + case 'q': + priority = atoi(optarg); + if (!litmus_is_valid_fixed_prio(priority)) + usage("Invalid priority."); + break; case 'c': class = str2class(optarg); if (class == -1) @@ -87,7 +93,7 @@ int main(int argc, char** argv) signal(SIGUSR1, SIG_IGN); if (argc - optind < 3) - usage("Arguments missing."); + usage("Arguments missing."); wcet = ms2lt(atoi(argv[optind + 0])); period = ms2lt(atoi(argv[optind + 1])); if (wcet <= 0) @@ -107,13 +113,13 @@ int main(int argc, char** argv) if (ret < 0) bail_out("could not migrate to target partition"); } - ret = __create_rt_task(launch, &info, cpu, wcet, period, class); + ret = __create_rt_task(launch, &info, cpu, wcet, period, priority, class); + - if (ret < 0) bail_out("could not create rt child process"); else if (verbose) printf("%d\n", ret); - return 0; + return 0; } diff --git a/include/litmus.h b/include/litmus.h index 3777088..2b6a1dd 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -98,9 +98,9 @@ void exit_litmus(void); typedef int (*rt_fn_t)(void*); /* These two functions configure the RT task to use enforced exe budgets */ -int create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period); -int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, - int period, task_class_t cls); +int create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, lt_t wcet, lt_t period, unsigned int prio); +int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, lt_t wcet, + lt_t period, unsigned int priority, task_class_t cls); /* per-task modes */ enum rt_task_mode_t { diff --git a/src/task.c b/src/task.c index 4d237bd..ed1c6aa 100644 --- a/src/task.c +++ b/src/task.c @@ -40,8 +40,8 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup, return rt_task; } -int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, - task_class_t class) +int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, lt_t wcet, lt_t period, + unsigned int priority, task_class_t class) { struct rt_task params; params.cpu = cpu; @@ -49,6 +49,7 @@ int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, params.exec_cost = wcet; params.cls = class; params.phase = 0; + params.priority = priority; /* enforce budget for tasks that might not use sleep_next_period() */ params.budget_policy = QUANTUM_ENFORCEMENT; @@ -56,8 +57,9 @@ int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, (rt_setup_fn_t) set_rt_task_param, ¶ms); } -int create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period) { - return __create_rt_task(rt_prog, arg, cpu, wcet, period, RT_CLASS_HARD); +int create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, lt_t wcet, lt_t period, + unsigned int priority) { + return __create_rt_task(rt_prog, arg, cpu, wcet, period, priority, RT_CLASS_HARD); } -- cgit v1.2.2