From 2701b0022c6c409d2172753aed48d616e789b98c Mon Sep 17 00:00:00 2001 From: Jeremy Erickson Date: Tue, 2 Nov 2010 12:37:14 -0400 Subject: Updated Mixed Criticality stuff --- bin/rt_launch.c | 20 +++++++++++++++++--- bin/rtspin.c | 18 +++++++++++++++--- include/litmus.h | 11 ++++++----- src/litmus.c | 8 +++++--- src/task.c | 9 ++++++--- 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/bin/rt_launch.c b/bin/rt_launch.c index 3863031..f3fda65 100644 --- a/bin/rt_launch.c +++ b/bin/rt_launch.c @@ -29,11 +29,12 @@ 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][-c hrt | srt | be][-r criticality] wcet period program [arg1 arg2 ...]\n" "\t-w\tSynchronous release\n" "\t-v\tVerbose\n" "\t-p\tcpu (or initial cpu)\n" "\t-c\tClass\n" + "\t-r\tCriticality\n" "\twcet, period in ms\n" "\tprogram to be launched\n", error); @@ -41,13 +42,14 @@ void usage(char *error) { } -#define OPTSTR "p:c:vw" +#define OPTSTR "p:c:r:vw" int main(int argc, char** argv) { int ret; lt_t wcet; lt_t period; + int criticality = 0; int migrate = 0; int cpu = 0; int opt; @@ -73,6 +75,17 @@ int main(int argc, char** argv) if (class == -1) usage("Unknown task class."); break; + case 'r': + criticality = atoi(optarg); + if (criticality > 1){ + if (criticality > 3){ + class = RT_CLASS_BEST_EFFORT; + } + else{ + class = RT_CLASS_SOFT; + } + } + break; case ':': usage("Argument missing."); @@ -107,7 +120,8 @@ 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, + criticality, class); if (ret < 0) diff --git a/bin/rtspin.c b/bin/rtspin.c index f291869..cfd5853 100644 --- a/bin/rtspin.c +++ b/bin/rtspin.c @@ -30,7 +30,7 @@ static double wctime() void usage(char *error) { fprintf(stderr, "Error: %s\n", error); fprintf(stderr, - "Usage: rt_spin [-w] [-p PARTITION] [-c CLASS] WCET PERIOD DURATION\n" + "Usage: rt_spin [-w] [-p PARTITION] [-c CLASS] [-r CRITICALITY] WCET PERIOD DURATION\n" " rt_spin -l\n"); exit(1); } @@ -133,7 +133,7 @@ static int job(double exec_time) return 0; } -#define OPTSTR "p:c:wld:v" +#define OPTSTR "p:c:r:wld:v" int main(int argc, char** argv) { @@ -143,6 +143,7 @@ int main(int argc, char** argv) double wcet_ms, period_ms; int migrate = 0; int cpu = 0; + int criticality = 0; int opt; int wait = 0; int test_loop = 0; @@ -167,6 +168,17 @@ int main(int argc, char** argv) if (class == -1) usage("Unknown task class."); break; + case 'r': + criticality = atoi(optarg); + if (criticality > 1){ + if (criticality > 3){ + class = RT_CLASS_BEST_EFFORT; + } + else{ + class = RT_CLASS_SOFT; + } + } + break; case 'l': test_loop = 1; break; @@ -221,7 +233,7 @@ int main(int argc, char** argv) bail_out("could not migrate to target partition"); } - ret = sporadic_task_ns(wcet, period, 0, cpu, class, NO_ENFORCEMENT, migrate); + ret = sporadic_task_ns(wcet, period, 0, cpu, criticality, class, NO_ENFORCEMENT, migrate); if (ret < 0) bail_out("could not setup rt task params"); diff --git a/include/litmus.h b/include/litmus.h index b798c92..2b58d82 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -31,18 +31,18 @@ int get_rt_task_param(pid_t pid, struct rt_task* param); /* times are given in ms */ int sporadic_task( lt_t e, lt_t p, lt_t phase, - int partition, task_class_t cls, + int partition, int criticality, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set); /* times are given in ns */ int sporadic_task_ns( lt_t e, lt_t p, lt_t phase, - int cpu, task_class_t cls, + int cpu, int criticality, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set); /* budget enforcement off by default in these macros */ #define sporadic_global(e, p) \ - sporadic_task(e, p, 0, 0, RT_CLASS_SOFT, NO_ENFORCEMENT, 0) + sporadic_task(e, p, 0, 0, 0, RT_CLASS_SOFT, NO_ENFORCEMENT, 0) #define sporadic_partitioned(e, p, cpu) \ sporadic_task(e, p, 0, cpu, RT_CLASS_SOFT, NO_ENFORCEMENT, 1) @@ -82,9 +82,10 @@ 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, + int criticality); int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, - int period, task_class_t cls); + int period, int criticality, task_class_t cls); /* per-task modes */ enum rt_task_mode_t { diff --git a/src/litmus.c b/src/litmus.c index f71f337..2c4bc42 100644 --- a/src/litmus.c +++ b/src/litmus.c @@ -42,15 +42,16 @@ int be_migrate_to(int target_cpu) } int sporadic_task(lt_t e, lt_t p, lt_t phase, - int cpu, task_class_t cls, + int cpu, int criticality, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set) { return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS, - cpu, cls, budget_policy, set_cpu_set); + cpu, criticality, cls, budget_policy, + set_cpu_set); } int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, - int cpu, task_class_t cls, + int cpu, int criticality, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set) { struct rt_task param; @@ -58,6 +59,7 @@ int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, param.exec_cost = e; param.period = p; param.cpu = cpu; + param.crit = criticality; param.cls = cls; param.phase = phase; param.budget_policy = budget_policy; diff --git a/src/task.c b/src/task.c index 4d237bd..ece5f64 100644 --- a/src/task.c +++ b/src/task.c @@ -41,11 +41,12 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup, } int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, - task_class_t class) + int criticality, task_class_t class) { struct rt_task params; params.cpu = cpu; params.period = period; + params.crit = criticality; params.exec_cost = wcet; params.cls = class; params.phase = 0; @@ -56,8 +57,10 @@ 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, int wcet, int period, + int criticality) { + return __create_rt_task(rt_prog, arg, cpu, wcet, period, criticality, + RT_CLASS_HARD); } -- cgit v1.2.2