mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-13 19:40:31 +03:00
DShot bitbang decode - simple refactor (#12688)
* dshot bitbang decode simple refactor saves about 80 cycles Co-Authored-By: 4712 <4712@users.noreply.github.com> * int recommendation --------- Co-authored-by: 4712 <4712@users.noreply.github.com>
This commit is contained in:
parent
10067ad6ad
commit
f44cc9fa6e
1 changed files with 9 additions and 13 deletions
|
@ -32,8 +32,8 @@
|
||||||
#include "drivers/dshot.h"
|
#include "drivers/dshot.h"
|
||||||
#include "drivers/dshot_bitbang_decode.h"
|
#include "drivers/dshot_bitbang_decode.h"
|
||||||
|
|
||||||
#define MIN_VALID_BBSAMPLES ((21 - 2) * 3)
|
#define MIN_VALID_BBSAMPLES ((21 - 2) * 3) // 57
|
||||||
#define MAX_VALID_BBSAMPLES ((21 + 2) * 3)
|
#define MAX_VALID_BBSAMPLES ((21 + 2) * 3) // 69
|
||||||
|
|
||||||
// setting this define in dshot.h allows the cli command dshot_telemetry_info to
|
// setting this define in dshot.h allows the cli command dshot_telemetry_info to
|
||||||
// display the received telemetry data in raw form which helps identify
|
// display the received telemetry data in raw form which helps identify
|
||||||
|
@ -50,7 +50,8 @@ uint16_t bbBuffer[134];
|
||||||
#define BITBAND_SRAM(a,b) ((BITBAND_SRAM_BASE + (((a)-BITBAND_SRAM_REF)<<5) + ((b)<<2))) // Convert SRAM address
|
#define BITBAND_SRAM(a,b) ((BITBAND_SRAM_BASE + (((a)-BITBAND_SRAM_REF)<<5) + ((b)<<2))) // Convert SRAM address
|
||||||
|
|
||||||
#define DSHOT_TELEMETRY_START_MARGIN 10
|
#define DSHOT_TELEMETRY_START_MARGIN 10
|
||||||
static uint8_t preambleSkip = 0;
|
|
||||||
|
static unsigned int preambleSkip = 0;
|
||||||
|
|
||||||
typedef struct bitBandWord_s {
|
typedef struct bitBandWord_s {
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
|
@ -58,7 +59,6 @@ typedef struct bitBandWord_s {
|
||||||
} bitBandWord_t;
|
} bitBandWord_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_BBDECODE
|
#ifdef DEBUG_BBDECODE
|
||||||
uint32_t sequence[MAX_GCR_EDGES];
|
uint32_t sequence[MAX_GCR_EDGES];
|
||||||
int sequenceIndex = 0;
|
int sequenceIndex = 0;
|
||||||
|
@ -106,8 +106,6 @@ static uint32_t decode_bb_value(uint32_t value, uint16_t buffer[], uint32_t coun
|
||||||
|
|
||||||
uint32_t decode_bb_bitband( uint16_t buffer[], uint32_t count, uint32_t bit)
|
uint32_t decode_bb_bitband( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
{
|
{
|
||||||
uint8_t startMargin;
|
|
||||||
|
|
||||||
#ifdef DEBUG_BBDECODE
|
#ifdef DEBUG_BBDECODE
|
||||||
memset(sequence, 0, sizeof(sequence));
|
memset(sequence, 0, sizeof(sequence));
|
||||||
sequenceIndex = 0;
|
sequenceIndex = 0;
|
||||||
|
@ -132,7 +130,7 @@ uint32_t decode_bb_bitband( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
startMargin = p - b;
|
const unsigned int startMargin = p - b;
|
||||||
DEBUG_SET(DEBUG_DSHOT_TELEMETRY_COUNTS, 3, startMargin);
|
DEBUG_SET(DEBUG_DSHOT_TELEMETRY_COUNTS, 3, startMargin);
|
||||||
|
|
||||||
if (p >= endP) {
|
if (p >= endP) {
|
||||||
|
@ -142,7 +140,7 @@ uint32_t decode_bb_bitband( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
return DSHOT_TELEMETRY_NOEDGE;
|
return DSHOT_TELEMETRY_NOEDGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int remaining = MIN(count - (p - b), (unsigned int)MAX_VALID_BBSAMPLES);
|
const int remaining = MIN(count - startMargin, (unsigned int)MAX_VALID_BBSAMPLES);
|
||||||
|
|
||||||
bitBandWord_t* oldP = p;
|
bitBandWord_t* oldP = p;
|
||||||
uint32_t bits = 0;
|
uint32_t bits = 0;
|
||||||
|
@ -232,7 +230,6 @@ uint32_t decode_bb_bitband( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
|
|
||||||
FAST_CODE uint32_t decode_bb( uint16_t buffer[], uint32_t count, uint32_t bit)
|
FAST_CODE uint32_t decode_bb( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
{
|
{
|
||||||
uint8_t startMargin;
|
|
||||||
|
|
||||||
#ifdef DEBUG_BBDECODE
|
#ifdef DEBUG_BBDECODE
|
||||||
memset(sequence, 0, sizeof(sequence));
|
memset(sequence, 0, sizeof(sequence));
|
||||||
|
@ -265,7 +262,7 @@ FAST_CODE uint32_t decode_bb( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
startMargin = p - buffer;
|
const unsigned int startMargin = p - buffer;
|
||||||
DEBUG_SET(DEBUG_DSHOT_TELEMETRY_COUNTS, 3, startMargin);
|
DEBUG_SET(DEBUG_DSHOT_TELEMETRY_COUNTS, 3, startMargin);
|
||||||
|
|
||||||
if (p >= endP) {
|
if (p >= endP) {
|
||||||
|
@ -277,8 +274,7 @@ FAST_CODE uint32_t decode_bb( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
return DSHOT_TELEMETRY_NOEDGE;
|
return DSHOT_TELEMETRY_NOEDGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int remaining = MIN(count - (p - buffer), (unsigned int)MAX_VALID_BBSAMPLES);
|
const int remaining = MIN(count - startMargin, (unsigned int)MAX_VALID_BBSAMPLES);
|
||||||
|
|
||||||
uint16_t* oldP = p;
|
uint16_t* oldP = p;
|
||||||
uint32_t bits = 0;
|
uint32_t bits = 0;
|
||||||
endP = p + remaining;
|
endP = p + remaining;
|
||||||
|
@ -300,7 +296,7 @@ FAST_CODE uint32_t decode_bb( uint16_t buffer[], uint32_t count, uint32_t bit)
|
||||||
// A level of length n gets decoded to a sequence of bits of
|
// A level of length n gets decoded to a sequence of bits of
|
||||||
// the form 1000 with a length of (n+1) / 3 to account for 3x
|
// the form 1000 with a length of (n+1) / 3 to account for 3x
|
||||||
// oversampling.
|
// oversampling.
|
||||||
const int len = MAX((p - oldP + 1) / 3,1);
|
const int len = MAX((p - oldP + 1) / 3, 1);
|
||||||
bits += len;
|
bits += len;
|
||||||
value <<= len;
|
value <<= len;
|
||||||
value |= 1 << (len - 1);
|
value |= 1 << (len - 1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue