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; }
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; }