]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - latester/latester.c
Speedup cpu-load experiments by stopping hackbench during maintenance
[can-benchmark.git] / latester / latester.c
index bf0eff0f8f4845b001c988347f01ba3ee58889f1..30e62f1f4462ca1de067fa92f64b278021ead61e 100644 (file)
@@ -158,27 +158,77 @@ static inline char *tstamp_str(const void *ctx, struct timespec *tstamp)
                               tstamp->tv_sec, tstamp->tv_nsec/1000);
 }
 
+/* Functions and types for CRC checks.
+ *
+ * Generated on Wed Sep 21 22:30:11 2011,
+ * by pycrc v0.7.8, http://www.tty1.net/pycrc/
+ * using the configuration:
+ *    Width        = 15
+ *    Poly         = 0x4599
+ *    XorIn        = 0x0000
+ *    ReflectIn    = False
+ *    XorOut       = 0x0000
+ *    ReflectOut   = False
+ *    Algorithm    = table-driven
+ *****************************************************************************/
+typedef uint16_t crc_t;
+
+static const crc_t crc_table[2] = {
+    0x0000, 0x4599
+};
+
+crc_t crc_update(crc_t crc, uint32_t data, size_t bit_len)
+{
+    unsigned int tbl_idx;
+/*     crc_t bc = crc; */
+/*     uint32_t bd = data; */
+/*     size_t bl = bit_len; */
+
+    while (bit_len--) {
+        tbl_idx = (crc >> 14) ^ (data >> 31);
+        crc = crc_table[tbl_idx & 0x01] ^ (crc << 1);
+       data <<= 1;
+    }
+    crc = crc & 0x7fff;
+/*     printf("crc: 0x%04x -> 0x%04x  data: 0x%08x  len: %d\n", */
+/*        bc, crc, bd, bl); */
+    return crc;
+}
+
 unsigned calc_stuff_bits(struct can_frame *frame) {
        uint32_t bitmap[4];
        unsigned start = 0, end;
-       uint32_t mask, ones = 0, basemask = 0xf0000000;
+       uint32_t mask, ones = 0, basemask = 0xf8000000;
        unsigned stuffed = 0;
        memset(bitmap, 0, sizeof(bitmap));
+       crc_t crc = 0;
+       uint32_t crcx;
 
        if (frame->can_id & CAN_EFF_FLAG) {
                bitmap[0] =
-                       (frame->can_id >> 25);
+                       ((frame->can_id & CAN_EFF_MASK) >> 25);
                bitmap[1] =
-                       (frame->can_id >> 18) << 25             |
-                       3 << 23                                 |
-                       (frame->can_id & 0x3ffff) << 7          |
-                       (!!(frame->can_id & CAN_RTR_FLAG)) << 6 |
-                       0 << 4                                  |
+                       ((frame->can_id & CAN_EFF_MASK) >> 18) << 25    |
+                       3 << 23                                         |
+                       ((frame->can_id & CAN_EFF_MASK) & 0x3ffff) << 7 |
+                       (!!(frame->can_id & CAN_RTR_FLAG)) << 6         |
+                       0 << 4                                          |
                        frame->can_dlc & 0xf;
                bitmap[2] = htonl(((uint32_t*)frame->data)[0]);
                bitmap[3] = htonl(((uint32_t*)frame->data)[1]);
-               start = 28;
+               start = 27;
                end = 64 + 8*frame->can_dlc;
+               crc = crc_update(crc, bitmap[0] << start, 32-start);
+               crc = crc_update(crc, bitmap[1], 32);
+               crc = crc_update(crc, bitmap[2], end - 64 > 32 ? 32 : end - 64);
+               crc = crc_update(crc, bitmap[3], end > 96 ? end - 96 : 0);
+               crcx = (uint32_t)htons(crc) << 17;
+               if (frame->can_dlc < 4)
+                       bitmap[2] |= crcx >> (frame->can_dlc*8);
+               if (frame->can_dlc = 3)
+                       bitmap[3] |= crcx << 8;
+               if (frame->can_dlc >= 4)
+                       bitmap[3] |= crcx >> (frame->can_dlc*8);
        } else {
                bitmap[0] =
                        (frame->can_id << 7) |
@@ -187,7 +237,7 @@ unsigned calc_stuff_bits(struct can_frame *frame) {
                        frame->can_dlc & 0xf;
                bitmap[1] = htonl(((uint32_t*)frame->data)[0]);
                bitmap[2] = htonl(((uint32_t*)frame->data)[1]);
-               start = 14;
+               start = 13;
                end = 32 + 8*frame->can_dlc;
        }
        /* TODO: Calc stuff bits in CRC */
@@ -211,14 +261,14 @@ unsigned calc_stuff_bits(struct can_frame *frame) {
                                if (start <= end && !mask) {
                                        stuffed++;
                                        basemask = 0xf0000000;
-                                       printf("stuffed %d\n", !ones);
+                                       //printf("stuffed %d\n", !ones);
                                }
                        }
                        break;
                }
                ones = !ones;
        }
-       printf ("STUFFED %d BITS\n", stuffed);
+       //printf ("STUFFED %d BITS\n", stuffed);
 }
 
 unsigned calc_frame_txtime(struct can_frame *frame) {
@@ -260,7 +310,7 @@ void msg_info_print(FILE *f, struct msg_info *mi)
                        num, S(mi->ts_sent), sent, S(mi->ts_rx_final_kern), S(mi->ts_rx_final), received,
                        DIFF(mi->ts_sent, mi->ts_rx_final_kern),
                        DIFF(mi->ts_sent, mi->ts_rx_final),
-                       calc_frame_txtime(mi->received));
+                       calc_frame_txtime(&mi->received));
                break;
        case 3:
                fprintf(f, "%ld: %s %s -> %s (%s) -> %s (%s) %s = %s (%s), %s (%s) %d\n",
@@ -271,7 +321,7 @@ void msg_info_print(FILE *f, struct msg_info *mi)
                        DIFF(mi->ts_sent, mi->ts_rx_onwire),
                        DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern),
                        DIFF(mi->ts_rx_onwire, mi->ts_rx_final),
-                       calc_frame_txtime(mi->received));
+                       calc_frame_txtime(&mi->received));
                break;
        }
 #undef S
@@ -834,6 +884,13 @@ int main(int argc, const char *argv[])
                error(1, errno, "pipe fcntl");
 
        init_ftrace();
+       if (getenv("LATESTER_CONTROL_HACKBENCH")) {
+               char cmd[1000];
+               sprintf(cmd, "ssh -x -a -S $HOME/.ssh/cangw-connection root@192.168.2.3 'kill -CONT -%s'",
+                       getenv("LATESTER_CONTROL_HACKBENCH"));
+               printf("Running: %s\n", cmd);
+               system(cmd);
+       }
 
        pthread_create(&thread, 0, measure_thread, NULL);
 
@@ -883,6 +940,14 @@ int main(int argc, const char *argv[])
 
        pthread_join(thread, NULL);
 
+       if (getenv("LATESTER_CONTROL_HACKBENCH")) {
+               char cmd[1000];
+               sprintf(cmd, "ssh -x -a -S $HOME/.ssh/cangw-connection root@192.168.2.3 'kill -STOP -%s'",
+                       getenv("LATESTER_CONTROL_HACKBENCH"));
+               printf("Running: %s\n", cmd);
+               system(cmd);
+       }
+
        close(completion_pipe[0]);
        close(completion_pipe[1]);