Subversion Repositories shark

Rev

Rev 1239 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <kernel/kern.h>

#include "fsf_contract.h"
#include "fsf_server.h"
#include "func.h"

/* Activate task output */
#define TASK_OUTPUT

int cal_cycles=0;
struct timespec zero_time;                                        
extern struct loader_task *loader_task_list;
extern int total_loader_task;

/* oneshot Soft and hard Task */
void *oneshot_task(void *arg)
{
  long long i,exec_cycles = 0;
  int act = 0;
  struct loader_task *l = (struct loader_task *)(arg);
  char tmp[20];

  #ifdef TASK_OUTPUT
    sprintf(tmp,"X[%06d]",act);
    printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task()  / 5 + 5, GREEN, tmp);
  #endif

  exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[act])) * CALIBRATION_DELTA / cal_cycles;
 
  for (i=0;i<exec_cycles;i++) calibration_func();
 
  generic_task_endcycle();
                                                                                                                         
  return NULL;
                                                                                                                             
}

void * periodic_task(void *arg)
{
  long long i,exec_cycles = 0;
  int act = 0;
  struct loader_task *l = (struct loader_task *)(arg);
  char tmp[20];

  while(1) {

    #ifdef TASK_OUTPUT
      sprintf(tmp,"X[%06d]",act);
      printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task()  / 5 + 5, GREEN, tmp);
    #endif
   
    exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[act])) * CALIBRATION_DELTA / cal_cycles;
   
    for (i=0;i<exec_cycles;i++) calibration_func();
   
    generic_task_endcycle();
   
    act++;
   
  }                                                                                                                
  return NULL;
                                                                                                                             
}

void * back_task(void *arg)
{
  long long i,exec_cycles = 0;
  int act = 0;
  struct loader_task *l = (struct loader_task *)(arg);
  char tmp[20];

  while(1) {

    #ifdef TASK_OUTPUT
      sprintf(tmp,"X[%06d]",act);
      printf_xy((get_current_exec_task() % 5) * 9 + 34,get_current_exec_task()  / 5 + 5, GREEN, tmp);
    #endif
   
    exec_cycles = (long long)(TIMESPEC2USEC(&l->exec[0])) * CALIBRATION_DELTA / cal_cycles;
   
    for (i=0;i<exec_cycles;i++) calibration_func();
   
    act++;
   
  }                                                                                                                
  return NULL;
                                                                                                                             
}

/* Task create */
/* this function create the task struct in memory */

void loader_task_create()
{

  struct loader_task *current = loader_task_list;
  int i=0, k=0;

  while (k <total_loader_task) {
    k++;
   
    for (i=0; i < current->number; i++) {
     
      pthread_t j;
      int err;
      void *func=NULL;
      switch(current->task_type)  {
      case PAR_TASK_OS:
        func=oneshot_task;
        break;
      case PAR_TASK_BT:
        func=back_task;
        break;
      case PAR_TASK_CT:
        func=periodic_task;
        break;
      }
      err = generic_create_thread(current->server,&j,NULL,func,(void *)current,generic_get_task_model(current));
      if (err) {
        cprintf("Error fsf task creating\n");
        sys_end();
      }
     
    }

    current = &loader_task_list[k];

  }
   
  cprintf("Created %d loader tasks\n",k);

 
}


int start_environment()
{

  struct timespec total = {20,0};
 
  generic_calibrate_cycle();

  kern_gettime(&zero_time);

  generic_fsfinit();

  loader_task_create();

  generic_set_simulation_time(&total);

  generic_start_simulation();

  return 0;

}