For review: This patch folds the rt-threads of rtcanrecv/send into the main thread, assigns unique thread names, and lowers the priorities to some less critical level. Furthermore, rtcanrecv is enhanced by a printout of the CAN device and support for listening on all interfaces. On reception of RTR frames, no more data is printing now. I also kicked out the rt_timer_set_mode call, please speak up if it was there for a reason.
Jan
Index: src/utils/can/rtcansend.c =================================================================== --- src/utils/can/rtcansend.c (Revision 1525) +++ src/utils/can/rtcansend.c (Arbeitskopie) @@ -69,7 +69,7 @@ void cleanup_and_exit(int sig) exit(0); } -void rt_task(void *arg) +void rt_task(void) { int i, j, ret; @@ -107,7 +107,6 @@ void rt_task(void *arg) printf("\n"); } } - loops = 0; } int main(int argc, char **argv) @@ -115,6 +114,7 @@ int main(int argc, char **argv) struct sockaddr_can addr; int i, opt, ret; struct ifreq ifr; + char name[32]; struct option long_options[] = { { "help", no_argument, 0, 'h' }, @@ -252,16 +252,14 @@ int main(int argc, char **argv) } } - rt_timer_set_mode(TM_ONESHOT); - - ret = rt_task_spawn(&rt_task_desc, "", 0, 99, 0, &rt_task, 0); + snprintf(name, sizeof(name), "rtcansend-%d", getpid()); + ret = rt_task_shadow(&rt_task_desc, name, 1, 0); if (ret) { - fprintf(stderr, "rt_task_spawn: %s\n", strerror(-ret)); + fprintf(stderr, "rt_task_shadow: %s\n", strerror(-ret)); goto failure; } - while (loops) - usleep(100000); + rt_task(); cleanup(); return 0; Index: src/utils/can/rtcanrecv.c =================================================================== --- src/utils/can/rtcanrecv.c (Revision 1525) +++ src/utils/can/rtcanrecv.c (Arbeitskopie) @@ -15,14 +15,13 @@ static void print_usage(char *prg) { fprintf(stderr, - "Usage: %s <can-interface> [Options]\n" + "Usage: %s [<can-interface>] [Options]\n" "Options:\n" " -f --filter=id:mask[:id:mask]... apply filter\n" " -e --error=mask receive error messages\n" " -t, --timeout=MS timeout in ms\n" " -v, --verbose be verbose\n" " -p, --print=MODULO print every MODULO message\n" - " -n, --name=STRING name of the RT task\n" " -h, --help this help\n", prg); } @@ -30,7 +29,7 @@ static void print_usage(char *prg) extern int optind, opterr, optopt; -static int s = -1, running = 1, verbose = 0, print = 1; +static int s = -1, verbose = 0, print = 1; static nanosecs_rel_t timeout = 0; RT_TASK rt_task_desc; @@ -75,18 +74,20 @@ void cleanup_and_exit(int sig) { if (verbose) printf("Signal %d received\n", sig); - running = 0; cleanup(); exit(0); } -void rt_task(void *arg) +void rt_task(void) { int i, ret, count = 0; struct can_frame frame; + struct sockaddr_can addr; + socklen_t addrlen = sizeof(addr); - while (running) { - ret = rt_dev_recv(s, (void *)&frame, sizeof(can_frame_t), 0); + while (1) { + ret = rt_dev_recvfrom(s, (void *)&frame, sizeof(can_frame_t), 0, + (struct sockaddr *)&addr, &addrlen); if (ret < 0) { switch (ret) { case -ETIMEDOUT: @@ -100,12 +101,11 @@ void rt_task(void *arg) default: fprintf(stderr, "rt_dev_recv: %s\n", strerror(-ret)); } - running = 0; break; } if (print && (count % print) == 0) { - printf("#%d: ", count); + printf("#%d: (%d) ", count, addr.can_ifindex); if (frame.can_id & CAN_ERR_FLAG) printf("!0x%08x!", frame.can_id & CAN_ERR_MASK); else if (frame.can_id & CAN_EFF_FLAG) @@ -114,9 +114,10 @@ void rt_task(void *arg) printf("<0x%03x>", frame.can_id & CAN_SFF_MASK); printf(" [%d]", frame.can_dlc); - for (i = 0; i < frame.can_dlc; i++) { - printf(" %02x", frame.data[i]); - } + if (!(frame.can_id & CAN_RTR_FLAG)) + for (i = 0; i < frame.can_dlc; i++) { + printf(" %02x", frame.data[i]); + } if (frame.can_id & CAN_ERR_FLAG) { printf(" ERROR "); if (frame.can_id & CAN_ERR_BUSOFF) @@ -138,6 +139,7 @@ int main(int argc, char **argv) u_int32_t err_mask = 0; struct ifreq ifr; char *ptr; + char name[32]; struct option long_options[] = { { "help", no_argument, 0, 'h' }, @@ -153,7 +155,7 @@ int main(int argc, char **argv) signal(SIGTERM, cleanup_and_exit); signal(SIGINT, cleanup_and_exit); - while ((opt = getopt_long(argc, argv, "hve:f:t:p:n:", + while ((opt = getopt_long(argc, argv, "hve:f:t:p:", long_options, NULL)) != -1) { switch (opt) { case 'h': @@ -200,19 +202,6 @@ int main(int argc, char **argv) } } - if (optind == argc) { - print_usage(argv[0]); - exit(0); - } - - if (argv[optind] == NULL) { - fprintf(stderr, "No Interface supplied\n"); - exit(-1); - } - - if (verbose) - printf("interface %s\n", argv[optind]); - ret = rt_dev_socket(PF_CAN, SOCK_RAW, 0); if (ret < 0) { fprintf(stderr, "rt_dev_socket: %s\n", strerror(-ret)); @@ -220,17 +209,26 @@ int main(int argc, char **argv) } s = ret; - strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ); - if (verbose) - printf("s=%d, ifr_name=%s\n", s, ifr.ifr_name); + if (argv[optind] == NULL) { + if (verbose) + printf("interface all\n"); - ret = rt_dev_ioctl(s, SIOCGIFINDEX, &ifr); - if (ret < 0) { - fprintf(stderr, "rt_dev_ioctl GET_IFINDEX: %s\n", strerror(-ret)); - goto failure; + ifr.ifr_ifindex = 0; + } else { + if (verbose) + printf("interface %s\n", argv[optind]); + + strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ); + if (verbose) + printf("s=%d, ifr_name=%s\n", s, ifr.ifr_name); + + ret = rt_dev_ioctl(s, SIOCGIFINDEX, &ifr); + if (ret < 0) { + fprintf(stderr, "rt_dev_ioctl GET_IFINDEX: %s\n", strerror(-ret)); + goto failure; + } } - if (err_mask) { ret = rt_dev_setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)); @@ -271,19 +269,15 @@ int main(int argc, char **argv) } } - rt_timer_set_mode(TM_ONESHOT); - - ret = rt_task_spawn(&rt_task_desc, "", 0, 99, 0, &rt_task, 0); + snprintf(name, sizeof(name), "rtcanrecv-%d", getpid()); + ret = rt_task_shadow(&rt_task_desc, name, 1, 0); if (ret) { - fprintf(stderr, "rt_task_spawn: %s\n", strerror(-ret)); + fprintf(stderr, "rt_task_shadow: %s\n", strerror(-ret)); goto failure; } - while (running) - usleep(100000); - - cleanup(); - return 0; + rt_task(); + /* never returns */ failure: cleanup();
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core