int main(int argc, char *argv[]) { unsigned int player, msg, spknode, spkport, i; RT_TASK *plrtsk, *spktsk; struct sockaddr_in addr; MBX *mbx; char data[BUFSIZE]; thread = rt_thread_create(endme, NULL, 2000); if ((player = open("../../../share/linux.au", O_RDONLY)) < 0) { printf("ERROR OPENING SOUND FILE (linux.au)\n"); exit(1); } if (!(plrtsk = rt_task_init_schmod(nam2num("PLRTSK"), 2, 0, 0, SCHED_FIFO, 0xF))) { printf("CANNOT INIT PLAYER TASK\n"); exit(1); } spknode = 0; if (argc == 2 && strstr(argv[1], "SpkNode=")) { inet_aton(argv[1] + 8, &addr.sin_addr); spknode = addr.sin_addr.s_addr; } if (!spknode) { inet_aton("127.0.0.1", &addr.sin_addr); spknode = addr.sin_addr.s_addr; } while ((spkport = rt_request_port(spknode)) <= 0 && spkport != -EINVAL); spktsk = RT_get_adr(spknode, spkport, "SPKTSK"); mbx = RT_get_adr(spknode, spkport, "SNDMBX"); for (i = 0; i < 100; i++) { RT_rpc(spknode, spkport, spktsk, msg, &msg); } mlockall(MCL_CURRENT | MCL_FUTURE); printf("\nPLAYER TASK RUNNING\n\n(TYPE ENTER TO END EVERYTHING)\n"); while (!end) { lseek(player, 0, SEEK_SET); while(!end && (msg = read(player, data, BUFSIZE)) > 0) { RT_mbx_send(spknode, spkport, mbx, data, msg); } } RT_rpc(spknode, spkport, spktsk, msg, &msg); rt_release_port(spknode, spkport); rt_task_delete(plrtsk); close(player); printf("\nPLAYER TASK STOPS\n"); return 0; }
static void start_task_code(long none) { int i, srvport; char buf[9]; while ((srvport = rt_request_port(tasknode)) <= 0); rt_printk("START TASK GOT SYNC TASKNODE PORT %lx, %d\n", tasknode, srvport); while (!RT_get_adr(tasknode, srvport, task[NUM_TASKS - 1])); rt_printk("START TASK REL SYNC TASKNODE PORT %lx, %d\n", tasknode, srvport); rt_release_port(tasknode, srvport); srvport = rt_request_port(comnode); rt_printk("START TASK GOT ITS INIT AND EXEC COMNODE PORT %lx, %d\n", comnode, srvport); print_sem = RT_get_adr(comnode, srvport, "PRTSEM"); sync_sem = RT_get_adr(comnode, srvport, "SYNCSM"); prio_sem = RT_get_adr(comnode, srvport, "PRIOSM"); mbx_in = RT_get_adr(comnode, srvport, "MBXIN"); mbx_out = RT_get_adr(comnode, srvport, "MBXOUT"); for (i = 0; i < NUM_TASKS; ++i) { sems[i] = RT_get_adr(comnode, srvport, sem[i]); } buf[8] = 0; 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_release_port(comnode, srvport); rt_printk("START TASK REL ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport); atomic_inc(&cleanup); }
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; }
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_hard_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; printf("START TASK REL ITS EXEC COMNODE PORT %lx, %d\n", comnode, srvport); RT_sem_signal(comnode, srvport, end_sem); rt_make_soft_real_time(); rt_release_port(comnode, srvport); rt_task_delete(task); return (void *)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); }