Subversion Repositories shark

Rev

Rev 1490 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Project: S.Ha.R.K.
 *
 * Coordinators:
 *   Giorgio Buttazzo    <giorgio@sssup.it>
 *   Paolo Gai           <pj@gandalf.sssup.it>
 *
 * Authors     :
 *   Giacomo Guidi       <giacomo@gandalf.sssup.it>
 *
 * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
 *
 * http://www.sssup.it
 * http://retis.sssup.it
 * http://shark.sssup.it
 */


/* The tracer instrumentation ideas come from the York PWCET analisys tool
 *     
 *      Real-Time System Group
 *      University of York
 *
 */


#include <kernel/kern.h>
#include <tracer.h>

int num_aster = 0;
#define ASTER_LIM       67
#define ASTER_MAX       90

TASK asteroide(void)
{
  int i = 1;
  int y = 0;

  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,1000,0);

  y = rand() % 20 + 1;

  while (i < ASTER_LIM) {

    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,1001,0);

    puts_xy(i,y,WHITE,"*");

    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,1002,0);
    task_endcycle();

    puts_xy(i,y,WHITE," ");
    i++;
  }

  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,1003,0);
  num_aster--;

  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,1004,0);
  return 0;

}

DWORD taskCreated = 0;

TASK aster(void)
{
  PID p;

  HARD_TASK_MODEL m;
  int r;

  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,2000,0);

  hard_task_default_model(m);
  hard_task_def_wcet(m,500);

  while (1) {
 
    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,2001,0);

    if (num_aster < ASTER_MAX) {

      FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,2002,0);

      r = (rand() % 50) - 25;

      hard_task_def_arg(m,(void *)((rand() % 7)+1));
      hard_task_def_mit(m, (50+r)*1000);
      p = task_create("aaa",asteroide,&m,NULL);
      taskCreated++;
      task_activate(p);
      num_aster++;
    }

    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,2003,0);
    task_endcycle();

  }

  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,2004,0);

}

TASK clock()
{
  int s = 0, m = 0;

  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3000,0);

  while(1) {

    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3001,0);

    printf_xy(70,1,WHITE,"%2d : %2d",m,s);
    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3002,0);
    task_endcycle();

    if (++s > 59) {

      FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3003,0);
      s = 0;
      m++;

    }
    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3004,0);

    printf_xy(70,1,WHITE,"%2d : %2d",m,s);

    FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3005,0);
    task_endcycle();

  }
  FAST_TRACER_LOGEVENT(FTrace_EVT_ipoint,3006,0);

}

void instrumented_routine() {

  PID p1,p2;
  HARD_TASK_MODEL m;
  struct timespec t;

  cprintf("Start\n");

  clear();

  hard_task_default_model(m);
  hard_task_def_mit(m,10000);
  hard_task_def_wcet(m,2000);
  hard_task_def_group(m,1);

  p1 = task_create("Aster",aster,&m,NULL);
  if (p1 == -1) {
    sys_shutdown_message("Aster.C(main): Could not create task <aster> ...");
    sys_end();
  }

  hard_task_def_mit(m,500000);
  p2 = task_create("Clock",clock,&m,NULL);
  if (p2 == -1) {
    sys_shutdown_message("Aster.C(main): Could not create task <Clock> ...");
    sys_end();
  }

  group_activate(1);

  do {
    sys_gettime(&t);
  } while (t.tv_sec < 10);

  cprintf("Done\n");

}

int main(int argc, char **argv)
{

  int a,b,c;
  struct timespec start,end,diff;

  srand(sys_gettime(NULL));

  a = FTrace_chunk_create(1000000, 1000000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC);
  b = FTrace_chunk_create(1000000, 1000000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_JTN);
  c = FTrace_chunk_create(1000000, 1000000, FTRACE_CHUNK_FLAG_FREE | FTRACE_CHUNK_FLAG_CYC);

  FTrace_chunk_link(a,b);
  FTrace_chunk_link(b,c);

  kern_gettime(&start);
  FTrace_enable();

  TRACER_LOGEVENT(FTrace_EVT_trace_start,0,0);

    instrumented_routine();

  TRACER_LOGEVENT(FTrace_EVT_trace_stop,0,0);  

  FTrace_disable();
  kern_gettime(&end);

  SUBTIMESPEC(&end,&start,&diff);

  printf_xy(1,21,WHITE,"Logged Time %d s %d us",(int)diff.tv_sec,(int)diff.tv_nsec/1000);

  sys_end();

  return 0;

}