DSHOT telemetry optimizations (#8772)

DSHOT telemetry optimizations
This commit is contained in:
Michael Keller 2019-10-20 22:39:32 +13:00 committed by GitHub
commit 9f5bbf6e5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 50 additions and 4 deletions

View File

@ -53,6 +53,19 @@ SECTIONS
_etext = .; /* define a global symbols at end of code */
} >FLASH
/* Critical program code goes into CCM RAM */
/* Copy specific fast-executing code to CCM RAM */
ccm_code = LOADADDR(.ccm_code);
.ccm_code :
{
. = ALIGN(4);
ccm_code_start = .;
*(.ccm_code)
*(.ccm_code*)
. = ALIGN(4);
ccm_code_end = .;
} >CCM AT >FLASH
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
.ARM : {

View File

@ -52,6 +52,7 @@ static dmaChannelDescriptor_t dmaDescriptors[DMA_LAST_HANDLER] = {
/*
* DMA IRQ Handlers
*/
DEFINE_DMA_IRQ_HANDLER(1, 1, DMA1_CH1_HANDLER)
DEFINE_DMA_IRQ_HANDLER(1, 2, DMA1_CH2_HANDLER)
DEFINE_DMA_IRQ_HANDLER(1, 3, DMA1_CH3_HANDLER)

View File

@ -168,7 +168,13 @@ typedef enum {
.owner.resourceIndex = 0 \
}
#define DEFINE_DMA_IRQ_HANDLER(d, c, i) void DMA ## d ## _Channel ## c ## _IRQHandler(void) {\
#if defined(USE_CCM_CODE) && defined(STM32F3)
#define DMA_HANDLER_CODE CCM_CODE
#else
#define DMA_HANDLER_CODE
#endif
#define DEFINE_DMA_IRQ_HANDLER(d, c, i) DMA_HANDLER_CODE void DMA ## d ## _Channel ## c ## _IRQHandler(void) {\
const uint8_t index = DMA_IDENTIFIER_TO_INDEX(i); \
dmaCallbackHandlerFuncPtr handler = dmaDescriptors[index].irqHandlerCallback; \
if (handler) \

View File

@ -120,7 +120,12 @@ FAST_CODE void pwmDshotSetDirectionOutput(
#ifdef USE_DSHOT_TELEMETRY
FAST_CODE static void pwmDshotSetDirectionInput(
#if defined(STM32F3)
CCM_CODE
#else
FAST_CODE
#endif
static void pwmDshotSetDirectionInput(
motorDmaOutput_t * const motor
)
{
@ -183,6 +188,11 @@ void pwmCompleteDshotMotorUpdate(void)
}
}
#if defined(STM32F3)
CCM_CODE
#else
FAST_CODE
#endif
static void motor_DMA_IRQHandler(dmaChannelDescriptor_t *descriptor)
{
if (DMA_GET_FLAG_STATUS(descriptor, DMA_IT_TCIF)) {

View File

@ -98,7 +98,7 @@ void pwmDshotSetDirectionOutput(
}
#ifdef USE_DSHOT_TELEMETRY
static void pwmDshotSetDirectionInput(
FAST_CODE static void pwmDshotSetDirectionInput(
motorDmaOutput_t * const motor
)
{
@ -164,7 +164,7 @@ FAST_CODE void pwmCompleteDshotMotorUpdate(void)
}
}
static void motor_DMA_IRQHandler(dmaChannelDescriptor_t* descriptor)
FAST_CODE static void motor_DMA_IRQHandler(dmaChannelDescriptor_t* descriptor)
{
if (DMA_GET_FLAG_STATUS(descriptor, DMA_IT_TCIF)) {
motorDmaOutput_t * const motor = &dmaMotors[descriptor->userParam];

View File

@ -253,6 +253,14 @@ void initialiseMemorySections(void)
memcpy(&tcm_code_start, &tcm_code, (size_t) (&tcm_code_end - &tcm_code_start));
#endif
#ifdef USE_CCM_CODE
/* Load functions into RAM */
extern uint8_t ccm_code_start;
extern uint8_t ccm_code_end;
extern uint8_t ccm_code;
memcpy(&ccm_code_start, &ccm_code, (size_t) (&ccm_code_end - &ccm_code_start));
#endif
#ifdef USE_FAST_RAM
/* Load FAST_RAM variable intializers into DTCM RAM */
extern uint8_t _sfastram_data;

View File

@ -44,6 +44,7 @@
#define MINIMAL_CLI
#define USE_DSHOT
#define USE_GYRO_DATA_ANALYSE
#define USE_CCM_CODE
#endif
#ifdef STM32F4
@ -135,6 +136,7 @@
#define DEFAULT_AUX_CHANNEL_COUNT 6
#endif
#ifdef USE_ITCM_RAM
#define FAST_CODE __attribute__((section(".tcm_code")))
#define FAST_CODE_NOINLINE NOINLINE
@ -143,6 +145,12 @@
#define FAST_CODE_NOINLINE
#endif // USE_ITCM_RAM
#ifdef USE_CCM_CODE
#define CCM_CODE __attribute__((section(".ccm_code")))
#else
#define CCM_CODE
#endif
#ifdef USE_FAST_RAM
#define FAST_RAM_ZERO_INIT __attribute__ ((section(".fastram_bss"), aligned(4)))
#define FAST_RAM __attribute__ ((section(".fastram_data"), aligned(4)))