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; }
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; }
void battle_phase() { if (check_priority()) { animateMainSprites(); curr_exe(); swap_curr(); curr_exe(); } }
/* 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); }
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; }
/** * 입력된 한 줄을 파싱하는 함수입니다. 오류가 있으면 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; }