From 2c86f493d9dcb4300a41f32e6c25b21e94048702 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Fri, 24 Dec 2021 09:35:41 +0000 Subject: [PATCH] Keep track of longest shortfall. This adds six cycles to the TX and RX shortfall paths. --- firmware/hackrf_usb/m0_state.h | 1 + firmware/hackrf_usb/sgpio_m0.s | 14 ++++++++++++-- host/hackrf-tools/src/hackrf_debug.c | 1 + host/hackrf-tools/src/hackrf_transfer.c | 10 ++++++---- host/libhackrf/src/hackrf.h | 2 ++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/firmware/hackrf_usb/m0_state.h b/firmware/hackrf_usb/m0_state.h index 549780b4..db79c6db 100644 --- a/firmware/hackrf_usb/m0_state.h +++ b/firmware/hackrf_usb/m0_state.h @@ -30,6 +30,7 @@ struct m0_state { uint32_t m0_count; uint32_t m4_count; uint32_t num_shortfalls; + uint32_t longest_shortfall; }; enum m0_mode { diff --git a/firmware/hackrf_usb/sgpio_m0.s b/firmware/hackrf_usb/sgpio_m0.s index 74060dfb..ec26b2b3 100644 --- a/firmware/hackrf_usb/sgpio_m0.s +++ b/firmware/hackrf_usb/sgpio_m0.s @@ -67,9 +67,9 @@ shadow registers. There are four key code paths, with the following worst-case timings: RX, normal: 147 cycles -RX, overrun: 65 cycles +RX, overrun: 71 cycles TX, normal: 133 cycles -TX, underrun: 129 cycles +TX, underrun: 135 cycles Design ====== @@ -112,6 +112,7 @@ registers and fixed memory addresses. .equ M0_COUNT, 0x04 .equ M4_COUNT, 0x08 .equ NUM_SHORTFALLS, 0x0C +.equ LONGEST_SHORTFALL, 0x10 // Operating modes. .equ MODE_IDLE, 0 @@ -172,6 +173,7 @@ main: str zero, [state, #M0_COUNT] // state.m0_count = zero // 2 str zero, [state, #M4_COUNT] // state.m4_count = zero // 2 str zero, [state, #NUM_SHORTFALLS] // state.num_shortfalls = zero // 2 + str zero, [state, #LONGEST_SHORTFALL] // state.longest_shortfall = zero // 2 idle: // Wait for RX or TX mode to be set. @@ -185,6 +187,7 @@ idle: str zero, [state, #M0_COUNT] // state.m0_count = zero // 2 str zero, [state, #M4_COUNT] // state.m4_count = zero // 2 str zero, [state, #NUM_SHORTFALLS] // state.num_shortfalls = zero // 2 + str zero, [state, #LONGEST_SHORTFALL] // state.longest_shortfall = zero // 2 mov shortfall_length, zero // shortfall_length = zero // 1 loop: @@ -299,6 +302,13 @@ extend_shortfall: add length, #32 // length += 32 // 1 mov shortfall_length, length // shortfall_length = length // 1 + // Is this now the longest shortfall? + longest .req r1 + ldr longest, [state, #LONGEST_SHORTFALL] // longest = state.longest_shortfall // 2 + cmp length, longest // if length <= longest: // 1 + blt loop // goto loop // 1 thru, 3 taken + str length, [state, #LONGEST_SHORTFALL] // state.longest_shortfall = length // 2 + // Return to main loop. b loop // goto loop // 3 diff --git a/host/hackrf-tools/src/hackrf_debug.c b/host/hackrf-tools/src/hackrf_debug.c index e65a70f2..96895e5d 100644 --- a/host/hackrf-tools/src/hackrf_debug.c +++ b/host/hackrf-tools/src/hackrf_debug.c @@ -389,6 +389,7 @@ static void print_state(hackrf_m0_state *state) { printf("M0 count: %u bytes\n", state->m0_count); printf("M4 count: %u bytes\n", state->m4_count); printf("Number of shortfalls: %u\n", state->num_shortfalls); + printf("Longest shortfall: %u bytes\n", state->longest_shortfall); } static void usage() { diff --git a/host/hackrf-tools/src/hackrf_transfer.c b/host/hackrf-tools/src/hackrf_transfer.c index 6b97f40f..20171225 100644 --- a/host/hackrf-tools/src/hackrf_transfer.c +++ b/host/hackrf-tools/src/hackrf_transfer.c @@ -1159,11 +1159,12 @@ int main(int argc, char** argv) { if (result != HACKRF_SUCCESS) fprintf(stderr, "\nhackrf_get_m0_state() failed: %s (%d)\n", hackrf_error_name(result), result); else - fprintf(stderr, ", %d bytes %s in buffer, %u %s\n", + fprintf(stderr, ", %d bytes %s in buffer, %u %s, longest %u bytes\n", tx ? state.m4_count - state.m0_count : state.m0_count - state.m4_count, tx ? "filled" : "free", state.num_shortfalls, - tx ? "underruns" : "overruns"); + tx ? "underruns" : "overruns", + state.longest_shortfall); } else { fprintf(stderr, "\n"); } @@ -1219,11 +1220,12 @@ int main(int argc, char** argv) { "Transfer statistics:\n" "%lu bytes transferred by M0\n" "%lu bytes transferred by M4\n" - "%u %s\n", + "%u %s, longest %u bytes\n", stats.m0_total, stats.m4_total, state.num_shortfalls, - (transmit || signalsource) ? "underruns" : "overruns"); + (transmit || signalsource) ? "underruns" : "overruns", + state.longest_shortfall); } } diff --git a/host/libhackrf/src/hackrf.h b/host/libhackrf/src/hackrf.h index d1d049f5..da5dded1 100644 --- a/host/libhackrf/src/hackrf.h +++ b/host/libhackrf/src/hackrf.h @@ -165,6 +165,8 @@ typedef struct { uint32_t m4_count; /** Number of shortfalls. */ uint32_t num_shortfalls; + /** Longest shortfall. */ + uint32_t longest_shortfall; } hackrf_m0_state; struct hackrf_device_list {