Beispiel #1
0
int main(int argc, char *argv[])
{
	unsigned int plrnode, plrport;
	RT_TASK *spktsk, *plrtsk;
	RTIME period;
	struct sockaddr_in addr;
	char buf[BUFSIZE], data, temp;
	unsigned int msg;
	long i, len;

	printf("\n\nSPECIFIC RECEIVE DIRECTLY ON REMOTE TASK\n");
	ioperm(PORT_ADR, 1, 1);
	if (!(spktsk = rt_task_init_schmod(nam2num("SPKTSK"), 1, 0, 0, SCHED_FIFO, 0xF))) {
		printf("CANNOT INIT SPEAKER TASK\n");
		exit(1);
	}

	rt_returnx(rt_receivex(0, &msg, sizeof(int), &len), &msg, 1);
	plrnode = 0;
	if (argc == 2 && strstr(argv[1], "PlrNode=")) {
		inet_aton(argv[1] + 8, &addr.sin_addr);
		plrnode = addr.sin_addr.s_addr;
	}
	if (!plrnode) {
		inet_aton("127.0.0.1", &addr.sin_addr);
		plrnode = addr.sin_addr.s_addr;
	}

	rt_set_oneshot_mode();
	start_rt_timer(0);
	while ((plrport = rt_request_port(plrnode)) <= 0 && plrport != -EINVAL);
	while (!(plrtsk = RT_get_adr(plrnode, plrport, "PLRTSK"))) {
		rt_sleep(nano2count(10000000));
	}

	printf("\nSPEAKER TASK RUNNING\n");

	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

	period = nano2count(PERIOD);
	rt_task_make_periodic(spktsk, rt_get_time() + 5*period, period);

	for (i = 0; i < 100; i++) {
		RT_returnx(plrnode, plrport, RT_receivex(plrnode, plrport, plrtsk, &msg, sizeof(int), &len), &msg, sizeof(int));
	}

	len = 0;
	while(1) {
		if (len) {
			data = filter(buf[i++]);
			temp = inb(PORT_ADR);
			temp &= 0xfd;
			temp |= (data & 1) << 1;
			outb(temp, PORT_ADR);
			len--;
		} else {
			if (RT_evdrpx(plrnode, plrport, plrtsk, buf, BUFSIZE, &i)) {
//				rt_printk("EVDRP %d\n", i);
			}
			if (RT_receivex_if(plrnode, plrport, plrtsk, buf, BUFSIZE, &len) == plrtsk) {
				RT_returnx(plrnode, plrport, plrtsk, &len, sizeof(int));
				if (len == sizeof(int) && ((int *)buf)[0] == 0xFFFFFFFF) {
					break;
				}
				i = 0;
			}
		}
		rt_task_wait_period();
	}

	rt_sleep(nano2count(100000000));
	rt_make_soft_real_time();
	stop_rt_timer();
	rt_release_port(plrnode, plrport);
	rt_task_delete(spktsk);
	printf("\nSPEAKER TASK STOPS\n");
	return 0;
}
Beispiel #2
0
static void *start_task_code(void *args)
{
	int i, srvport;
	char buf[9];
        RT_TASK *task;

	buf[8] = 0;
	if (!(task = rt_thread_init(getpid(), 10, 0, SCHED_FIFO, 0xF))) {
                printf("CANNOT INIT START_TASK BUDDY\n");
                exit(1);
        }

	srvport = rt_request_port(comnode);
printf("START TASK GOT ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport);
        mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

	RT_SEM_SIGNAL(comnode, -srvport, sems[0]);
	for (i = 0; i < NUM_TASKS; ++i) {
		RT_sem_wait(comnode, srvport, sync_sem);
	}
	TAKE_PRINT;
	rt_printk(sync_str);
	GIVE_PRINT;
	for (i = 0; i < NUM_TASKS; ++i) {
		RT_SEM_SIGNAL(comnode, -srvport, prio_sem);
	}
	TAKE_PRINT;
	rt_printk("\n");
	GIVE_PRINT;
	for (i = 0; i < NUM_TASKS; ++i) {
		RT_sem_wait(comnode, srvport, sync_sem);
	}
	TAKE_PRINT;
	rt_printk(sync_str);
	GIVE_PRINT;

	TAKE_PRINT;
	rt_printk("testing message queues\n");
	GIVE_PRINT;
	for (i = 0; i < NUM_TASKS; ++i) {
		if (RT_mbx_send(comnode, srvport, mbx_in, strs[i], 8)) {
			TAKE_PRINT;
			rt_printk("RT_mbx_send() failed\n");
			GIVE_PRINT;
		}
	}
	for (i = 0; i < NUM_TASKS; ++i) {
		RT_mbx_receive(comnode, srvport, mbx_out, buf, 8);
		TAKE_PRINT;
		rt_printk("\nreceived from mbx_out: %s", buf);
		GIVE_PRINT;
	}
	TAKE_PRINT;
	rt_printk("\n");
	GIVE_PRINT;
	for (i = 0; i < NUM_TASKS; ++i) {
		RT_SEM_SIGNAL(comnode, -srvport, sync_sem);
	}
	TAKE_PRINT;
	rt_printk("\ninit task complete\n");
	GIVE_PRINT;
	rt_make_soft_real_time();
printf("START TASK REL ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport);
        RT_sem_signal(comnode, srvport, end_sem);
	rt_release_port(comnode, srvport);
	rt_task_delete(task);
	return (void *)0;
}
Beispiel #3
0
static void *task_code(void *arg)
{
	RT_TASK *mytask;
	int task_no, i, ret, srvport;
	char buf[9];

	task_no = *((int *)arg);
	buf[8] = 0;
        if (!(mytask = rt_thread_init(nam2num(task[task_no]), NUM_TASKS - task_no, 0, SCHED_FIFO, 0xF))) {
                printf("CANNOT INIT TASK TASK %d\n", task_no);
                exit(1);
        }
	srvport = rt_request_port(comnode);
printf("TASK_NO %d GOT ITS EXEC COMNODE PORT %lx, %d\n", task_no, comnode, srvport);
	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

	for (i = 0; i < 5; ++i)	{
		RT_sem_wait(comnode, srvport, sems[task_no]);
		TAKE_PRINT; 
		rt_printk(strs[task_no]);
		GIVE_PRINT;
		if (task_no == NUM_TASKS - 1) {
			TAKE_PRINT; 
			rt_printk("\n");
			GIVE_PRINT;
		}
		RT_SEM_SIGNAL(comnode, -srvport, sems[(task_no + 1)%NUM_TASKS]);
	}
	RT_SEM_SIGNAL(comnode, -srvport, sync_sem);
	RT_sem_wait(comnode, srvport, prio_sem);
	TAKE_PRINT; 
	rt_printk(strs[task_no]);
	GIVE_PRINT;
	RT_sleep(comnode, srvport, 1000000000LL);
	RT_sem_wait_timed(comnode, srvport, prio_sem, (task_no + 1)*1000000000LL);
	TAKE_PRINT; 
	rt_printk("sem timeout, task %d, %s\n", task_no, strs[task_no]);
	GIVE_PRINT;
	RT_SEM_SIGNAL(comnode, -srvport, sync_sem);

/* message queue stuff */
	if ((ret = RT_mbx_receive(comnode, srvport, mbx_in, buf, 8)) != 0) {
		TAKE_PRINT; 
		rt_printk("RT_mbx_receive() failed with %d\n", ret);
		GIVE_PRINT;
	}
	TAKE_PRINT; 
	rt_printk("\nreceived by task %d ", task_no);
	rt_printk(buf); 
	GIVE_PRINT;
	RT_mbx_send(comnode, srvport, mbx_out, strs[task_no], 8);
/* test receive timeout */
	RT_sem_wait(comnode, srvport, sync_sem);
	if (RT_mbx_receive_timed(comnode, srvport, mbx_in, buf, 8, (task_no + 1)*1000000000LL)) {
		TAKE_PRINT;
		rt_printk("mbx timeout, task %d, %s\n", task_no, strs[task_no]);
		GIVE_PRINT;
	}
	TAKE_PRINT; 
	rt_printk("\ntask %d complete\n", task_no); 
	GIVE_PRINT;
	rt_make_soft_real_time();
printf("TASK_NO %d REL ITS EXEC COMNODE PORT %lx, %d\n", task_no, comnode, srvport);
	RT_sem_signal(comnode, srvport, end_sem);
	rt_release_port(comnode, srvport);
	rt_task_delete(mytask);
	return (void *)0;
}
Beispiel #4
0
int main(int argc, char *argv[])
{
	MBX *mbx;
	SEM *sem;
	RT_TASK *task;
	RTIME t0, t;
	int i, count, jit, maxj, test_time, hdlnode, hdlport;
	struct sockaddr_in addr;
	unsigned long run;
	char c;

 	if (!(task = rt_task_init_schmod(nam2num("PRCTSK"), 1, 0, 0, SCHED_FIFO, TASK_CPU))) {
		printf("CANNOT INIT PROCESS TASK\n");
		exit(1);
	}

        hdlnode = 0;
        if (argc == 2 && strstr(argv[1], "HdlNode=")) {
                inet_aton(argv[1] + 8, &addr.sin_addr);
                hdlnode = addr.sin_addr.s_addr;
        }
        if (!hdlnode) {
                inet_aton("127.0.0.1", &addr.sin_addr);
                hdlnode = addr.sin_addr.s_addr;
        }
	while ((hdlport = rt_request_port(hdlnode)) <= 0 && hdlport != -EINVAL);
	mbx = RT_get_adr(hdlnode, hdlport, "HDLMBX");
        sem = rt_sem_init(nam2num("PRCSEM"), 0);

	printf("USE: SEM SEND/WAIT (s), TASK RESM/SUSP (r), INTERTASK MSG (m): [s|r|m]? ");
	scanf("%c", &c);
	switch (c) {
		case 'r': printf("TESTING TASK SUSPEND/RESUME TIME (s): ");
			  run = 2;
			  break;
		case 'm': printf("TESTING INTERTASK SEND/RECEIVE TIME (s): ");
			  run = 3;
			  break;
		default:  printf("TESTING SEMAPHORE WAIT/SEND TIME (s): ");
			  run = 1;
			  break;
	}
	scanf("%d", &test_time);
	printf("... WAIT FOR %d SECONDS (RUNNING AT %d hz).\n", test_time, 1000000000/PERIOD);
	mlockall(MCL_CURRENT | MCL_FUTURE);
	rt_make_hard_real_time();

        RT_mbx_send(hdlnode, hdlport, mbx, &task, sizeof(task));
        RT_mbx_send(hdlnode, hdlport, mbx, &sem, sizeof(sem));
        RT_mbx_send(hdlnode, hdlport, mbx, &run, sizeof(run));

	count = maxj = 0;
	t0 = rt_get_cpu_time_ns();
	while(++count <= test_time*(1000000000/(PERIOD*100))) {
		for (i = 0; i < 100; i++) {
			t = rt_get_cpu_time_ns();
			if ((jit = t - t0 - PERIOD) < 0) {
				jit = -jit;
			}
			if (count > 1 && jit > maxj) {
				maxj = jit;
			}
			t0 = t;
			switch (run) {
				case 1: rt_sem_wait(sem);
					break;
				case 2: rt_task_suspend(task);
					break;
				case 3: rt_receive(0, &run);
					break;
			}
		}
	}

	run = 0;
        RT_mbx_send(hdlnode, hdlport, mbx, &run, sizeof(run));
	rt_make_soft_real_time();
	rt_release_port(hdlnode, hdlport);
	rt_task_delete(task);
	printf("***** MAX JITTER %3d (us) *****\n", (maxj + 499)/1000);
	exit(0);
}