mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-23 16:25:31 +03:00
Fix DShot cache clean/invalidate
This commit is contained in:
parent
76765cd0e8
commit
080717a407
3 changed files with 69 additions and 13 deletions
|
@ -62,7 +62,18 @@
|
|||
|
||||
#define MOTOR_DSHOT_GCR_CHANGE_INTERVAL_NS(rate) (MOTOR_DSHOT_CHANGE_INTERVAL_NS(rate) * 5 / 4)
|
||||
|
||||
#define MOTOR_DSHOT_BUFFER_SIZE ((MOTOR_DSHOT_FRAME_BITS / MOTOR_DSHOT_BIT_PER_SYMBOL) * MOTOR_DSHOT_STATE_PER_SYMBOL)
|
||||
#define MOTOR_DSHOT_BUF_LENGTH ((MOTOR_DSHOT_FRAME_BITS / MOTOR_DSHOT_BIT_PER_SYMBOL) * MOTOR_DSHOT_STATE_PER_SYMBOL)
|
||||
#ifdef USE_DSHOT_CACHE_MGMT
|
||||
// MOTOR_DSHOT_BUF_LENGTH is multiples of uint32_t
|
||||
// Number of bytes required for buffer
|
||||
#define MOTOR_DSHOT_BUF_BYTES (MOTOR_DSHOT_BUF_LENGTH * sizeof (uint32_t))
|
||||
// Number of bytes required to cache align buffer
|
||||
#define MOTOR_DSHOT_BUF_CACHE_ALIGN_BYTES ((MOTOR_DSHOT_BUF_BYTES + 0x20) & ~0x1f)
|
||||
// Size of array to create a cache aligned buffer
|
||||
#define MOTOR_DSHOT_BUF_CACHE_ALIGN_LENGTH (MOTOR_DSHOT_BUF_CACHE_ALIGN_BYTES / sizeof (uint32_t))
|
||||
#else
|
||||
#define MOTOR_DSHOT_BUF_CACHE_ALIGN_LENGTH MOTOR_DSHOT_BUF_LENGTH
|
||||
#endif
|
||||
|
||||
#ifdef USE_HAL_DRIVER
|
||||
#define BB_GPIO_PULLDOWN GPIO_PULLDOWN
|
||||
|
@ -195,7 +206,7 @@ extern uint8_t bbPuPdMode;
|
|||
|
||||
// DMA output buffer:
|
||||
// DShot requires 3 [word/bit] * 16 [bit] = 48 [word]
|
||||
extern uint32_t bbOutputBuffer[MOTOR_DSHOT_BUFFER_SIZE * MAX_SUPPORTED_MOTOR_PORTS];
|
||||
extern uint32_t bbOutputBuffer[MOTOR_DSHOT_BUF_CACHE_ALIGN_LENGTH * MAX_SUPPORTED_MOTOR_PORTS];
|
||||
|
||||
// DMA input buffer
|
||||
// (30us + <frame time> + <slack>) / <input sampling clock perid>
|
||||
|
@ -206,8 +217,19 @@ extern uint32_t bbOutputBuffer[MOTOR_DSHOT_BUFFER_SIZE * MAX_SUPPORTED_MOTOR_POR
|
|||
// <slack> = 10%
|
||||
// (30 + 26 + 3) / 0.44 = 134
|
||||
// In some cases this was not enough, so we add 6 extra samples
|
||||
#define DSHOT_BITBANG_PORT_INPUT_BUFFER_LENGTH 140
|
||||
extern uint16_t bbInputBuffer[DSHOT_BITBANG_PORT_INPUT_BUFFER_LENGTH * MAX_SUPPORTED_MOTOR_PORTS];
|
||||
#define DSHOT_BB_PORT_IP_BUF_LENGTH 140
|
||||
#ifdef USE_DSHOT_CACHE_MGMT
|
||||
// Each sample is a uint16_t
|
||||
// Number of bytes required for buffer
|
||||
#define DSHOT_BB_PORT_IP_BUF_BYTES (DSHOT_BB_PORT_IP_BUF_LENGTH * sizeof (uint16_t))
|
||||
// Number of bytes required to cache align buffer
|
||||
#define DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_BYTES ((DSHOT_BB_PORT_IP_BUF_BYTES + 0x20) & ~0x1f)
|
||||
// Size of array to create a cache aligned buffer
|
||||
#define DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_LENGTH (DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_BYTES / sizeof (uint16_t))
|
||||
#else
|
||||
#define DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_LENGTH DSHOT_BB_PORT_IP_BUF_LENGTH
|
||||
#endif
|
||||
extern uint16_t bbInputBuffer[DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_LENGTH * MAX_SUPPORTED_MOTOR_PORTS];
|
||||
|
||||
void bbGpioSetup(bbMotor_t *bbMotor);
|
||||
void bbTimerChannelInit(bbPort_t *bbPort);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue