long get_thread_time(pthread_t id) {
	clockid_t id_zegara;

	errno = pthread_getcpuclockid(id, &id_zegara);
	test_errno("pthread_getcpuclockid");

	return clock_ms(id_zegara);
}
int main() {
	pthread_t id[N];
	parametry param[N];
	int i;

	srand(time(NULL));

	printf("pocz±tek programu, uruchomianie zostanie %d w±tków\n", N);

	/* utworzenie w±tku */
	for (i=0; i < N; i++) {
		param[i].id = i;
		param[i].n = rand() % 100000000 + 1;

		errno = pthread_create(&id[i], NULL, watek, &param[i]);
		test_errno("pthread_create");
	}

	/* stan na mniej wiêcej pó³metku */
	sleep(1);
	puts("po oko³o sekundzie w±tki zu¿y³y:");
	for (i=0; i < N; i++)
		printf("* #%d: %ldms\n", i, get_thread_time(id[i]));

	/* oczekiwanie na zakoñczenie w±tków */
	for (i=0; i < N; i++) {
		errno = pthread_join(id[i], NULL);
		test_errno("pthread_join");
	}

	/* jeszcze podsumowanie */
	puts("");
	printf("g³ówny w±tek zu¿y³ %ldms czasu procesora\n", clock_ms(CLOCK_THREAD_CPUTIME_ID));
	printf("proces zu¿y³ %ldms czasu procesora\n", clock_ms(CLOCK_PROCESS_CPUTIME_ID));

	return EXIT_SUCCESS;
}
// funkcja w±tku
void* watek(void* _arg) {
	parametry* arg = (parametry*)_arg;
	int i;
	printf("w±tek #%d uruchomiony, dwa razy wykona %d pustych pêtli\n",
		(int)arg->id,
		(int)arg->n
	);

	for (i=0; i < arg->n; i++)
		/* zu¿ycie czasu procesora */;

	sleep(2);
	
	for (i=0; i < arg->n; i++)
		/* zu¿ycie czasu procesora */;

	/* podsumowanie pracy */
	printf("w±tek #%d zakoñczony, zu¿y³ %ldms czasu procesora\n",
		(int)arg->id,
		clock_ms(CLOCK_THREAD_CPUTIME_ID)
	);
	return NULL;
}
示例#4
0
/* ‘ункциональный блок управлени¤ эжекторами */
void FB_EJECTOR(struct FB_EJECTOR* inst)
{

////////////////////////////////////////
//			¬ычислим врем¤ выполнени¤ полного цикла ѕЋ  в сек.
////////////////////////////////////////
	
	(*inst).CYCLE_TIME = (clock_ms() - (*inst).time_last_cycle) / 1000.0;
	(*inst).time_last_cycle = clock_ms();	

////////////////////////////////////////
//			активность блока			
////////////////////////////////////////

	// Ќ≈“ ј “»¬Ќќ—“», выходим из программы
	if ( (*inst).enable != 1 )
	{	
		//Samkaev
		(*inst).OUT_STATE = NONE;; 
		
		// ¬ Ћ.
		if ( (*inst).IN_ON == 1 )
			(*inst).OUT_STATE = ON; 
						
		// ¬џ Ћ.
		if ( (*inst).IN_OFF == 1 )
			(*inst).OUT_STATE = OFF;
		
		// ј¬ј–»я
		if ( (*inst).IN_FAULT == 1 )
		{
			(*inst).OUT_STATE = FAULT;
		}	

		// ј¬ј–»я (два состо¤ни¤)	
		if ( (*inst).IN_ON == 1 && (*inst).IN_OFF == 1 )
		{
			(*inst).OUT_STATE = FAULT;
		}	
		//Samkaev
	
		//Samkaev
//		(*inst).IN_ON 			= 0;
//		(*inst).IN_OFF 			= 0;
//		(*inst).IN_FAULT 		= 0;
		//Samkaev

		(*inst).IN_MODE 		= 0;
		(*inst).IN_CMD			= NONE;
		(*inst).OUT_ON 			= 0;
		(*inst).OUT_OFF			= 0;
		(*inst).OUT_STATUS 		= 0;
		(*inst).OUT_CUR_PT_CMD 	= 0.0;
		
		(*inst).STATUS 			= 0;
		return ;
	}		

////////////////////////////////////////
//		режим управлени¤ эжектором			
////////////////////////////////////////

	// ј¬“ќћј“
	if ( (*inst).IN_MODE == 0 )
	{
		// если режим не дистанционный, то автоматический
		if ( (*inst).OUT_MODE != DIST )
			(*inst).OUT_MODE = AUTO;				
	}
	
	// –”„Ќќ…
	else
		(*inst).OUT_MODE = MAN;

////////////////////////////////////////
//			состо¤ние эжектора			
////////////////////////////////////////
	
	// «јѕќћЌ»ћ ѕ–≈ƒџƒ”ў≈≈ —ќ—“ќяЌ»≈
	(*inst).OUT_LAST_STATE = (*inst).OUT_STATE;
	
	
	
	// ¬ Ћ.
	if ( (*inst).IN_ON == 1 )
		(*inst).OUT_STATE = ON; 
	
	
	
	// ¬џ Ћ.
	if ( (*inst).IN_OFF == 1 )
		(*inst).OUT_STATE = OFF;
	
	
	
	// ј¬ј–»я
	if ( (*inst).IN_FAULT == 1 )
	{
		(*inst).OUT_STATE = FAULT;
		(*inst).STATUS = 2;
	}
	
	
	
	// ј¬ј–»я (два состо¤ни¤)	
	if ( (*inst).IN_ON == 1 && (*inst).IN_OFF == 1 )
	{
		(*inst).OUT_STATE = FAULT;
		(*inst).STATUS = 3;
	}	
	
	
			
	// —ќ—“ќяЌ»≈ Ќ≈ »«¬≈—“Ќќ
	if ( (*inst).IN_ON == 0 && (*inst).IN_OFF == 0 && (*inst).IN_FAULT == 0 ) //&& (*inst).STATUS == 0
		(*inst).OUT_STATE = NONE;

////////////////////////////////////////
//			управление эжектором			
////////////////////////////////////////

	// ѕ–ќ¬≈– ј  ќћјЌƒџ ќѕ≈–ј“ќ–ј
	if ( (*inst).IN_CMD_OPERATOR != NONE )
	{
		(*inst).IN_CMD = (*inst).IN_CMD_OPERATOR;
		(*inst).IN_CMD_OPERATOR = NONE;
	}
	
	// ¬ Ћ.
	if ( (*inst).OUT_MODE != MAN && (*inst).IN_CMD == ON && (*inst).STATUS == 0 && (*inst).OUT_ON == 0 && ( (*inst).OUT_STATE == OFF || (*inst).OUT_STATE == NONE  ) )
	{
		(*inst).OUT_ON 	= 1;
		(*inst).OUT_OFF = 0;
		(*inst).OUT_CUR_PT_CMD = (*inst).CYCLE_TIME;
	}
	
	
	
	// ¬џ Ћ.
	if ( (*inst).OUT_MODE != MAN && (*inst).IN_CMD == OFF && (*inst).STATUS == 0 && (*inst).OUT_OFF == 0 && ( (*inst).OUT_STATE == ON || (*inst).OUT_STATE == NONE ) )
	{
		(*inst).OUT_ON 	= 0;
		(*inst).OUT_OFF = 1;
		(*inst).OUT_CUR_PT_CMD = (*inst).CYCLE_TIME;
	}
	
	
	
	// ¬ Ћ. ƒ»—“јЌ÷»ќЌЌџ… –≈∆»ћ ”ѕ–ј¬Ћ≈Ќ»я
	if ( (*inst).IN_CMD == DIST_ON && (*inst).OUT_MODE != MAN )
		(*inst).OUT_MODE = DIST;
	
	
	
	// ¬џ Ћ. ƒ»—“јЌ÷»ќЌЌџ… –≈∆»ћ ”ѕ–ј¬Ћ≈Ќ»я
	if ( (*inst).IN_CMD == DIST_OFF && (*inst).OUT_MODE != MAN )
		(*inst).OUT_MODE = AUTO;
	
	
	
	// —Ѕ–ќ— ј¬ј–»»
	if ( (*inst).IN_CMD == RESET )
	{
		(*inst).STATUS = 0;
		(*inst).OUT_LAST_CMD = (*inst).IN_CMD;
		(*inst).IN_CMD 	 = NONE;
	}
	
	
	
	// «јѕќћЌ»ћ » —Ѕ–ќ—»ћ  ќћјЌƒ”
	if ( (*inst).IN_CMD != NONE )
	{
		(*inst).OUT_LAST_CMD = (*inst).IN_CMD;
		(*inst).IN_CMD 	 = NONE;
	}
	
	
	
	// ќ“—„®“ ¬–≈ћ≈Ќ» Ќј ¬џѕќЋ≈Ќ≈Ќ»≈  ќћјЌƒџ
	if ( (*inst).OUT_CUR_PT_CMD != 0.0 )
	{
		// врем¤ ещЄ не вышло
		if ( (*inst).OUT_CUR_PT_CMD <= (*inst).IN_PT_CMD )
			(*inst).OUT_CUR_PT_CMD += (*inst).CYCLE_TIME;
		// врем¤ вышло
		else
		{
			// была команда на ¬ Ћ., но вентил¤тора не ¬ Ћ.
			if ( (*inst).OUT_LAST_CMD == ON )
			{
				if ( (*inst).OUT_STATE != ON )
				{
					(*inst).OUT_ON = 0;												// сбросим управление
					(*inst).OUT_CUR_PT_CMD = 0.0;									// обнулим врем¤					
					(*inst).STATUS = 4;												// выставим статус ошибки
				}				
			}
			
				
			// была команда на ¬џ Ћ., но носос не ¬џ Ћ.
			if ( (*inst).OUT_LAST_CMD == OFF )
			{
				if ( (*inst).OUT_STATE != OFF )
				{
					(*inst).OUT_OFF = 0;											// сбросим управление
					(*inst).OUT_CUR_PT_CMD = 0.0;									// обнулим врем¤					
					(*inst).STATUS = 5;												// выставим статус ошибки
				}				
			}
			
			
			// обнулим врем¤
			(*inst).OUT_CUR_PT_CMD = 0.0;
		}
	} // if ( (*inst).OUT_CUR_PT_CMD != 0.0 )
	
	
	
	// —Ѕ–ќ— ”ѕ–ј¬Ћ≈Ќ»я ѕ–» —ћ≈Ќ≈ —ќ—“ќяЌ»я
	if ( (*inst).OUT_STATE != (*inst).OUT_LAST_STATE )
	{
		if ( (*inst).OUT_LAST_STATE == ON )
			(*inst).OUT_ON = 0;
		
		if ( (*inst).OUT_LAST_STATE == OFF )
			(*inst).OUT_OFF = 0;
	}
	
	
				
////////////////////////////////////////
//			защиты эжектора			
////////////////////////////////////////


	
////////////////////////////////////////
//			блокировки эжектора			
////////////////////////////////////////



// обновим статус
(*inst).OUT_STATUS = (*inst).STATUS;
}