Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 240 → Rev 241

/shark/trunk/ports/first/modules/edfstar.c
16,16 → 16,6
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: edfstar.c,v 1.4 2003-09-17 09:43:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.4 $
Last update: $Date: 2003-09-17 09:43:47 $
------------
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
63,8 → 53,7
#include <kernel/iqueue.h>
 
/* for BUDGET_TASK_MODEL */
#include "cbsstar.h"
#include <comm_message.h>
#include "fsf_server.h"
 
/*
* DEBUG stuffs begin
300,45 → 289,6
private_dispatch(lev->scheduling_level,p,nostop);
}
 
static int EDFSTAR_private_change_level(LEVEL l, PID p)
{
 
EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
 
/* Change task level */
if (lev->flag[p] & EDFSTAR_CHANGE_LEVEL) {
STD_command_message msg;
proc_table[p].status = SLEEP;
level_table[lev->scheduling_level]->private_extract(lev->scheduling_level,p);
iq_extract(p,&lev->ready);
if (lev->deadline_timer[p] != -1)
kern_event_delete(lev->deadline_timer[p]);
EDFSTAR_check_preemption(lev);
lev->nact[p] = 0;
lev->budget[p] = -1;
proc_table[p].task_level = lev->new_level[p];
/* Send change level command to local scheduler */
 
msg.command = STD_ACTIVATE_TASK;
msg.param = NULL;
 
level_table[ lev->new_level[p] ]->public_message(lev->new_level[p],p,&msg);
return 1;
 
}
 
return 0;
 
}
 
static void EDFSTAR_public_epilogue(LEVEL l, PID p)
{
EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
347,8 → 297,6
edfstar_printf("(E:epi ");
#endif
 
if (EDFSTAR_private_change_level(l, p)) return;
 
/* check if the wcet is finished... */
if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
/* wcet finished: disable wcet event and count wcet miss */
432,8 → 380,6
{
EDFSTAR_level_des *lev = (EDFSTAR_level_des *)(level_table[l]);
struct timespec temp;
STD_command_message *msg;
HARD_TASK_MODEL *h;
 
#ifdef EDFSTAR_DEBUG
edfstar_printf("(E:ecy ");
444,8 → 390,6
/* Task EndCycle */
case (long)(NULL):
 
if (EDFSTAR_private_change_level(l,p)) return 0;
 
/* we call guest_end directly here because the same task may
be reinserted in the queue before calling the preemption check! */
level_table[ lev->scheduling_level ]->
504,50 → 448,8
 
default:
 
msg = (STD_command_message *)m;
#ifdef EDFSTAR_DEBUG
edfstar_printf("(E:MSG %d)",msg->command);
#endif
switch(msg->command) {
case STD_SET_NEW_MODEL:
/* if the EDFSTAR_task_create is called, then the pclass must be a
valid pclass. */
h=(HARD_TASK_MODEL *)(msg->param);
break;
/* now we know that m is a valid model */
lev->wcet[p] = h->wcet;
lev->period[p] = h->mit;
lev->flag[p] = 0;
lev->deadline_timer[p] = -1;
lev->dline_miss[p] = 0;
lev->wcet_miss[p] = 0;
lev->nact[p] = 0;
 
break;
 
case STD_SET_NEW_LEVEL:
lev->flag[p] |= EDFSTAR_CHANGE_LEVEL;
lev->new_level[p] = (int)(msg->param);
 
break;
 
case STD_ACTIVATE_TASK:
/* Enable wcet check */
proc_table[p].avail_time = lev->wcet[p];
proc_table[p].wcet = lev->wcet[p];
proc_table[p].control |= CONTROL_CAP;
EDFSTAR_public_activate(l, p);
break;
 
}
}
return 0;
}