Skip to contentSkip to conversation

rtcan_rtt: Various fixes and improvement

PATCH In review Wolfgang Grandegger 2 participants 4 messages Jan 18, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 rtcan_rtt: Various fixes and improvement

This patch fixes type long overflows, invalid command line argument types and gives the receiver and transmitter thread dedicated names.

(quoted diff) +0 -0

b/examples/rtdm/profiles/can/rtcan_rtt.c
index 93c84a6..2280562 100644

examples/rtdm/profiles/can/rtcan_rtt.c +4 -2
@@ -94,6 +94,7 @@ void *transmitter(void *arg)
     frame.can_id = can_id;
     frame.can_dlc = sizeof(*rtt_time);
 
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_transmitter");
     pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);
 
     clock_gettime(CLOCK_MONOTONIC, &next_period);
@@ -113,7 +114,7 @@ void *transmitter(void *arg)
 	}
 
         clock_gettime(CLOCK_MONOTONIC, &time);
-	*rtt_time = time.tv_sec * NSEC_PER_SEC + time.tv_nsec;
+	*rtt_time = (long long)time.tv_sec * NSEC_PER_SEC + time.tv_nsec;
 
         /* Transmit the message containing the local time */
 	if (send(txsock, (void *)&frame, sizeof(can_frame_t), 0) < 0) {
@@ -136,6 +137,8 @@ void *receiver(void *arg)
     long long *rtt_time = (long long *)frame.data;
     struct rtt_stat rtt_stat = {0, 1000000000000000000LL,
-1000000000000000000LL,
 				0, 0, 0};
+
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_receiver");
     pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);
 
     rtt_stat.counts_per_sec = 1000000 / cycle;

@@ -161,7 +164,7 @@ void *receiver(void *arg)
} else {
clock_gettime(CLOCK_MONOTONIC, &time); if (rxcount > 0) {
- rtt_stat.rtt = (time.tv_sec * 1000000000LL +
+ rtt_stat.rtt = ((long long)time.tv_sec * 1000000000LL +
time.tv_nsec - *rtt_time);
rtt_stat.rtt_sum += rtt_stat.rtt; if (rtt_stat.rtt < rtt_stat.rtt_min)
@@ -201,7 +204,7 @@ int main(int argc, char *argv[])

     struct option long_options[] = {

{ "id", required_argument, 0, 'i'},
{ "cycle", required_argument, 0, 'c'},
- { "repeater", required_argument, 0, 'r'},
+ { "repeater", no_argument, 0, 'r'},
{ "help", no_argument, 0, 'h'},
{ 0, 0, 0, 0},

     };
#1 lore raw
Quoted 11 lines · Wolfgang Grandegger

This patch fixes type long overflows, invalid command line argument types and gives the receiver and transmitter thread dedicated names.

examples/rtdm/profiles/can/rtcan_rtt.c +0 -0
index 93c84a6..2280562 100644

examples/rtdm/profiles/can/rtcan_rtt.c void *transmitter(void *arg) · line 97

Quoted 4 lines
examples/rtdm/profiles/can/rtcan_rtt.c +1 -0
@@ -94,6 +94,7 @@ void *transmitter(void *arg)
     frame.can_id = can_id;
     frame.can_dlc = sizeof(*rtt_time);
 
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_transmitter");

Maybe we should put this between #ifdef __XENO__, so that the code compiles under plain posix too?

Signature · 1 line
					    Gilles.
#2 lore raw
Quoted 15 lines · Gilles Chanteperdrix
Quoted 14 lines · Wolfgang Grandegger

This patch fixes type long overflows, invalid command line argument types and gives the receiver and transmitter thread dedicated names.

examples/rtdm/profiles/can/rtcan_rtt.c +0 -0
index 93c84a6..2280562 100644
@@ -94,6 +94,7 @@ void *transmitter(void *arg)
     frame.can_id = can_id;
     frame.can_dlc = sizeof(*rtt_time);
 
Quoted 4 lines

examples/rtdm/profiles/can/rtcan_rtt.c void *transmitter(void *arg) · line 97

Quoted 1 line
examples/rtdm/profiles/can/rtcan_rtt.c +1 -0
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_transmitter");

Maybe we should put this between #ifdef __XENO__, so that the code compiles under plain posix too?

Good idea but it requires a few more changes. See below:

Thanks,

Wolfgang.

[PATCH v3] rtcan_rtt: Various fixes and improvement

This patch fixes type long overflows, invalid command line argument types and gives the receiver and transmitter thread dedicated names. Furthermore, it now also compiles under plain POSIX by using the macro definition __XENO__ as suggested by Gilles.

examples/rtdm/profiles/can/rtcan_rtt.c +21 -7
index 93c84a6..b4ff74a 100644
@@ -45,14 +45,21 @@
 #include <limits.h>
 #include <getopt.h>
 #include <netinet/in.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
 #include <sys/mman.h>
 
+#ifdef __XENO__
 #include <rtdm/rtcan.h>
+#else
+#include <linux/can.h>
+#include <linux/can/raw.h>
+#endif
 
 #define NSEC_PER_SEC 1000000000
 
 static unsigned int cycle = 10000; /* 10 ms */
-static can_id_t can_id = 0x1;
+static canid_t can_id = 0x1;
 
 static pthread_t txthread, rxthread;
 static int txsock, rxsock;
@@ -94,6 +101,9 @@ void *transmitter(void *arg)
     frame.can_id = can_id;
     frame.can_dlc = sizeof(*rtt_time);
 
+#ifdef __XENO__
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_transmitter");
+#endif
     pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);
 
     clock_gettime(CLOCK_MONOTONIC, &next_period);
@@ -113,10 +123,10 @@ void *transmitter(void *arg)
 	}
 
         clock_gettime(CLOCK_MONOTONIC, &time);
-	*rtt_time = time.tv_sec * NSEC_PER_SEC + time.tv_nsec;
+	*rtt_time = (long long)time.tv_sec * NSEC_PER_SEC + time.tv_nsec;
 
         /* Transmit the message containing the local time */
-	if (send(txsock, (void *)&frame, sizeof(can_frame_t), 0) < 0) {
+	if (send(txsock, (void *)&frame, sizeof(struct can_frame), 0) < 0) {
             if (errno == EBADF)
                 printf("terminating transmitter thread\n");
             else
@@ -136,12 +146,16 @@ void *receiver(void *arg)
     long long *rtt_time = (long long *)frame.data;
     struct rtt_stat rtt_stat = {0, 1000000000000000000LL, -1000000000000000000LL,
 				0, 0, 0};
+
+#ifdef __XENO__
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_receiver");
+#endif
     pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);
 
     rtt_stat.counts_per_sec = 1000000 / cycle;
 
     while (1) {
-	if (recv(rxsock, (void *)&frame, sizeof(can_frame_t), 0) < 0) {
+	if (recv(rxsock, (void *)&frame, sizeof(struct can_frame), 0) < 0) {
 	    if (errno == EBADF)
                 printf("terminating receiver thread\n");
             else
@@ -150,7 +164,7 @@ void *receiver(void *arg)
         }
 	if (repeater) {
 	    /* Transmit the message back as is */
-	    if (send(txsock, (void *)&frame, sizeof(can_frame_t), 0) < 0) {
+	    if (send(txsock, (void *)&frame, sizeof(struct can_frame), 0) < 0) {
 		if (errno == EBADF)
 		    printf("terminating transmitter thread\n");
 		else
@@ -161,7 +175,7 @@ void *receiver(void *arg)
 	} else {
 	    clock_gettime(CLOCK_MONOTONIC, &time);
 	    if (rxcount > 0) {
-		rtt_stat.rtt = (time.tv_sec * 1000000000LL +
+		rtt_stat.rtt = ((long long)time.tv_sec * 1000000000LL +
 				time.tv_nsec - *rtt_time);
 		rtt_stat.rtt_sum += rtt_stat.rtt;
 		if (rtt_stat.rtt <  rtt_stat.rtt_min)
@@ -201,7 +215,7 @@ int main(int argc, char *argv[])
     struct option long_options[] = {
 	{ "id", required_argument, 0, 'i'},
 	{ "cycle", required_argument, 0, 'c'},
-	{ "repeater", required_argument, 0, 'r'},
+	{ "repeater", no_argument, 0, 'r'},
 	{ "help", no_argument, 0, 'h'},
 	{ 0, 0, 0, 0},
     };
#3 lore raw
Quoted 16 lines · Wolfgang Grandegger
Quoted 15 lines · Gilles Chanteperdrix
Quoted 14 lines · Wolfgang Grandegger

This patch fixes type long overflows, invalid command line argument types and gives the receiver and transmitter thread dedicated names.

examples/rtdm/profiles/can/rtcan_rtt.c +0 -0
index 93c84a6..2280562 100644
@@ -94,6 +94,7 @@ void *transmitter(void *arg)
     frame.can_id = can_id;
     frame.can_dlc = sizeof(*rtt_time);
 
Quoted 5 lines
Quoted 3 lines

examples/rtdm/profiles/can/rtcan_rtt.c void *transmitter(void *arg) · line 105

Quoted 1 line
examples/rtdm/profiles/can/rtcan_rtt.c +1 -0
+    pthread_set_name_np(pthread_self(), "rtcan_rtt_transmitter");

Maybe we should put this between #ifdef __XENO__, so that the code compiles under plain posix too?

Good idea but it requires a few more changes. See below:

Fine. Merged, thanks.

Signature · 1 line
					    Gilles.