Exemple #1
0
def default_config(duration, cpu_count):
    config = Configuration()

    # Amount of ms for the experiment
    config.cycles_per_ms = 100000
    config.duration = duration * config.cycles_per_ms

    # Add a processor:
    for i in range(cpu_count):
        config.add_processor(name="CPU " + str(i), identifier=i)
    return config
def create_trace(scheduler="simso.schedulers.RM",
                 n_tasks=3,
                 seed=None,
                 total_utilization=0.9,
                 method='automotive',
                 alpha=0,
                 jitter=0,
                 is_preemptive=True):
    redo = True
    scale = 1
    while redo:
        # Manual configuration:
        configuration = Configuration()
        configuration.cycles_per_ms = 1

        # Replicate the results for more scheduling policies
        if seed is not None:
            np.random.seed(seed)
            random.seed(seed)

        # Generate periods and executions according to the specified method
        periods, wcets = gen_periods_and_exec(n_tasks, total_utilization,
                                              method, is_preemptive)

        #   Debugging
        if method == 'loguniform':
            divider = 1 / 10
        else:
            divider = 1 / 1000
        wcets = wcets / divider
        hyperperiod = np.lcm.reduce(np.array(periods)) / divider
        periods = periods / divider

        wcets = np.round(wcets / scale) * scale

        for i in range(len(wcets)):
            if wcets[i] == 0:
                wcets[i] = scale

        if alpha == 0:

            for i in range(n_tasks):
                configuration.add_task(name="T" + str(i + 1),
                                       identifier=i,
                                       period=periods[i] / scale,
                                       activation_date=0,
                                       wcet=wcets[i] / scale,
                                       deadline=periods[i] / scale,
                                       jitter=jitter)

            if jitter == 0:
                configuration.duration = 2 * hyperperiod * configuration.cycles_per_ms / scale  # in seconds
            else:
                configuration.duration = 10 * hyperperiod * configuration.cycles_per_ms / scale  # in seconds

        else:
            configuration.etm = 'ucet'
            ucets = (1 - alpha) * wcets

            for i in range(n_tasks):
                configuration.add_task(name="T" + str(i + 1),
                                       identifier=i,
                                       period=periods[i] / scale,
                                       activation_date=0,
                                       ucet=ucets[i],
                                       wcet=wcets[i] / scale,
                                       deadline=periods[i] / scale,
                                       jitter=jitter)

            configuration.duration = 10 * hyperperiod * configuration.cycles_per_ms / scale  # in seconds

        if configuration.duration < 0:
            continue

        # Add a processor:
        configuration.add_processor(name="CPU 1", identifier=1)

        # Add a scheduler:
        configuration.scheduler_info.clas = scheduler

        # Check the config before trying to run it.
        configuration.check_all()

        # Init a model from the configuration.
        model = Model(configuration)

        # Execute the simulation.
        model.run_model()

        redo = False

    trace = []
    prev_time = 0
    prev_task = None
    for log in model.logs:
        crt_time = log[0]
        info = log[1][0].split("_")
        task = int(info[0].split('T')[1])

        state = info[1].split(' ')

        if 'Preempted!' in state:
            for i in range(1, int((crt_time - prev_time))):
                trace.append(prev_task)
            prev_time = crt_time

        if 'Executing' in state:
            if prev_time != crt_time:
                for i in range(0, int((crt_time - prev_time))):
                    trace.append(0)  # append idle task

            prev_time = crt_time  # reset counting time interval
            prev_task = task
            trace.append(task)

        if 'Terminated.' in state:
            for i in range(1, int((crt_time - prev_time))):
                trace.append(prev_task)
            prev_time = crt_time

    return trace, list(map(int, list(periods)))