static void CommandChrono_task(long t) { RTIME fiveSeconds = nano2count(FIVE_SECONDS); unsigned long command; unsigned int buffered = 0; unsigned int C = 'C'; unsigned int R = 'R'; int ackn = 0; RT_TASK *get = (RT_TASK *)0, *put = (RT_TASK *)0, *task; Chronostatus = stoppedInitial; while (ackn != ('c' + 'd')) { task = rt_receive((RT_TASK *)0, &command); switch (command) { case 'd': get = task; ackn += command; break; case 'c': put = task; ackn += command; break; } } rt_return(put, command); rt_return(get, command); while(1) { cpu_used[hard_cpu_id()]++; switch (Chronostatus) { case stoppedInitial: if (buffered) { command = buffered; buffered = 0; } else { rt_receive(put, &command); } Chronostatus = running; break; case running: if (rt_receive_if(put, &command)) { if (command == 'E') { Chronostatus = stoppedFinal; } } else { command = C; } break; case stoppedFinal: Chronostatus = stoppedInitial; if (rt_receive_timed(put, &command, fiveSeconds) > 0) { buffered = command; } command = R; break; } rt_send(get, command); } }
pid_t rt_Creceive(pid_t pid, void *msg, size_t maxsize, size_t *msglen, RTIME delay) { RT_TASK *task; MSGCB *cb; task = pid ? pid2rttask(pid) : 0; if (delay) { task = rt_receive_timed(task, (unsigned int *)&cb, delay); } else { task = rt_receive_if(task, (unsigned int *)&cb); } if (task) { if ((pid = rttask2pid(task))) { *msglen = maxsize <= cb->sbytes ? maxsize : cb->sbytes; if (*msglen) { memcpy(msg, cb->sbuf, *msglen); } return pid; } return 0; } return 0; }