double resp_time(Iter highest, Iter end, double bound) { typedef typename std::iterator_traits<Iter>::value_type Type; double r = 0; // rt, used for the internal loop double r_old = 0; // used for the internal loop double r_latest = 0; // the greatest rt among all instances int k = 0; // instance number Iter task = end-1; // task under analysis // starting point: r^0 for (Iter x = highest; x!=end; ++x) r += x->get_wcet(); // for_each(highest, end, [&r](Type a) { // r += a.get_wcet(); // }); do { k++; while (r_old < r) { r_old = r; r = k * task->get_wcet() + workload(highest, task, 0, r_old); if (r > bound) throw RespTimeTooLarge(toString(r)); } r_latest = std::max(r_latest, r - (k-1) * task->get_period()); if (r > k * task->get_period()) r+=task->get_wcet(); } while (r > k * task->get_period()); return r_latest; }
double workload(Iter first, Iter end, double t1, double t2) { typedef typename std::iterator_traits<Iter>::value_type Type; double r = 0; for (Iter x = first; x!=end; ++x) r += get_num_arrived_instances(*x, t1, t2) * x->get_wcet(); // for_each(first, end, [&r, t1, t2](Type i) { // r += get_num_arrived_instances(i, t1, t2) * // i.get_wcet(); // }); return r; }