X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/1123f260ffaa253d3469c34afb00a9f595aefea8..a2ab082da494e4f04d1f2c6e92d570a22e7d4e63:/latester/latester.c diff --git a/latester/latester.c b/latester/latester.c index 140811f..2e8f6e3 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -1,8 +1,8 @@ -/**************************************************************************/ -/* CAN latency tester */ -/* Copyright (C) 2010, 2011, 2012 Michal Sojka, DCE FEE CTU Prague */ -/* License: GPLv2 */ -/**************************************************************************/ +/*******************************************************************************/ +/* CAN latency tester */ +/* Copyright (C) 2010, 2011, 2012, 2013, 2014 Michal Sojka, DCE FEE CTU Prague */ +/* License: GPLv2 */ +/*******************************************************************************/ #include #include @@ -30,6 +30,7 @@ #include #include +#include "canframelen.h" #include #include @@ -160,144 +161,6 @@ 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 = 0xf8000000; - unsigned stuffed = 0; - memset(bitmap, 0, sizeof(bitmap)); - crc_t crc = 0; - uint32_t crcx; - -/* char received[64]; */ -/* sprint_canframe(received, frame, true); */ -/* printf("Frame: %s\n", received); */ - - if (frame->can_id & CAN_EFF_FLAG) { - bitmap[0] = - ((frame->can_id & CAN_EFF_MASK) >> 25); - bitmap[1] = - ((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 = 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) | - (!!(frame->can_id & CAN_RTR_FLAG)) << 6 | - 0 << 4 | - frame->can_dlc & 0xf; - bitmap[1] = htonl(((uint32_t*)frame->data)[0]); - bitmap[2] = htonl(((uint32_t*)frame->data)[1]); - start = 13; - end = 32 + 8*frame->can_dlc; - } - /* TODO: Calc stuff bits in CRC */ - while (start < end) { - mask = basemask >> (start & 0x1f); - while (1) { - ones = ones ? mask : 0; - uint32_t chunk = (bitmap[start >> 5] & mask) ^ ones; - //printf("start=%d bitmap=0x%08x mask=0x%08x ones=0x%08x chunk=0x%08x\n", start, bitmap[start >> 5], mask, ones, chunk); - if (chunk) { - unsigned change = __builtin_clz(chunk); - start = start & ~0x1f | change; - basemask = 0xf8000000; - } else { - unsigned oldstart = start; - start += __builtin_popcount(mask); - mask = (oldstart & 0x1f) ? basemask << (-oldstart & 0x1f) : 0; - //printf("oldstart=%d shl=%d mask=0x%08x\n", oldstart, -oldstart & 0x1f, mask); - if (mask && start < end) - continue; - if (start <= end && !mask) { - stuffed++; - basemask = 0xf0000000; - //printf("stuffed %d\n", !ones); - } - } - break; - } - ones = !ones; - } - //printf ("STUFFED %d BITS\n", stuffed); - return stuffed; -} - -unsigned calc_frame_txtime_us(struct can_frame *frame) { - return calc_stuff_bits(frame) + - 1 + /* SOF */ - 11 + /* ID A */ - ((frame->can_id & CAN_EFF_FLAG) ? - 1 + /* SRR */ - 1 + /* IDE */ - 18 + /* ID B */ - 1 + /* RTR */ - 2 /* r1, r0 */ - : - 1 + /* rtr */ - 2) + /* ide, r0 */ - 4 + /* dlc */ - 8*frame->can_dlc + - 15 + /* CRC */ - 3 + /* CRC del, ACK, ACK del */ - 7; /* EOF */ -} - void msg_info_print(FILE *f, struct msg_info *mi) { struct timespec diff; @@ -393,7 +256,7 @@ static inline void calc_msg_latencies(struct msg_info *mi) return; } mi->lat_measured_us = diff.tv_sec * 1000000 + diff.tv_nsec/1000; - mi->tx_time_us = calc_frame_txtime_us(&mi->received); + mi->tx_time_us = calc_frame_length(&mi->received); } void set_sched_policy_and_prio(int policy, int rtprio)