eva_rt_common/
utils.rs

1//! General utilities.
2//! 
3//! Given that tasksets are described as slices of `RTTask`s, this module
4//! provides utility functions to compute properties of the given tasksets.
5
6use crate::prelude::*;
7
8pub mod prelude {
9    pub use super::{
10        RTUtils,
11    };
12}
13
14/// Utility functions on tasksets.
15pub struct RTUtils;
16
17impl RTUtils {
18    pub fn is_taskset_sorted_by_period(taskset: &[RTTask]) -> bool {
19        taskset.windows(2).all(|w| w[0].period <= w[1].period)
20    }
21
22    pub fn is_taskset_sorted_by_deadline(taskset: &[RTTask]) -> bool {
23        taskset.windows(2).all(|w| w[0].deadline <= w[1].deadline)
24    }
25
26    pub fn implicit_deadlines(taskset: &[RTTask]) -> bool {
27        taskset.iter().all(RTTask::has_implicit_deadline)
28    }
29
30    pub fn constrained_deadlines(taskset: &[RTTask]) -> bool {
31        taskset.iter().all(RTTask::has_constrained_deadline)
32    }
33
34    pub fn total_utilization(taskset: &[RTTask]) -> f64 {
35        taskset.iter()
36            .map(RTTask::utilization)
37            .sum()
38    }
39
40    pub fn largest_utilization(taskset: &[RTTask]) -> f64 {
41        let max = taskset.iter()
42            .map(|t| ordered_float::OrderedFloat(RTTask::utilization(t)))
43            .max();
44
45        match max {
46            Some(max) => *max,
47            None => 0f64,
48        }
49    }
50
51    pub fn total_density(taskset: &[RTTask]) -> f64 {
52        taskset.iter()
53            .map(RTTask::density)
54            .sum()
55    }
56
57    pub fn largest_density(taskset: &[RTTask]) -> f64 {
58        let max = taskset.iter()
59            .map(|t| ordered_float::OrderedFloat(RTTask::density(t)))
60            .max();
61
62        match max {
63            Some(max) => *max,
64            None => 0f64,
65        }
66    }
67
68    pub fn hyperperiod(taskset: &[RTTask]) -> Time {
69        let hyperperiod =
70            taskset.iter()
71            .map(|task| task.period.as_nanos().floor() as i64)
72            .fold(1, |lcm, period| num::integer::lcm(lcm, period));
73
74        Time { value_ns: hyperperiod as f64 }
75    }
76}