Esempio n. 1
0
double 
mems_get_seektime (int devno, ioreq_event *req, int checkcache, double maxtime)
{
  mems_t *dev = getmems(req->devno);
  mems_sled_t *sled = mems_lbn_to_sled(dev, req->blkno);
  double up_time;
  double dn_time;
  tipsector_coord_set_t up;
  tipsector_coord_set_t dn;
  tipset_t tipset;

  // fprintf(stderr, "Entering mems_get_seektime()\n");

  mems_lbn_to_position(req->blkno, sled, &up, &dn, &tipset, NULL, NULL, NULL);
  up_time = mems_seek_time(sled, &sled->pos, &up.servo_start, NULL, NULL, NULL, NULL);
  dn_time = mems_seek_time(sled, &sled->pos, &dn.servo_start, NULL, NULL, NULL, NULL);
  return min(up_time, dn_time);
}
double
mems_seek_time_seekcache (mems_sled_t *sled,
			  coord_t *begin, 
			  coord_t *end,
			  double *return_x_seek_time,
			  double *return_y_seek_time,
			  double *return_turnaround_time,
			  int *return_turnaround_number)
{
  struct mems_seekcache *s;
  int i;

  /* First check if value is cached */
  for (i = 0; i < MEMS_SEEKCACHE; i++) {
    s = &sled->seekcache[i];
    if (mems_equal_coords(begin, &s->begin) &&
	mems_equal_coords(end, &s->end)) {
      if (return_x_seek_time) *return_x_seek_time = s->x_seek_time;
      if (return_y_seek_time) *return_y_seek_time = s->y_seek_time;
      if (return_turnaround_time) *return_turnaround_time = s->turnaround_time;
      if (return_turnaround_number) *return_turnaround_number = s->turnaround_number;
      return s->time;
    }
  }

  s = &sled->seekcache[sled->seekcache_next];
  mems_coord_t_copy(begin, &s->begin);
  mems_coord_t_copy(end, &s->end);
  s->time = mems_seek_time(sled, &s->begin, &s->end, &s->x_seek_time, &s->y_seek_time, &s->turnaround_time, &s->turnaround_number);
  if (return_x_seek_time) *return_x_seek_time = s->x_seek_time;
  if (return_y_seek_time) *return_y_seek_time = s->y_seek_time;
  if (return_turnaround_time) *return_turnaround_time = s->turnaround_time;
  if (return_turnaround_number) *return_turnaround_number = s->turnaround_number;
  sled->seekcache_next++;
  if (sled->seekcache_next == MEMS_SEEKCACHE) sled->seekcache_next = 0;
  // fprintf(stderr, "mems_seek_time_seekcache::  s->time = %f\n", s->time);
  return s->time;
}
Esempio n. 3
0
int main(int argc, char *argv[]) {

  mems_t dev;
  coord_t begin, end;

  double spring_factor = 0.0;
  double accel;
  double length_nm;
  double velocity_nm_s;

  double seek_time;
  double seek_time_zero = 0.0;

  int bit_step = 10;
  int i;
  int verbose = 0;
  int three_dee = 0;
  int mathematica = 0;
  int transpose = 0;
  int hong = 0;

  double time_constants = 0.0;

  int x_pos, y_pos;
  begin.x_pos = 1000;
  begin.y_pos = 1000;

  //start_nm = -1;
  //end_nm = -1;

  spring_factor = 0.0;

  for (i = 0; i < argc; i++) {
    if (strcmp(argv[i], "-v") == 0)
      verbose = 1;
    if (strcmp(argv[i], "-spring") == 0)
      spring_factor = atof(argv[i+1]);
    if (strcmp(argv[i], "-step") == 0)
      bit_step = atoi(argv[i+1]);
    if (strcmp(argv[i], "-start") == 0)
      //start_nm = atof(argv[i+1]);
    if (strcmp(argv[i], "-end") == 0)
      //end_nm = atof(argv[i+1]);
    if (strcmp(argv[i], "-3d") == 0)
      three_dee = 1;
    if (strcmp(argv[i], "-num") == 0)
      time_constants = atof(argv[i+1]);
    if (strcmp(argv[i], "-x") == 0)
      begin.x_pos = atoi(argv[i+1]);
    if (strcmp(argv[i], "-y") == 0)
      begin.y_pos = atoi(argv[i+1]);
    if (strcmp(argv[i], "-math") == 0)
      mathematica = atoi(argv[i+1]);
    if (strcmp(argv[i], "-transpose") == 0)
      transpose = 1;
    if (strcmp(argv[i], "-hong") == 0)
      hong = 1;
  }
  
  accel = 746.2 * 1000000000.0;
  length_nm = 2000.0 * 50.0;
  //velocity_nm_s = 200000.0 * 50.0;
  velocity_nm_s = 0.0;

  dev.sled = malloc(sizeof(mems_sled_t));

  initialize_device(&dev,
		    spring_factor,
		    time_constants,
		    hong);

  begin.y_vel = 0;

  end.x_pos = 0;
  end.y_pos = 0;
  end.y_vel = 0;
  
  //fprintf(stdout, "spring_factor = %f\n", spring_factor);

  for(x_pos = -1000; x_pos <= 1000; x_pos += bit_step) {
    for(y_pos = -1000; y_pos <= 1000; y_pos += bit_step) {

  /*
  for(x_pos = 0; x_pos <= 1000; x_pos += bit_step) {
    for(y_pos = 0; y_pos <= 1000; y_pos += bit_step) {
  */  
      //x_pos = 1000;
      //y_pos = 500;
      
      if (!transpose) {
	end.x_pos = x_pos;
	end.y_pos = y_pos;
      } else {
	end.x_pos = y_pos;
	end.y_pos = x_pos;
      }
      
      if (verbose) fprintf(stdout, "main:  starting a new seek (monkey)\n");
      
      seek_time = mems_seek_time(&(dev.sled[0]),
				  &begin, &end,
				  NULL, NULL,
				  NULL, NULL);

      spring_factor = dev.sled[0].spring_factor;
      dev.sled[0].spring_factor = 0.0;
      
      seek_time_zero = mems_seek_time(&(dev.sled[0]),
				       &begin, &end,
				       NULL, NULL,
				       NULL, NULL);
      
      dev.sled[0].spring_factor = spring_factor;

      if (verbose) fprintf(stdout, "goose\n");
      if (mathematica == 1) {
	fprintf(stdout, "%f ", seek_time);
      } else if (mathematica == 2) {
	fprintf(stdout, "%f ", (seek_time - seek_time_zero));
      } else {
	if (!transpose) {
	  fprintf(stdout, "%d %d %f %f %f\n",
		  x_pos, y_pos, seek_time, seek_time_zero, (seek_time - seek_time_zero));
	} else {
	  fprintf(stdout, "%d %d %f %f %f\n",
		  y_pos, x_pos, seek_time, seek_time_zero, (seek_time - seek_time_zero));
	}	  

	/*
	fprintf(stdout, "%f %f %f %f\n",
		x_velocity_diff, x_time_diff, y_velocity_diff, y_time_diff);
	*/

      }
    }
    if (mathematica != 0) fprintf(stdout, "\n");
  }

  free(dev.sled);
  
  return 0;
}
void
mems_precompute_seek_curve(mems_t *dev) {

  coord_t begin, end;

  double x_seek_time, y_seek_time;
  int sled_length_bits;
  int offset;
  int bit_step;
  int nm_step;
  int i;
  double num_time_constants = dev->sled[0].num_time_constants;
  int precompute_seek_count = dev->precompute_seek_count;

  dev->sled[0].num_time_constants = 0.0;
  dev->precompute_seek_count = 0;

  sled_length_bits = (int) (dev->sled[0].x_length_nm / dev->sled[0].bit_length_nm);
  bit_step = sled_length_bits / precompute_seek_count;
  nm_step = (sled_length_bits * dev->sled[0].bit_length_nm) / precompute_seek_count;

  dev->precompute_seek_distances = (int *)malloc((precompute_seek_count + 1) * sizeof(int));
  dev->precompute_x_seek_times = (double *)malloc((precompute_seek_count + 1) * sizeof(double));
  dev->precompute_y_seek_times = (double *)malloc((precompute_seek_count + 1) * sizeof(double));

  /*
  printf("precompute_seek_count = %d, bit_step = %d, nm_step = %d\n",
	 precompute_seek_count, bit_step, nm_step);
  */

  //  for(offset = 0; offset <= sled_length_bits; offset += bit_step) {
  for(i = 0; i < precompute_seek_count; i++) {
    
    offset = i * bit_step;

    // if (verbose) fprintf(stdout, "main:  starting a new seek (monkey)\n");

    begin.x_pos = 0;
    begin.y_pos = 0;
    begin.y_vel = 0;

    end.x_pos = offset;
    end.y_pos = 0;
    end.y_vel = 0;
    
    /*
    printf("begin = %d, end = %d\n",
	   begin.y_vel, end.y_vel);
    */

    x_seek_time = mems_seek_time(&(dev->sled[0]),
				  &begin, &end,
				  NULL, NULL,
				  NULL, NULL);

    begin.x_pos = 0;
    begin.y_pos = 0;
    begin.y_vel = dev->sled[0].y_access_speed_bit_s;
    
    end.x_pos = 0;
    end.y_pos = offset;
    end.y_vel = dev->sled[0].y_access_speed_bit_s;

    /*
    printf("begin = %d, end = %d\n",
	   begin.y_pos, end.y_pos);
    */

    y_seek_time = mems_seek_time(&(dev->sled[0]),
				  &begin, &end,
				  NULL, NULL,
				  NULL, NULL);

    /*
    fprintf(stdout, "%d, %d, %d, %f, %f\n",
	    i, (i * nm_step), (offset * dev->sled[0].bit_length_nm), x_seek_time, y_seek_time);
    */

    dev->precompute_seek_distances[i] = offset * dev->sled[0].bit_length_nm;
    dev->precompute_x_seek_times[i]   = x_seek_time;
    dev->precompute_y_seek_times[i]   = y_seek_time;

    /*
    fprintf(stdout, "%d, %d, %f, %f\n",
	    i, (offset * dev->sled[0].bit_length_nm),
	    dev->precompute_x_seek_times[i],
	    dev->precompute_y_seek_times[i]);
    */

  }

  begin.x_pos = 0;
  begin.y_pos = 0;
  begin.y_vel = 0;
  
  end.x_pos = sled_length_bits;
  end.y_pos = 0;
  end.y_vel = 0;

  x_seek_time = mems_seek_time(&(dev->sled[0]),
				&begin, &end,
				NULL, NULL,
				NULL, NULL);
  
  begin.x_pos = 0;
  begin.y_pos = 0;
  begin.y_vel = dev->sled[0].y_access_speed_bit_s;
  
  end.x_pos = 0;
  end.y_pos = sled_length_bits;
  end.y_vel = dev->sled[0].y_access_speed_bit_s;
  
  y_seek_time = mems_seek_time(&(dev->sled[0]),
				&begin, &end,
				NULL, NULL,
				NULL, NULL);
  
  dev->precompute_seek_distances[precompute_seek_count] = sled_length_bits * dev->sled[0].bit_length_nm;
  dev->precompute_x_seek_times[precompute_seek_count]   = x_seek_time;
  dev->precompute_y_seek_times[precompute_seek_count]   = y_seek_time;

  /*
  fprintf(stdout, "%d, %d, %d, %f, %f\n",
	  precompute_seek_count, (precompute_seek_count * nm_step), sled_length_bits * dev->sled[0].bit_length_nm, x_seek_time, y_seek_time);
  */

  dev->sled[0].num_time_constants = num_time_constants;
  dev->precompute_seek_count = precompute_seek_count;

}