def main(argv): if len(argv) == 1: # Chargement de la conf depuis un fichier. configuration = Configuration(argv[0]) else: # Configuration manuelle : configuration = Configuration() configuration.etm = "fixedpenalty" configuration.duration = 420 * configuration.cycles_per_ms # Ajout des tâches. configuration.add_task(name="T1", identifier=1, period=7, activation_date=0, wcet=3, deadline=7) configuration.add_task(name="T2", identifier=2, period=12, activation_date=0, wcet=3, deadline=12) configuration.add_task(name="T3", identifier=3, period=20, activation_date=0, wcet=5, deadline=20) # Ajout d'un processeur. configuration.add_processor(name="CPU 1", identifier=1) configuration.scheduler_info.set_name("schedulers/RM.py") # Vérification de la config. configuration.check_all() # Initialisation de la simu à partir de la config. model = Model(configuration) # Exécution de la simu. model.run_model() # Affichage des résultats. for log in model.logs: print(log)
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)))