Microlib slow division causes HAL_GetTick API performance issue, so optimized HAL_GetTick API to improve performance.

pull/12915/head
Rajkumar Kanagaraj 2020-04-28 19:05:32 +01:00
parent 918d679b06
commit 4ab794b47f
2 changed files with 22 additions and 29 deletions

View File

@ -27,11 +27,13 @@ extern int mbed_sdk_inited;
void init_16bit_timer(void); void init_16bit_timer(void);
void init_32bit_timer(void); void init_32bit_timer(void);
#if TIM_MST_BIT_WIDTH == 16 #if TIM_MST_BIT_WIDTH <= 16
// Variables also reset in us_ticker_init() static uint16_t prev_time;
uint32_t prev_time = 0; #else
uint32_t elapsed_time = 0; static uint32_t prev_time;
#endif #endif
static uint32_t total_ticks;
static uint16_t prev_tick_remainder;
// Overwrite default HAL functions defined as "weak" // Overwrite default HAL functions defined as "weak"
@ -47,26 +49,24 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
uint32_t HAL_GetTick() uint32_t HAL_GetTick()
{ {
#if TIM_MST_BIT_WIDTH == 16 uint32_t new_time = us_ticker_read();
uint32_t new_time; uint32_t elapsed_time = (((new_time - prev_time) & US_TICKER_MASK) + prev_tick_remainder);
if (mbed_sdk_inited) { prev_time = new_time;
// Apply the latest time recorded just before the sdk is inited uint32_t elapsed_ticks;
new_time = ticker_read_us(get_us_ticker_data()) + prev_time; // Speed optimisation for small time intervals, avoiding a potentially-slow C library divide.
prev_time = 0; // Use this time only once if (TIM_MST_BIT_WIDTH <= 16 || elapsed_time < 65536) {
return (new_time / 1000); elapsed_ticks = 0;
while (elapsed_time >= 1000) {
elapsed_ticks++;
elapsed_time -= 1000;
}
prev_tick_remainder = elapsed_time;
} else { } else {
new_time = us_ticker_read(); elapsed_ticks = elapsed_time / 1000;
elapsed_time += (new_time - prev_time) & 0xFFFF; // Only use the lower 16 bits prev_tick_remainder = elapsed_time % 1000;
prev_time = new_time;
return (elapsed_time / 1000);
} }
#else // 32-bit timer total_ticks += elapsed_ticks;
if (mbed_sdk_inited) { return total_ticks;
return (ticker_read_us(get_us_ticker_data()) / 1000);
} else {
return (us_ticker_read() / 1000);
}
#endif
} }
void HAL_SuspendTick(void) void HAL_SuspendTick(void)

View File

@ -42,9 +42,6 @@ void us_ticker_irq_handler(void);
// ************************************ 16-bit timer ************************************ // ************************************ 16-bit timer ************************************
#if TIM_MST_BIT_WIDTH == 16 #if TIM_MST_BIT_WIDTH == 16
extern uint32_t prev_time;
extern uint32_t elapsed_time;
#if defined(TARGET_STM32F0) #if defined(TARGET_STM32F0)
void timer_update_irq_handler(void) void timer_update_irq_handler(void)
{ {
@ -128,10 +125,6 @@ void init_16bit_timer(void)
#endif #endif
__HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1); __HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
// Used by HAL_GetTick()
prev_time = 0;
elapsed_time = 0;
} }
// ************************************ 32-bit timer ************************************ // ************************************ 32-bit timer ************************************