static void driver(int t)
{
	RT_TASK *thread[NTASKS];
	int i, l;
	unsigned int msg = 0;
	RTIME now;

	for (i = 1; i < NTASKS; i++) {
		thread[0] = rt_receive(0, &msg);
		thread[msg] = thread[0];
	}
	for (i = 1; i < NTASKS; i++) {
		rt_return(thread[i], i);
	}
	now = rt_get_time();
	rt_task_make_periodic(rt_whoami(), now + NTASKS*tick_period, tick_period);

	msg = 0;
	l = LOOPS;
	while(l--) {
		for (i = 1; i < NTASKS; i++) {
			cpu_used[hard_cpu_id()]++;
			if (i%2) {
				rt_rpc(thread[i], msg, &msg);
			} else {
				rt_send(thread[i], msg);
				msg = 1 - msg;
			}
			rt_task_wait_period();
		}
	}
	for (i = 1; i < NTASKS; i++) {
		rt_send(thread[i], END);
	}
}
Beispiel #2
0
void *thread_fun(void *arg)
{
 	funtask = rt_task_init_schmod(0xcaccb, 0, 0, 0, SCHED_FIFO, 0x1);
	rt_printk("FUN INIT\n");
	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

	if (!SNDBRCV) {
		rt_sleep(nano2count(100000000));
	}

	if (USE_RPC) {
		unsigned long msg;
		rt_printk("FUN RPC\n");
	        rt_rpc(maintask, 0, &msg);
	} else {
		rt_printk("FUN SEND\n");
        	rt_send(maintask, 0);
		rt_printk("FUN SUSP\n");
        	rt_task_suspend(funtask);
	}
	rt_printk("FUN DONE\n");

	rt_task_delete(funtask);
	rt_printk("FUN END\n");
	return 0;
}
Beispiel #3
0
void CommandChrono_Get(char *command)
{
	static RT_TASK *ackn = 0;
	unsigned int get = 'd';
	unsigned long msg;

	if (ackn != &Chrono) {
		ackn = rt_rpc(&Chrono, get, &msg);
	}
	rt_receive(&Chrono, &msg);
	*command = (char)msg;
}
Beispiel #4
0
static void *rt_BaseRate(void *args)
{
	char name[7];
	int i;
	static RTIME t0;


	for (i = 0; i < MAX_NTARGETS; i++) {
		sprintf(name,"BRT%d",i);
		if (!rt_get_adr(nam2num(name))) break;
	}
	if (!(rt_BaseRateTask = rt_task_init_schmod(nam2num(name), *((int *)args), 0, 0, SCHED_FIFO, CpuMap))) {
		fprintf(stderr,"Cannot init rt_BaseRateTask.\n");
		return (void *)1;
	}

	sem_post(&err_sem);

	iopl(3);
	rt_task_use_fpu(rt_BaseRateTask, 1);

	MXmain();
	grow_and_lock_stack(stackinc);
	if (UseHRT) {
		rt_make_hard_real_time();
	}

	rt_rpc(rt_MainTask, 0, (void *)name);
	t0 = rt_get_cpu_time_ns();
	rt_task_make_periodic(rt_BaseRateTask, rt_get_time() + rt_BaseRateTick, rt_BaseRateTick);
	while (!endBaseRate) {
#ifdef TASKDURATION
		RTTSKper=rt_get_cpu_time_ns()-RTTSKinit;
#endif
		WaitTimingEvent(TimingEventArg);

		if (endBaseRate) break;
		APPLICATION_Process_Event(TIME_EV);

		SIM_TIME = (rt_get_cpu_time_ns() - t0)*1.0E-9;
#ifdef TASKDURATION
		RTTSKinit=rt_get_cpu_time_ns();
#endif

	}
	if (UseHRT) {
		rt_make_soft_real_time();
	}

	rt_task_delete(rt_BaseRateTask);

	return 0;
}
Beispiel #5
0
void CommandClock_Get(char *command)
{
	static RT_TASK *ackn = 0;
	unsigned int get = 'b';
	unsigned long msg;

	if (ackn != rt_get_adr(nam2num("CLKTSK"))) {
		ackn = rt_rpc(rt_get_adr(nam2num("CLKTSK")), get, &msg);
	}
	rt_receive(rt_get_adr(nam2num("CLKTSK")), &msg);
	*command = (char)msg;
}
Beispiel #6
0
void Display_Get(MenageHmsh_tChain11 *chain, Display_tDest *receiver)
{
	static RT_TASK *ackn = 0;
	unsigned int get = 'g';
	unsigned long msg;

	if (ackn != &Display) {
		ackn = rt_rpc(&Display, get, &msg);
	}
	rt_receive(&Display, &msg);
	*chain = *((MenageHmsh_tChain11 *)msg);
	*receiver = chain->chain[0] == 't' ? destChrono : destClock; 
}
Beispiel #7
0
void Display_Get(MenageHmsh_tChain11 *chain, Display_tDest *receiver)
{
	static RT_TASK *ackn = 0;
	unsigned int get = 'g';
	unsigned long msg;

	if (ackn != rt_get_adr(nam2num("DSPTSK"))) {
		ackn = rt_rpc(rt_get_adr(nam2num("DSPTSK")), get, &msg);
	}
	rt_receive(rt_get_adr(nam2num("DSPTSK")), &msg);
	*chain = *((MenageHmsh_tChain11 *)msg);
	*receiver = chain->chain[0] == 't' ? destChrono : destClock;
}
Beispiel #8
0
void CommandChrono_Put(char command)
{
	static RT_TASK *ackn = 0;
	unsigned int put = 'c';
	unsigned long msg;

	if (ackn != &Chrono) {
		ackn = rt_rpc(&Chrono, put, &msg);
	}
	if ((Chronostatus == running) != (command == 'C')) {
		rt_send(&Chrono, (unsigned int)command);
	}
}
Beispiel #9
0
void CommandClock_Put(char command)
{
	static RT_TASK *ackn = 0;
	unsigned int put = 'a';
	unsigned long msg;

	if (ackn != rt_get_adr(nam2num("CLKTSK"))) {
		ackn = rt_rpc(rt_get_adr(nam2num("CLKTSK")), put, &msg);
	}
	if (((Clockstatus == running) == (command == 'T')) || command == 'F') {
		rt_send(rt_get_adr(nam2num("CLKTSK")), (unsigned int)command);
	}
}
static void fun(int t)
{
	unsigned int msg;
	rt_rpc(&thread[0], t, &msg);
	while(msg != END) {
		cpu_used[hard_cpu_id()]++;
		rt_receive(&thread[0], &msg);
		rt_leds_set_mask(1,msg);
		if (rt_isrpc(&thread[0])) {
			rt_return(&thread[0], 1 - msg);
		}
	}
	rt_leds_set_mask(1,0);
}
Beispiel #11
0
void Display_PutHour(MenageHmsh_tChain11 chain)
{
	static MenageHmsh_tChain11 hours;
	static RT_TASK *ackn = 0;
	unsigned int put = 'p';
	unsigned long msg;

	if (ackn != &Display) {
		ackn = rt_rpc(&Display, put, &msg);
	}
	hours = chain;
	hours.chain[0] = 'h';
	rt_send_if(&Display, (unsigned long)hours.chain);
}
Beispiel #12
0
void Display_PutHour(MenageHmsh_tChain11 chain)
{
	static MenageHmsh_tChain11 hours;
	static RT_TASK *ackn = 0;
	unsigned int put = 'p';
	unsigned long msg;

	if (ackn != rt_get_adr(nam2num("DSPTSK"))) {
		ackn = rt_rpc(rt_get_adr(nam2num("DSPTSK")), put, &msg);
	}
	hours = chain;
	hours.chain[0] = 'h';
	rt_send_if(rt_get_adr(nam2num("DSPTSK")), (unsigned long)hours.chain);
}
Beispiel #13
0
void Display_PutTimes(MenageHmsh_tChain11 chain)
{
	static MenageHmsh_tChain11 times;
	static RT_TASK *ackn = 0;
	unsigned int put = 'P';
	unsigned long msg;

	if (ackn != rt_get_adr(nam2num("DSPTSK"))) {
		ackn = rt_rpc(rt_get_adr(nam2num("DSPTSK")), put, &msg);
	}
	times = chain;
	times.chain[0] = 't';
	rt_send_if(rt_get_adr(nam2num("DSPTSK")), (unsigned long)times.chain);
}
Beispiel #14
0
void Display_PutTimes(MenageHmsh_tChain11 chain)
{
	static MenageHmsh_tChain11 times;
	static RT_TASK *ackn = 0;
	unsigned int put = 'P';
	unsigned long msg;

	if (ackn != &Display) {
		ackn = rt_rpc(&Display, put, &msg);
	}
	times = chain;
	times.chain[0] = 't';
	rt_send_if(&Display, (unsigned long)times.chain);
}
Beispiel #15
0
static void sched_task(long t) {
	int i, k;
	unsigned long msg;

	change = 0;
	t = rdtsc();
	for (i = 0; i < loops; i++) {
		for (k = 0; k < ntasks; k++) {
			rt_task_resume(thread + k);
		}
	}
	t = rdtsc() - t;
	rt_printk("\n\nFOR %d TASKS: ", ntasks);
	rt_printk("TIME %d (ms), SUSP/RES SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 2*ntasks*loops);
	rt_printk("SWITCH TIME%s %d (ns)\n", use_fpu ? " (INCLUDING FULL FP SUPPORT)":"",
	       (int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*ntasks*loops));

	change = 1;
	for (k = 0; k < ntasks; k++) {
		rt_task_resume(thread + k);
	}
	t = rdtsc();
	for (i = 0; i < loops; i++) {
		for (k = 0; k < ntasks; k++) {
			rt_sem_signal(&sem);
		}
	}
	t = rdtsc() - t;
	rt_printk("\nFOR %d TASKS: ", ntasks);
	rt_printk("TIME %d (ms), SEM SIG/WAIT SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 2*ntasks*loops);
	rt_printk("SWITCH TIME%s %d (ns)\n", use_fpu ? " (INCLUDING FULL FP SUPPORT)":"",
	       (int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*ntasks*loops));

	change = 2;
	for (k = 0; k < ntasks; k++) {
		rt_sem_signal(&sem);
	}
	t = rdtsc();
	for (i = 0; i < loops; i++) {
		for (k = 0; k < ntasks; k++) {
			rt_rpc(thread + k, 0, &msg);
		}
	}
	t = rdtsc() - t;
	rt_printk("\nFOR %d TASKS: ", ntasks);
	rt_printk("TIME %d (ms), RPC/RCV-RET SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 2*ntasks*loops);
	rt_printk("SWITCH TIME%s %d (ns)\n\n", use_fpu ? " (INCLUDING FULL FP SUPPORT)":"",
	       (int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*ntasks*loops));
}
Beispiel #16
0
int main(void)
{
	pthread_t thread;
	unsigned int player, cnt;
	unsigned long msg;
	RT_TASK *mytask;
	MBX *mbx;
	char data[BUFSIZE];

	signal(SIGINT, endme);
	rt_allow_nonroot_hrt();

	if ((player = open("../../../share/linux.au", O_RDONLY)) < 0) {
		printf("ERROR OPENING SOUND FILE (linux.au)\n");
		exit(1);
	}
 	if (!(mytask = rt_task_init(nam2num("SNDMAS"), 2, 0, 0))) {
		printf("CANNOT INIT MASTER TASK\n");
		exit(1);
	}
	mlockall(MCL_CURRENT | MCL_FUTURE);
	printf("\nINIT MASTER TASK %p\n\n(CTRL-C TO END EVERYTHING)\n", mytask);

	mbx = rt_typed_named_mbx_init("SNDMBX", 2000, FIFO_Q);
	rt_set_oneshot_mode();
	start_rt_timer(0);
	thread = rt_thread_create(intr_handler, NULL, 10000);
	rt_mbx_receive(mbx, &data, 1);

	while (!end) {	
		lseek(player, 0, SEEK_SET);
		while(!end && (cnt = read(player, &data, BUFSIZE)) > 0) {
			rt_mbx_send(mbx, data, cnt);
		}
	}

	rt_rpc(rt_get_adr(nam2num("SOUND")), msg, &msg); 
	while (rt_get_adr(nam2num("SOUND"))) {
		rt_sleep(nano2count(1000000));
	}
	rt_task_delete(mytask);
	rt_mbx_delete(mbx);
	stop_rt_timer();
	close(player);
	printf("\nEND MASTER TASK %p\n", mytask);
	rt_thread_join(thread);
	return 0;
}
int main(void)
{
	RT_TASK *receiving_task;
	RT_TASK *agentask;
	int i, *shm;
	unsigned int msg, chksum;

	struct sched_param mysched;

	mysched.sched_priority = 99;

	if( sched_setscheduler( 0, SCHED_FIFO, &mysched ) == -1 ) {
	puts(" ERROR IN SETTING THE SCHEDULER UP");
	perror( "errno" );
	exit( 0 );
 	}       

	mlockall(MCL_CURRENT | MCL_FUTURE);

	receiving_task = rt_task_init(nam2num("RTSK"), 0, 0, 0);
	agentask = rt_get_adr(nam2num("ATSK"));
	shm = rtai_malloc(nam2num("MEM"), 1);
	while(1) {
		printf("RECEIVING TASK RPCS TO AGENT TASK %x\n", 0xaaaaaaaa);
		rt_rpc(agentask, 0xaaaaaaaa, &msg);
		printf("AGENT TASK RETURNED %x\n", msg);
		if (msg != 0xeeeeeeee) {
			chksum = 0;
			for (i = 1; i <= shm[0]; i++) {
				chksum += shm[i];
			}
			printf("RECEIVING TASK: CHECKSUM = %x\n", chksum);
			if (chksum != shm[shm[0] + 1]) {
				printf("RECEIVING TASK: WRONG SHMEM CHECKSUM\n");
			}
			printf("RECEIVING TASK SENDS TO AGENT TASK %x\n", 0xaaaaaaaa);
			rt_send(agentask, 0xaaaaaaaa);
		} else {
			printf("RECEIVING TASK DELETES ITSELF\n");
			rt_task_delete(receiving_task);
			printf("END RECEIVING TASK\n");
			exit(1);

		}
	}
	return 0;
}
Beispiel #18
0
int rt_Send(pid_t pid, void *smsg, void *rmsg, size_t ssize, size_t rsize)
{
	RT_TASK *task, *replier;
	MSGCB cb;
	unsigned int replylen;

	if ((task = pid2rttask(pid))) {
		cb.cmd    = SYNCMSG;
		cb.sbuf   = smsg;
		cb.sbytes = ssize; 
		cb.rbuf   = rmsg;
		cb.rbytes = rsize;
		if (!(replier = rt_rpc(task, (unsigned int)&cb, &replylen))) {
			return -EINVAL;
		} else if (replier != task) {
			return -ESRCH;
		}
		return replylen ;
	}
	return -ESRCH;
}
Beispiel #19
0
// What a proxy agent is supposed to do for synchronous IPC.
static void Proxy_Task(RT_TASK *me)
{
        struct proxy_t *my;
	MSGCB cb;
        unsigned int replylen;

        my = (struct proxy_t *)me->stack_bottom;
	cb.cmd    = PROXY;
	cb.sbuf   = my->msg;
	cb.sbytes = my->nbytes;
	cb.rbuf   = &replylen;
	cb.rbytes = sizeof(replylen);

        while(1) {
		while (my->nmsgs) {
			atomic_dec((atomic_t *)&my->nmsgs);
                        rt_rpc(my->receiver, (unsigned int)(&cb), &replylen);
		}
		rt_task_suspend(me);
        }
}
Beispiel #20
0
int main(void)
{
	fd_set input;
	struct timeval tv;
	unsigned int msg, ch;
	MBX *mbx;
	struct sample { long long min; long long max; int index; double s; int ts; } samp;

	tv.tv_sec = 0;

 	if (!(task = rt_task_init(nam2num("LATCHK"), 20, 0, 0))) {
		printf("CANNOT INIT MASTER TASK\n");
		exit(1);
	}

 	if (!(mbx = rt_get_adr(nam2num("LATMBX")))) {
		printf("CANNOT FIND MAILBOX\n");
		exit(1);
	}

	while (1) {
		rt_mbx_receive(mbx, &samp, sizeof(samp));
		printf("*** min: %d, max: %d average: %d, dot %f ts %d (ent ends check, a/ent both) ***\n", (int) samp.min, (int) samp.max, samp.index, samp.s, samp.ts);
		FD_ZERO(&input);
		FD_SET(0, &input);
		tv.tv_usec = 20000;
	        if (select(1, &input, NULL, NULL, &tv)) {
			ch = getchar();
			break;
		}
	}

	if (ch == 'a') {
		rt_rpc(rt_get_adr(nam2num("LATCAL")), msg, &msg);
	}
	rt_task_delete(task);
	exit(0);
}
Beispiel #21
0
int main(int argc, char* argv[])
{
	unsigned long mtsk_name = nam2num("MTSK");
	unsigned long btsk_name = nam2num("BTSK");
	unsigned long sem_name  = nam2num("SEM");
	unsigned long smbx_name  = nam2num("SMBX");
	unsigned long rmbx_name  = nam2num("RMBX");
	unsigned long msg;

	long long mbx_msg;
	long long llmsg = 0xaaaaaaaaaaaaaaaaLL;

	RT_TASK *mtsk, *rcvd_from;
	SEM *sem;
	MBX *smbx, *rmbx;
	int pid, count;

 	if (!(mtsk = rt_task_init_schmod(mtsk_name, 0, 0, 0, SCHED_FIFO, 0x1))) {
		printf("CANNOT INIT MASTER TASK\n");
		exit(1);
	}
	printf("MASTER TASK INIT: name = %lx, address = %p.\n", mtsk_name, mtsk);

	printf("MASTER TASK STARTS THE ONESHOT TIMER\n");
	rt_set_oneshot_mode();
	start_rt_timer(nano2count(10000000));
	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();
	rt_sleep(1000000);


	printf("MASTER TASK MAKES ITSELF PERIODIC WITH A PERIOD OF 1 ms\n");
	rt_task_make_periodic(mtsk, rt_get_time(), nano2count(PERIOD));
	rt_sleep(nano2count(1000000000));

	count = PERIODIC_LOOPS;
	printf("MASTER TASK LOOPS ON WAIT_PERIOD FOR %d PERIODS\n", count);
	while(count--) {
		printf("PERIOD %d\n", count);
		rt_task_wait_period();
	}

	count = SLEEP_LOOPS;
	printf("MASTER TASK LOOPS ON SLEEP 0.1 s FOR %d PERIODS\n", count);
	while(count--) {
		printf("SLEEPING %d\n", count);
		rt_sleep(nano2count(DELAY));
	}
	printf("MASTER TASK YIELDS ITSELF\n");
	rt_task_yield();

	printf("MASTER TASK CREATES BUDDY TASK\n");
	pid = fork();
	if (!pid) {
		execl("./slave", "./slave", NULL);
	}

	printf("MASTER TASK SUSPENDS ITSELF, TO BE RESUMED BY BUDDY TASK\n");
	rt_task_suspend(mtsk);
	printf("MASTER TASK RESUMED BY BUDDY TASK\n");

 	if (!(sem = rt_sem_init(sem_name, 0))) {
		printf("CANNOT CREATE SEMAPHORE %lx\n", sem_name);
		exit(1);
	}
	printf("MASTER TASK CREATES SEM: name = %lx, address = %p.\n", sem_name, sem);

	printf("MASTER TASK WAIT_IF ON SEM\n");
	rt_sem_wait_if(sem);

	printf("MASTER STEP BLOCKS WAITING ON SEM\n");
	rt_sem_wait(sem);

	printf("MASTER TASK SIGNALLED BY BUDDY TASK WAKES UP AND BLOCKS WAIT TIMED 1 s ON SEM\n");
	rt_sem_wait_timed(sem, nano2count(1000000000));

	printf("MASTER TASK DELETES SEM\n");
	rt_sem_delete(sem);

	printf("MASTER TASK BLOCKS RECEIVING FROM ANY\n");
	rcvd_from = rt_receive(0, (void *)&msg);
	printf("MASTER TASK RECEIVED MESSAGE %lx FROM BUDDY TASK\n", msg);

	printf("MASTER TASK RPCS TO BUDDY TASK THE MESSAGE %lx\n", 0xabcdefL);
	rcvd_from = rt_rpc(rcvd_from, 0xabcdef, (void *)&msg);
	printf("MASTER TASK RECEIVED THE MESSAGE %lx RETURNED BY BUDDY TASK\n", msg);
//exit(1);
 	if (!(smbx = rt_mbx_init(smbx_name, 1))) {
		printf("CANNOT CREATE MAILBOX %lx\n", smbx_name);
		exit(1);
	}
 	if (!(rmbx = rt_mbx_init(rmbx_name, 1))) {
		printf("CANNOT CREATE MAILBOX %lx\n", rmbx_name);
		exit(1);
	}
	printf("MASTER TASK CREATED TWO MAILBOXES %p %p %p %p \n", smbx, rmbx, &mtsk_name, &msg);

	count = MBX_LOOPS;
	while(count--) {
		rt_mbx_send(smbx, &llmsg, sizeof(llmsg));
		printf("%d MASTER TASK SENDS THE MESSAGE %llx MBX\n", count, llmsg);
		mbx_msg = 0;
		rt_mbx_receive_timed(rmbx, &mbx_msg, sizeof(mbx_msg), nano2count(MSG_DELAY));
		printf("%d MASTER TASK RECEIVED THE MESSAGE %llx FROM MBX\n", count, mbx_msg);
		rt_sleep(nano2count(DELAY));
	}

	printf("MASTER TASK SENDS THE MESSAGE %lx TO BUDDY TO ALLOW ITS END\n", 0xeeeeeeeeL);
	rt_send(rcvd_from, 0xeeeeeeee);

	printf("MASTER TASK WAITS FOR BUDDY TASK END\n");
	while (rt_get_adr(btsk_name)) {
		rt_sleep(nano2count(1000000000));
	}
	printf("MASTER TASK STOPS THE PERIODIC TIMER\n");
	stop_rt_timer();

	printf("MASTER TASK DELETES MAILBOX %p\n", smbx);
	rt_mbx_delete(smbx);
	printf("MASTER TASK DELETES MAILBOX %p\n", rmbx);
	rt_mbx_delete(rmbx);

	printf("MASTER TASK DELETES ITSELF\n");
	rt_task_delete(mtsk);

	printf("END MASTER TASK\n");

	return 0;
}
Beispiel #22
0
int main(void)
{
	RTIME tsr, tss, tsm, trpc;
	RT_TASK *mainbuddy;
	int i, k, s;
	unsigned long msg;

	printf("\n\nWait for it ...\n");
	if (!(mainbuddy = rt_thread_init(nam2num("MASTER"), 1000, 0, SCHED_FIFO, 0x1))) {
		printf("CANNOT INIT TASK %lu\n", nam2num("MASTER"));
		exit(1);
	}

	sem = rt_sem_init(nam2num("SEMAPH"), 1);
	change =  0;

	for (i = 0; i < NR_RT_TASKS; i++) {
		indx[i] = i;
		if (!(thread[i] = rt_thread_create(thread_fun, indx + i, 0))) {
			printf("ERROR IN CREATING THREAD %d\n", indx[i]);
			exit(1);
 		}
 	}

	do {
		msleep(50);
		s = 0;
		for (i = 0; i < NR_RT_TASKS; i++) {
			s += hrt[i];
		}
	} while (s != NR_RT_TASKS);
	mlockall(MCL_CURRENT | MCL_FUTURE);

	rt_make_hard_real_time();
	tsr = rt_get_cpu_time_ns();
	for (i = 0; i < LOOPS; i++) {
		for (k = 0; k < NR_RT_TASKS; k++) {
			rt_task_resume(mytask[k]);
		}
	}
	tsr = rt_get_cpu_time_ns() - tsr;

	change = 1;

	for (k = 0; k < NR_RT_TASKS; k++) {
		rt_task_resume(mytask[k]);
	}

	tss = rt_get_cpu_time_ns();
	for (i = 0; i < LOOPS; i++) {
		for (k = 0; k < NR_RT_TASKS; k++) {
			rt_sem_signal(sem);
		}
	}
	tss = rt_get_cpu_time_ns() - tss;

	change = 2;

	for (k = 0; k < NR_RT_TASKS; k++) {
		rt_sem_signal(sem);
	}

	tsm = rt_get_cpu_time_ns();
	for (i = 0; i < LOOPS; i++) {
		for (k = 0; k < NR_RT_TASKS; k++) {
			rt_send(mytask[k], 0);
		}
	}
	tsm = rt_get_cpu_time_ns() - tsm;

	change = 3;

	for (k = 0; k < NR_RT_TASKS; k++) {
		rt_send(mytask[k], 0);
	}

	trpc = rt_get_cpu_time_ns();
	for (i = 0; i < LOOPS; i++) {
		for (k = 0; k < NR_RT_TASKS; k++) {
			rt_rpc(mytask[k], 0, &msg);
		}
	}
	trpc = rt_get_cpu_time_ns() - trpc;

	rt_make_soft_real_time();

	printf("\n\nFOR %d TASKS: ", NR_RT_TASKS);
	printf("TIME %d (ms), SUSP/RES SWITCHES %d, ", (int)(tsr/1000000), 2*NR_RT_TASKS*LOOPS);
	printf("SWITCH TIME %d (ns)\n", (int)(tsr/(2*NR_RT_TASKS*LOOPS)));

	printf("\nFOR %d TASKS: ", NR_RT_TASKS);
	printf("TIME %d (ms), SEM SIG/WAIT SWITCHES %d, ", (int)(tss/1000000), 2*NR_RT_TASKS*LOOPS);
	printf("SWITCH TIME %d (ns)\n", (int)(tss/(2*NR_RT_TASKS*LOOPS)));

	printf("\nFOR %d TASKS: ", NR_RT_TASKS);
	printf("TIME %d (ms), SEND/RCV SWITCHES %d, ", (int)(tsm/1000000), 2*NR_RT_TASKS*LOOPS);
	printf("SWITCH TIME %d (ns)\n", (int)(tsm/(2*NR_RT_TASKS*LOOPS)));

	printf("\nFOR %d TASKS: ", NR_RT_TASKS);
	printf("TIME %d (ms), RPC/RCV-RET SWITCHES %d, ", (int)(tsm/1000000), 2*NR_RT_TASKS*LOOPS);
	printf("SWITCH TIME %d (ns)\n\n", (int)(trpc/(2*NR_RT_TASKS*LOOPS)));

	fflush(stdout);

	end = 1;
	for (i = 0; i < NR_RT_TASKS; i++) {
		rt_rpc(mytask[i], 0, &msg);
	}
	do {
		msleep(50);
		s = 0;
		for (i = 0; i < NR_RT_TASKS; i++) {
			s += hrt[i];
		}
	} while (s);

	rt_sem_delete(sem);
	rt_task_delete(mainbuddy);
	for (i = 0; i < NR_RT_TASKS; i++) {
		rt_thread_join(thread[i]);
	}

	return 0;
}