aboutsummaryrefslogtreecommitdiffstats
path: root/schedcat/overheads/fp.py
blob: e60285010d74932bc6be73628f1184598a9c6e85 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from __future__ import division

from math import ceil, floor

from schedcat.model.tasks import SporadicTask, TaskSystem

def charge_scheduling_overheads(oheads, num_cpus, dedicated_irq, taskset):
    if not oheads or not taskset:
        return TaskSystem(taskset)

    event_latency = oheads.release_latency(taskset)

    # pseudo-task representing the tick interrupt
    tck = oheads.tick(taskset)
    if tck > 0:
        tick_isr = SporadicTask(tck, oheads.quantum_length)
        tick_isr.jitter = event_latency
        tick_tasks = [tick_isr]
    else:
        tick_tasks = []

    # pseudo-tasks representing release interrupts
    rel_cost   = oheads.release(taskset)
    if not dedicated_irq and rel_cost > 0:
        release_tasks = [SporadicTask(rel_cost, t.period) for t in taskset]
        for isr in release_tasks:
            isr.jitter = event_latency
    else:
        release_tasks = [] # releases don't impact tasks directly

    # account for initial release delay as jitter
    release_delay = event_latency + oheads.release(taskset)
    if dedicated_irq:
        release_delay += oheads.ipi_latency(taskset)

    for t in taskset:
        if not 'jitter' in t.__dict__:
            t.jitter = 0
        t.jitter += release_delay

    # account for scheduling cost and CPMD
    sched  = oheads.schedule(taskset)
    cxs    = oheads.ctx_switch(taskset)
    cpmd   = oheads.cache_affinity_loss(taskset)
    preemption = 2 * (sched + cxs) + cpmd
    for t in taskset:
        t.cost += preemption

    return TaskSystem(tick_tasks + release_tasks + taskset)

def quantize_params(taskset):
    """After applying overheads, use this function to make
        task parameters integral again."""

    for t in taskset:
        t.cost     = int(ceil(t.cost))
        t.period   = int(floor(t.period))
        t.deadline = int(floor(t.deadline))
        t.jitter   = int(ceil(t.jitter))
        if t.density() > 1:
            return False

    return taskset