Пример #1
0
void get_RPN ( char *input )
{
  int length = strlen( input );
  int i=0;
  int sp=0;

  calc_init();

  for( i = 0; i < length; i++  ) {
    if( check_operator_and_convert_number( input[i] ) == TRUE ) {

      if( input[i] == ')' ){
	/* 最初の括弧まで計算。 */
	pop_stack( &sp, input[i] );
      }
      else if( input[i] == '(' ){
	stack_buf[sp++] = input[i];
      }
      else{
	if( sp == 0 ){
	  stack_buf[sp++] = input[i];
	}
	else{
	  priority_type cur_sign   =  check_priority( input[i] );
	  priority_type stack_sign =  check_priority( stack_buf[sp-1] );

	  /* 演算子の優先度を確認 */
	  /* "*", "/" の場合は、スタックに追加 */
	  if( cur_sign > stack_sign ){
	    stack_buf[sp++] = input[i];
	  }
	  else{
	    pop_stack( &sp, input[i] );
	    stack_buf[sp++] = input[i];
	  }
	}
      }
    }
  }


  /* 最終の文字が ')' でなければ、数値の変換が必要。 */
  if( input[ length-1 ] != ')' ){
    result_buf[result_index++] = atof( &temp_val[0] );
  }

  pop_stack( &sp, 0 );

  return;
}
Пример #2
0
int k_set_process_priority(int pid, int prio){
	PCB *p;
	int time;
	#ifdef TIMING
	start_timer();
	#endif
	
	// TODO: add check
	if (pid == PID_NULL || pid == PID_TIMER_IPROC || pid == PID_UART_IPROC || prio < HIGH || prio > LOWEST) {
		return RTX_ERR;
	}
		
	p = get_process(pid, gp_pcbs);
	if (p == NULL) {
		return RTX_ERR;
	}
	
	#ifdef DEBUG_0 
	printf("setting process %d priority from %d to %d\n", p->m_pid, p->m_priority, prio);
	#endif /* ! DEBUG_0 */
	p->m_priority = prio;
	
	pq_sort(ready_queue);
	check_priority();
	#ifdef TIMING
	time = end_timer();
	#endif
	return RTX_OK;
}
Пример #3
0
void battle_phase() {
	if (check_priority()) {
		animateMainSprites();
		curr_exe();
		swap_curr();
		curr_exe();
	}
}
Пример #4
0
/*
	void peer_arbitrate()
	
	setup the initial kernel state by monitoring hot-standby port
	and IO bus activities.
*/
LOCAL void peer_arbitrate() 
{
	int cookie;
	f8_u8 st;
	int i;
	
	struct peer_cmd_t tp;

	for(i=0;i<3;i++){
		cookie = peer_lock();
		set_state(hsp_s_arbitrate);
		tp.cmd = Pr_query_status;
		tp.code = F8_SUCCESS;
		tp.time = ke_get_time();
		//peer_flush();
		peer_write(&tp, sizeof tp);
		peer_unlock(cookie);
		
		miliSleep(HSP_ARBITRATION_TIMEOUT);
		
		/* is there an answer? */
		cookie = peer_lock();
		st = get_state();
		set_state(hsp_s_idle);
		peer_unlock(cookie);
		if(st==hsp_s_complete)
			break;
	}
	// mode_show();
	// logMsg("Peer is %s, state=%s\n", ke_get_mode_name(peerState, state_name(st)));
	
	if(st == hsp_s_complete){
		switch(peerState){
		case KERN_S_RUNNING:
			ki_switch_to(KERN_S_STANDBY);
			return;
		case KERN_S_ARBITRATING:
			if(check_priority())
				ki_switch_to(KERN_S_RUNNING);
			else
				ki_switch_to(KERN_S_STANDBY);
			break;
		default:
			ki_switch_to(KERN_S_RUNNING);
			break;
		}
	}else{
		ki_switch_to(KERN_S_RUNNING);
	}

	hsp_log(("arbitration finished, mode is:%d\n", kernelState));

	// ki_switch_to(KERN_S_HALTED);
}
Пример #5
0
LOCAL f8_status primary_sync()
{
	struct peer_cmd_t tp;
	int i, cookie;
	enum hsp_state_t st;
	long size2;
	
	st = get_state();
	if(st == hsp_s_collision){
		if(!check_priority()){
			ki_switch_to(KERN_S_STANDBY);
			return F8_SUCCESS;
		}
	}
	
	ki_save_volatile(&g_kernel);

	cookie = peer_lock();

	/* prepare volatile data */
	size2=sizeof(peerDataZipped);
	if(compress(peerDataZipped, &size2, peerData, peerPointer-peerData) == Z_OK){
		peerHdr.zipped_data_len=size2;
	}else{
		/* might continue with un-compressed data */
		return F8_LOW_MEMORY;
	}
	
	/* start automata */
	// set_state(hsp_s_connecting);
	_state = hsp_s_connecting;
	memset(&tp, 0, sizeof(tp));
	tp.cmd = Pr_connect;
	tp.code = F8_SUCCESS;
	tp.time = ke_get_time();
	//peer_flush();
	if(peer_write3(&tp, sizeof(tp), &g_kernel.status, sizeof(g_kernel.status), &peerHdr, sizeof(peerHdr)) < 0){
		set_state(hsp_s_idle);
		peer_unlock(cookie);
		return F8_CONNECTION_LOST;
	}
	peer_unlock(cookie);

	/* wait 5 times to see if connection established */
	for(i=0; i<5; i++){
		if(get_state() == hsp_s_active || get_state() >= 10){
			break;
		}
		miliSleep(hspConnTimeout);
	}
	st = get_state();
	if(st == hsp_s_active){
		/* expected transfer time */
		////i = size2*8/HSP_LINE_SPEED;
		////if(!i) i=1;
		// i is packet count, chenj 2009-3-5
		i=size2/1024+1;
		while(i > 0){
			if(get_state() >= 10){
				break;
			}			
			////miliSleep(hspConnTimeout);
			////i -= hspConnTimeout;
			miliSleep(2);
			i--;
		}
	}
	st = get_state();
	// set_state(hsp_s_idle);
	_state = hsp_s_idle;

	if(st == hsp_s_complete){
		return F8_SUCCESS;
	}else if(st == hsp_s_collision){
		ki_switch_to(KERN_S_ARBITRATING);
	}else{
		peerCounters[3] = st;
		peerCounters[5]++;
		// hsp_log(("primary timeout %d\n", i));
		/* reset peer state */
		memset(&g_kernel.peer_status, 0, sizeof g_kernel.peer_status);
	}
	
	return F8_TIMEOUT;
}
Пример #6
0
/**
* 입력된 한 줄을 파싱하는 함수입니다. 오류가 있으면 1을 반환합니다.
*/
int parse_string(int line_index)
{
	char * copied_string = NULL; //strsep함수를 사용하기위해서는 내용이 변해도 문제없는 문자열이 필요합니다. 이를 위해 strdup함수를 이용해서 문자열을 복제할 것입니다.
	char * seperated_string = NULL; //strsep함수로 분리된 문자열은 여기에 저장됩니다. 이후에 값을 parse_str_array의 원소에 저장할 것입니다.
	char * delimiter = " "; //구분자 변수입니다.
	
	int check_result = 0; //파싱후의 구문을 검사한 결과 값입니다.
	
	copied_string = strdup(input_string_array[line_index]);
	remove_string_space(copied_string);

	//형식에 맞는지 검사합니다. 형식은 ' '가 3개 있는 형태여야합니다.
	if (letter_cnt(input_string_array[line_index],*delimiter) != 3)
	{
		fprintf(stderr,"invalid format in line %d, ignored\n",line_index + 1);
	}
	
	seperated_string = strsep(&copied_string, delimiter);
	remove_string_space(seperated_string);
	if ((check_result = check_id(seperated_string))) //먼저 id의 형식이 맞는지 확인합니다. 문제가 있으면 if는 참입니다.
	{
		if (check_result == 1)
			fprintf(stderr,"invalid process id ‘%s’ in line %d, ignored\n",seperated_string, line_index + 1);
		else if (check_result == 2)
			fprintf(stderr,"duplicate process id ‘%s’ in line %d, ignored\n",seperated_string,line_index + 1);
		parsed_str_array[line_index].program_id[0] = '#'; //오류가 있는 칸임을 알리는 값으로 id의 맨 앞을 #으로 지정합니다.
		return 1;
	}
	
	//문제가 없으면 id를 구조체에 저장합니다.
	strcpy(parsed_str_array[line_index].program_id,seperated_string);
	
	seperated_string = strsep(&copied_string,delimiter);
	remove_string_space(seperated_string);
	
	if (check_arrive_time(seperated_string))
	{
		fprintf(stderr,"invalid arrive-time ‘%s’ in line %d, ignored\n",seperated_string, line_index + 1);
		parsed_str_array[line_index].program_id[0] = '#'; //오류가 있는 칸임을 알리는 값으로 id의 맨 앞을 #으로 지정합니다.
		return 1;
	}
	
	parsed_str_array[line_index].arrive_time = atoi(seperated_string);
	
	seperated_string = strsep(&copied_string,delimiter);
	remove_string_space(seperated_string);
	if (check_service_time(seperated_string))
	{
		fprintf(stderr,"invalid service-time ‘%s’ in line %d, ignored\n",seperated_string, line_index + 1);
		parsed_str_array[line_index].program_id[0] = '#'; //오류가 있는 칸임을 알리는 값으로 id의 맨 앞을 #으로 지정합니다.
		return 1;
	}
	
	parsed_str_array[line_index].service_time = atoi(seperated_string);
	parsed_str_array[line_index].remain_time = parsed_str_array[line_index].service_time;
	
	seperated_string = strsep(&copied_string,delimiter);
	remove_string_space(seperated_string);
	if (check_priority(seperated_string))
	{
		fprintf(stderr,"invalid priority ‘%s’ in line %d, ignored\n",seperated_string, line_index + 1);
		parsed_str_array[line_index].program_id[0] = '#'; //오류가 있는 칸임을 알리는 값으로 id의 맨 앞을 #으로 지정합니다.
		return 1;
	}
	
	parsed_str_array[line_index].priority = atoi(seperated_string);
	
	
	correct_process_many++;
	last_process_index = line_index;
	
	return 0;
}