# Library prosa.results.edf.rta.floating_nonpreemptive

Require Import prosa.model.readiness.basic.

Require Export prosa.results.edf.rta.bounded_nps.

Require Export prosa.analysis.facts.preemption.rtc_threshold.floating.

Require Export prosa.analysis.facts.readiness.sequential.

Require Import prosa.model.priority.edf.

Require Export prosa.results.edf.rta.bounded_nps.

Require Export prosa.analysis.facts.preemption.rtc_threshold.floating.

Require Export prosa.analysis.facts.readiness.sequential.

Require Import prosa.model.priority.edf.

# RTA for EDF with Floating Non-Preemptive Regions

In this module we prove the RTA theorem for floating non-preemptive regions EDF model.## Setup and Assumptions

Consider any type of tasks ...

... and any type of jobs associated with these tasks.

Context {Job : JobType}.

Context `{JobTask Job Task}.

Context `{JobArrival Job}.

Context `{JobCost Job}.

Context `{JobTask Job Task}.

Context `{JobArrival Job}.

Context `{JobCost Job}.

We assume the classic (i.e., Liu & Layland) model of readiness
without jitter or self-suspensions, wherein pending jobs are
always ready.

We assume that jobs are limited-preemptive.

Consider any arrival sequence with consistent, non-duplicate arrivals.

Variable arr_seq : arrival_sequence Job.

Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.

Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.

Assume we have the model with floating non-preemptive regions.
I.e., for each task only the length of the maximal non-preemptive
segment is known

*and*each job level is divided into a number of non-preemptive segments by inserting preemption points.
Context `{JobPreemptionPoints Job}

`{TaskMaxNonpreemptiveSegment Task}.

Hypothesis H_valid_task_model_with_floating_nonpreemptive_regions:

valid_model_with_floating_nonpreemptive_regions arr_seq.

`{TaskMaxNonpreemptiveSegment Task}.

Hypothesis H_valid_task_model_with_floating_nonpreemptive_regions:

valid_model_with_floating_nonpreemptive_regions arr_seq.

Consider an arbitrary task set ts, ...

... assume that all jobs come from this task set, ...

... and the cost of a job cannot be larger than the task cost.

Let max_arrivals be a family of valid arrival curves, i.e., for
any task tsk in ts max_arrival tsk is (1) an arrival bound of
tsk, and (2) it is a monotonic function that equals 0 for the
empty interval delta = 0.

Context `{MaxArrivals Task}.

Hypothesis H_valid_arrival_curve : valid_taskset_arrival_curve ts max_arrivals.

Hypothesis H_is_arrival_curve : taskset_respects_max_arrivals arr_seq ts.

Hypothesis H_valid_arrival_curve : valid_taskset_arrival_curve ts max_arrivals.

Hypothesis H_is_arrival_curve : taskset_respects_max_arrivals arr_seq ts.

Let tsk be any task in ts that is to be analyzed.

Next, consider any valid ideal uni-processor schedule with limited
preemptions of this arrival sequence ...

Variable sched : schedule (ideal.processor_state Job).

Hypothesis H_sched_valid: valid_schedule sched arr_seq.

Hypothesis H_schedule_with_limited_preemptions:

schedule_respects_preemption_model arr_seq sched.

Hypothesis H_sched_valid: valid_schedule sched arr_seq.

Hypothesis H_schedule_with_limited_preemptions:

schedule_respects_preemption_model arr_seq sched.

Next, we assume that the schedule is a work-conserving schedule...

... and the schedule respects the scheduling policy.

## Total Workload and Length of Busy Interval

Using the sum of individual request bound functions, we define the request bound
function of all tasks (total request bound function).

We define a bound for the priority inversion caused by jobs with lower priority.

Definition blocking_bound A :=

\max_(tsk_other <- ts | (blocking_relevant tsk_other)

&& (task_deadline tsk_other > task_deadline tsk + A))

(task_max_nonpreemptive_segment tsk_other - ε).

\max_(tsk_other <- ts | (blocking_relevant tsk_other)

&& (task_deadline tsk_other > task_deadline tsk + A))

(task_max_nonpreemptive_segment tsk_other - ε).

Next, we define an upper bound on interfering workload received from jobs
of other tasks with higher-than-or-equal priority.

Let bound_on_total_hep_workload A Δ :=

\sum_(tsk_o <- ts | tsk_o != tsk)

rbf tsk_o (minn ((A + ε) + task_deadline tsk - task_deadline tsk_o) Δ).

\sum_(tsk_o <- ts | tsk_o != tsk)

rbf tsk_o (minn ((A + ε) + task_deadline tsk - task_deadline tsk_o) Δ).

Let L be any positive fixed point of the busy interval recurrence.

## Response-Time Bound

Consider any value R, and assume that for any given arrival
offset A in the search space, there is a solution of the
response-time bound recurrence which is bounded by R.

Variable R : duration.

Hypothesis H_R_is_maximum:

∀ (A : duration),

is_in_search_space A →

∃ (F : duration),

A + F ≥ blocking_bound A + task_rbf (A + ε) + bound_on_total_hep_workload A (A + F) ∧

R ≥ F.

Hypothesis H_R_is_maximum:

∀ (A : duration),

is_in_search_space A →

∃ (F : duration),

A + F ≥ blocking_bound A + task_rbf (A + ε) + bound_on_total_hep_workload A (A + F) ∧

R ≥ F.

Now, we can leverage the results for the abstract model with
bounded nonpreemptive segments to establish a response-time
bound for the more concrete model with floating nonpreemptive
regions.

Let response_time_bounded_by := task_response_time_bound arr_seq sched.

Theorem uniprocessor_response_time_bound_edf_with_floating_nonpreemptive_regions:

response_time_bounded_by tsk R.

Proof.

move: (H_valid_task_model_with_floating_nonpreemptive_regions) ⇒ [LIMJ JMLETM].

move: (LIMJ) ⇒ [BEG [END _]].

eapply uniprocessor_response_time_bound_edf_with_bounded_nonpreemptive_segments with (L := L) ⇒ //.

rewrite subnn.

intros A SP.

apply H_R_is_maximum in SP.

move: SP ⇒ [F [EQ LE]].

∃ F.

by rewrite subn0 addn0; split.

Qed.

End RTAforModelWithFloatingNonpreemptiveRegionsWithArrivalCurves.