Keep track of longest shortfall.

This adds six cycles to the TX and RX shortfall paths.
This commit is contained in:
Martin Ling
2021-12-24 09:35:41 +00:00
parent a7bd1e3ede
commit 2c86f493d9
5 changed files with 22 additions and 6 deletions

View File

@ -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 {

View File

@ -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

View File

@ -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() {

View File

@ -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);
}
}

View File

@ -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 {