Skip to content

Commit a707fd1

Browse files
authored
Merge pull request #12915 from rajkan01/hal_gettick_api_optim
Optimise HAL_GetTick API
2 parents 1b2a68a + 4ab794b commit a707fd1

File tree

2 files changed

+22
-29
lines changed

2 files changed

+22
-29
lines changed

targets/TARGET_STM/hal_tick_overrides.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ 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
31-
// Variables also reset in us_ticker_init()
32-
uint32_t prev_time = 0;
33-
uint32_t elapsed_time = 0;
30+
#if TIM_MST_BIT_WIDTH <= 16
31+
static uint16_t prev_time;
32+
#else
33+
static uint32_t prev_time;
3434
#endif
35+
static uint32_t total_ticks;
36+
static uint16_t prev_tick_remainder;
3537

3638
// Overwrite default HAL functions defined as "weak"
3739

@@ -47,26 +49,24 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
4749

4850
uint32_t HAL_GetTick()
4951
{
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);
52+
uint32_t new_time = us_ticker_read();
53+
uint32_t elapsed_time = (((new_time - prev_time) & US_TICKER_MASK) + prev_tick_remainder);
54+
prev_time = new_time;
55+
uint32_t elapsed_ticks;
56+
// Speed optimisation for small time intervals, avoiding a potentially-slow C library divide.
57+
if (TIM_MST_BIT_WIDTH <= 16 || elapsed_time < 65536) {
58+
elapsed_ticks = 0;
59+
while (elapsed_time >= 1000) {
60+
elapsed_ticks++;
61+
elapsed_time -= 1000;
62+
}
63+
prev_tick_remainder = elapsed_time;
5764
} 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);
65+
elapsed_ticks = elapsed_time / 1000;
66+
prev_tick_remainder = elapsed_time % 1000;
6267
}
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
68+
total_ticks += elapsed_ticks;
69+
return total_ticks;
7070
}
7171

7272
void HAL_SuspendTick(void)

targets/TARGET_STM/us_ticker.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ void us_ticker_irq_handler(void);
4242
// ************************************ 16-bit timer ************************************
4343
#if TIM_MST_BIT_WIDTH == 16
4444

45-
extern uint32_t prev_time;
46-
extern uint32_t elapsed_time;
47-
4845
#if defined(TARGET_STM32F0)
4946
void timer_update_irq_handler(void)
5047
{
@@ -128,10 +125,6 @@ void init_16bit_timer(void)
128125
#endif
129126

130127
__HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
131-
132-
// Used by HAL_GetTick()
133-
prev_time = 0;
134-
elapsed_time = 0;
135128
}
136129

137130
// ************************************ 32-bit timer ************************************

0 commit comments

Comments
 (0)