Skip to content

Commit a22fc21

Browse files
committed
Microlib slow division causes HAL_GetTick API performance issue, so optimized HAL_GetTick API to improve performance.
1 parent 918d679 commit a22fc21

File tree

2 files changed

+33
-25
lines changed

2 files changed

+33
-25
lines changed

targets/TARGET_STM/hal_tick_overrides.c

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ extern int mbed_sdk_inited;
2727
void init_16bit_timer(void);
2828
void init_32bit_timer(void);
2929

30-
#if TIM_MST_BIT_WIDTH == 16
3130
// Variables also reset in us_ticker_init()
31+
uint32_t total_ticks = 0;
3232
uint32_t prev_time = 0;
33-
uint32_t elapsed_time = 0;
34-
#endif
33+
uint16_t prev_tick_remainder = 0;
3534

3635
// Overwrite default HAL functions defined as "weak"
3736

@@ -47,26 +46,28 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
4746

4847
uint32_t HAL_GetTick()
4948
{
50-
#if TIM_MST_BIT_WIDTH == 16
51-
uint32_t new_time;
52-
if (mbed_sdk_inited) {
53-
// Apply the latest time recorded just before the sdk is inited
54-
new_time = ticker_read_us(get_us_ticker_data()) + prev_time;
55-
prev_time = 0; // Use this time only once
56-
return (new_time / 1000);
49+
uint32_t new_time = us_ticker_read();
50+
uint32_t elapsed_ticks = 0;
51+
uint32_t elapsed_time = (((new_time - prev_time) & US_TICKER_MASK) + prev_tick_remainder);
52+
prev_time = new_time;
53+
if (elapsed_time < 1000) { // elapsed time less than 1ms
54+
elapsed_ticks = 0;
55+
prev_tick_remainder = elapsed_time;
56+
} else if (elapsed_time < 2000) { // elapsed time less than 2ms
57+
elapsed_ticks = 1;
58+
prev_tick_remainder = elapsed_time - 1000;
59+
} else if (elapsed_time < 65536) { // For 16-bit ticker max value of 2^16 = 65536
60+
while (elapsed_time >= 1000) {
61+
elapsed_ticks++;
62+
elapsed_time -= 1000;
63+
}
64+
prev_tick_remainder = elapsed_time;
5765
} else {
58-
new_time = us_ticker_read();
59-
elapsed_time += (new_time - prev_time) & 0xFFFF; // Only use the lower 16 bits
60-
prev_time = new_time;
61-
return (elapsed_time / 1000);
66+
elapsed_ticks = elapsed_ticks / 1000;
67+
prev_tick_remainder = elapsed_time % 1000;
6268
}
63-
#else // 32-bit timer
64-
if (mbed_sdk_inited) {
65-
return (ticker_read_us(get_us_ticker_data()) / 1000);
66-
} else {
67-
return (us_ticker_read() / 1000);
68-
}
69-
#endif
69+
total_ticks += elapsed_ticks;
70+
return total_ticks;
7071
}
7172

7273
void HAL_SuspendTick(void)

targets/TARGET_STM/us_ticker.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,13 @@ const ticker_info_t *us_ticker_get_info()
3939

4040
void us_ticker_irq_handler(void);
4141

42+
extern uint32_t total_ticks;
43+
extern uint32_t prev_time;
44+
extern uint16_t prev_tick_remainder;
45+
4246
// ************************************ 16-bit timer ************************************
4347
#if TIM_MST_BIT_WIDTH == 16
4448

45-
extern uint32_t prev_time;
46-
extern uint32_t elapsed_time;
47-
4849
#if defined(TARGET_STM32F0)
4950
void timer_update_irq_handler(void)
5051
{
@@ -130,8 +131,9 @@ void init_16bit_timer(void)
130131
__HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
131132

132133
// Used by HAL_GetTick()
134+
total_ticks = 0;
133135
prev_time = 0;
134-
elapsed_time = 0;
136+
prev_tick_remainder = 0;
135137
}
136138

137139
// ************************************ 32-bit timer ************************************
@@ -216,6 +218,11 @@ void init_32bit_timer(void)
216218
#endif
217219

218220
__HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
221+
222+
// Used by HAL_GetTick()
223+
total_ticks = 0;
224+
prev_time = 0;
225+
prev_tick_remainder = 0;
219226
}
220227

221228
#endif // 16-bit/32-bit timer

0 commit comments

Comments
 (0)