mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-18 13:55:18 +03:00
Optimise DSHOT cache management loops (#12672)
This commit is contained in:
parent
a0d009c4df
commit
20747ec3e3
1 changed files with 8 additions and 28 deletions
|
@ -533,21 +533,13 @@ static bool bbUpdateStart(void)
|
||||||
if (telemetryWait) {
|
if (telemetryWait) {
|
||||||
DEBUG_SET(DEBUG_DSHOT_TELEMETRY_COUNTS, 2, debug[2] + 1);
|
DEBUG_SET(DEBUG_DSHOT_TELEMETRY_COUNTS, 2, debug[2] + 1);
|
||||||
} else {
|
} else {
|
||||||
for (int motorIndex = 0; motorIndex < MAX_SUPPORTED_MOTORS && motorIndex < motorCount; motorIndex++) {
|
|
||||||
#ifdef USE_DSHOT_CACHE_MGMT
|
#ifdef USE_DSHOT_CACHE_MGMT
|
||||||
// Only invalidate the buffer once. If all motors are on a common port they'll share a buffer.
|
for (int i = 0; i < usedMotorPorts; i++) {
|
||||||
bool invalidated = false;
|
bbPort_t *bbPort = &bbPorts[i];
|
||||||
for (int i = 0; i < motorIndex; i++) {
|
SCB_InvalidateDCache_by_Addr((uint32_t *)bbPort->portInputBuffer, DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_BYTES);
|
||||||
if (bbMotors[motorIndex].bbPort->portInputBuffer == bbMotors[i].bbPort->portInputBuffer) {
|
|
||||||
invalidated = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!invalidated) {
|
|
||||||
SCB_InvalidateDCache_by_Addr((uint32_t *)bbMotors[motorIndex].bbPort->portInputBuffer,
|
|
||||||
DSHOT_BB_PORT_IP_BUF_CACHE_ALIGN_BYTES);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
for (int motorIndex = 0; motorIndex < MAX_SUPPORTED_MOTORS && motorIndex < motorCount; motorIndex++) {
|
||||||
#ifdef STM32F4
|
#ifdef STM32F4
|
||||||
uint32_t rawValue = decode_bb_bitband(
|
uint32_t rawValue = decode_bb_bitband(
|
||||||
bbMotors[motorIndex].bbPort->portInputBuffer,
|
bbMotors[motorIndex].bbPort->portInputBuffer,
|
||||||
|
@ -646,23 +638,11 @@ static void bbUpdateComplete(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_DSHOT_CACHE_MGMT
|
|
||||||
for (int motorIndex = 0; motorIndex < MAX_SUPPORTED_MOTORS && motorIndex < motorCount; motorIndex++) {
|
|
||||||
// Only clean each buffer once. If all motors are on a common port they'll share a buffer.
|
|
||||||
bool clean = false;
|
|
||||||
for (int i = 0; i < motorIndex; i++) {
|
|
||||||
if (bbMotors[motorIndex].bbPort->portOutputBuffer == bbMotors[i].bbPort->portOutputBuffer) {
|
|
||||||
clean = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!clean) {
|
|
||||||
SCB_CleanDCache_by_Addr(bbMotors[motorIndex].bbPort->portOutputBuffer, MOTOR_DSHOT_BUF_CACHE_ALIGN_BYTES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < usedMotorPorts; i++) {
|
for (int i = 0; i < usedMotorPorts; i++) {
|
||||||
bbPort_t *bbPort = &bbPorts[i];
|
bbPort_t *bbPort = &bbPorts[i];
|
||||||
|
#ifdef USE_DSHOT_CACHE_MGMT
|
||||||
|
SCB_CleanDCache_by_Addr(bbPort->portOutputBuffer, MOTOR_DSHOT_BUF_CACHE_ALIGN_BYTES);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_DSHOT_TELEMETRY
|
#ifdef USE_DSHOT_TELEMETRY
|
||||||
if (useDshotTelemetry) {
|
if (useDshotTelemetry) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue