Merge pull request #7508 from mprse/ticker_free

Ticker free() - requirements, pseudo code, tests, implementation
pull/7604/merge
Cruz Monrreal 2018-08-02 23:05:14 -05:00 committed by GitHub
commit ae40a09036
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
66 changed files with 502 additions and 28 deletions

View File

@ -103,6 +103,12 @@ static void stub_fire_interrupt(void)
/* do nothing. */
}
/* User ticker interface function. */
static void stub_free(void)
{
/* do nothing. */
}
ticker_info_t info =
{ TICKER_FREQ_1MHZ, TICKER_BITS };
@ -122,6 +128,7 @@ static const ticker_interface_t us_interface = {
.clear_interrupt = stub_clear_interrupt,
.set_interrupt = stub_set_interrupt,
.fire_interrupt = stub_fire_interrupt,
.free = stub_free,
.get_info = stub_get_info,
};

View File

@ -33,6 +33,8 @@ extern "C" {
#error [NOT_SUPPORTED] test not supported
#endif
#define US_PER_S 1000000
#define FORCE_OVERFLOW_TEST (false)
#define TICKER_INT_VAL 500
#define TICKER_DELTA 10
@ -43,10 +45,11 @@ extern "C" {
#define US_TICKER_OVERFLOW_DELTA2 60
#define TICKER_100_TICKS 100
#define TICKER_500_TICKS 500
#define MAX_FUNC_EXEC_TIME_US 20
#define DELTA_FUNC_EXEC_TIME_US 5
#define NUM_OF_CALLS 1000
#define NUM_OF_CALLS 100
#define NUM_OF_CYCLES 100000
@ -149,6 +152,19 @@ void wait_cycles(volatile unsigned int cycles)
while (cycles--);
}
/* Auxiliary function to determine how long ticker function are executed.
* This function returns number of us between <start_ticks> and <stop_ticks>
* taking into account counter roll-over, counter size and frequency.
*/
uint32_t diff_us(uint32_t start_ticks, uint32_t stop_ticks, const ticker_info_t * info)
{
uint32_t counter_mask = ((1 << info->bits) - 1);
uint32_t diff_ticks = ((stop_ticks - start_ticks) & counter_mask);
return (uint32_t) ((uint64_t) diff_ticks * US_PER_S / info->frequency);
}
/* Test that ticker_init can be called multiple times and
* ticker_init allows the ticker to keep counting and disables the ticker interrupt.
*/
@ -419,64 +435,134 @@ void ticker_increment_test(void)
/* Test that common ticker functions complete with the required amount of time. */
void ticker_speed_test(void)
{
Timer timer;
int counter = NUM_OF_CALLS;
uint32_t start;
uint32_t stop;
const ticker_info_t * us_ticker_info = get_us_ticker_data()->interface->get_info();
/* Free function will disable the ticker. For time measurement
* we need to use other one if available.
*/
#if DEVICE_LPTICKER
const ticker_info_t * lp_ticker_info = get_lp_ticker_data()->interface->get_info();
bool us_ticker_test = (intf == get_us_ticker_data()->interface);
#endif
/* ---- Test ticker_read function. ---- */
timer.reset();
timer.start();
start = us_ticker_read();
while (counter--) {
intf->read();
}
timer.stop();
stop = us_ticker_read();
TEST_ASSERT(timer.read_us() < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
TEST_ASSERT(diff_us(start, stop, us_ticker_info) < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
/* ---- Test ticker_clear_interrupt function. ---- */
counter = NUM_OF_CALLS;
timer.reset();
timer.start();
start = us_ticker_read();
while (counter--) {
intf->clear_interrupt();
}
timer.stop();
stop = us_ticker_read();
TEST_ASSERT(timer.read_us() < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
TEST_ASSERT(diff_us(start, stop, us_ticker_info) < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
/* ---- Test ticker_set_interrupt function. ---- */
counter = NUM_OF_CALLS;
timer.reset();
timer.start();
start = us_ticker_read();
while (counter--) {
intf->set_interrupt(0);
}
timer.stop();
stop = us_ticker_read();
TEST_ASSERT(timer.read_us() < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
TEST_ASSERT(diff_us(start, stop, us_ticker_info) < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
/* ---- Test fire_interrupt function. ---- */
counter = NUM_OF_CALLS;
timer.reset();
timer.start();
start = us_ticker_read();
while (counter--) {
intf->fire_interrupt();
}
timer.stop();
stop = us_ticker_read();
TEST_ASSERT(timer.read_us() < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
TEST_ASSERT(diff_us(start, stop, us_ticker_info) < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
/* ---- Test disable_interrupt function. ---- */
counter = NUM_OF_CALLS;
timer.reset();
timer.start();
start = us_ticker_read();
while (counter--) {
intf->disable_interrupt();
}
timer.stop();
stop = us_ticker_read();
TEST_ASSERT(timer.read_us() < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
TEST_ASSERT(diff_us(start, stop, us_ticker_info) < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
/* ---- Test free function. ---- */
#if DEVICE_LPTICKER
counter = NUM_OF_CALLS;
if (us_ticker_test) {
lp_ticker_init();
}
start = us_ticker_test ? lp_ticker_read() : us_ticker_read();
while (counter--) {
intf->free();
}
stop = us_ticker_test ? lp_ticker_read() : us_ticker_read();
TEST_ASSERT(diff_us(start, stop, us_ticker_info) < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
#endif
}
/* Test that ticker_free disables ticker interrupt. */
void ticker_free_interrupt_test(void)
{
overflow_protect();
uint32_t cycles_500_ticks = 50;
uint32_t reference_ticks_count = 0;
while(reference_ticks_count < TICKER_500_TICKS) {
cycles_500_ticks *= 2;
const uint32_t start = intf->read();
wait_cycles(cycles_500_ticks);
reference_ticks_count = intf->read() - start;
}
intFlag = 0;
intf->set_interrupt(intf->read() + (TICKER_500_TICKS / 2));
intf->free();
wait_cycles(cycles_500_ticks);
intf->init();
TEST_ASSERT_EQUAL(0, intFlag);
}
/* Test that ticker can be successfully re-initialized after free(). */
void ticker_init_free_test(void)
{
intf->free();
intf->init();
overflow_protect();
intFlag = 0;
const uint32_t tick_count = intf->read();
intf->set_interrupt(intf->read() + TICKER_INT_VAL);
while (intf->read() < (tick_count + TICKER_INT_VAL - TICKER_DELTA)) {
TEST_ASSERT_EQUAL_INT_MESSAGE(0, intFlag, "Interrupt fired too early");
}
while (intf->read() < (tick_count + TICKER_INT_VAL + TICKER_DELTA)) {
}
TEST_ASSERT_EQUAL(1, intFlag);
}
utest::v1::status_t us_ticker_setup(const Case *const source, const size_t index_of_case)
{
intf = get_us_ticker_data()->interface;
@ -551,6 +637,8 @@ Case cases[] = {
Case("Microsecond ticker overflow test", us_ticker_setup, ticker_overflow_test, us_ticker_teardown),
Case("Microsecond ticker increment test", us_ticker_setup, ticker_increment_test, us_ticker_teardown),
Case("Microsecond ticker speed test", us_ticker_setup, ticker_speed_test, us_ticker_teardown),
Case("Microsecond ticker free interrupt test", us_ticker_setup, ticker_free_interrupt_test, us_ticker_teardown),
Case("Microsecond re-init after free test", us_ticker_setup, ticker_init_free_test, us_ticker_teardown),
#if DEVICE_LPTICKER
Case("lp ticker init is safe to call repeatedly", lp_ticker_setup, ticker_init_test, lp_ticker_teardown),
Case("lp ticker info test", lp_ticker_setup, ticker_info_test, lp_ticker_teardown),
@ -561,6 +649,8 @@ Case cases[] = {
Case("lp ticker overflow test", lp_ticker_setup, ticker_overflow_test, lp_ticker_teardown),
Case("lp ticker increment test", lp_ticker_setup, ticker_increment_test, lp_ticker_teardown),
Case("lp ticker speed test", lp_ticker_setup, ticker_speed_test, lp_ticker_teardown),
Case("lp ticker free interrupt test", lp_ticker_setup, ticker_free_interrupt_test, lp_ticker_teardown),
Case("lp ticker re-init after free test", lp_ticker_setup, ticker_init_free_test, lp_ticker_teardown),
#endif
};

View File

@ -118,6 +118,21 @@ void ticker_speed_test(void);
*/
void ticker_overflow_test(void);
/** Test ticker_free disables ticker interrupt.
*
* Given ticker is available.
* When ticker interrupt is set and then ticker_free is called.
* Then ticker interrupt is not triggered.
*/
void ticker_free_interrupt_test(void);
/** Test that ticker can be successfully re-initialized after free().
*
* Given ticker is available.
* When ticker has been re-initialized after free().
* Then ticker counts and generates interrupts.
*/
void ticker_init_free_test(void);
/**@}*/
#ifdef __cplusplus

View File

@ -99,6 +99,10 @@ void mock_ticker_fire_interrupt()
{
}
void mock_ticker_free()
{
}
const ticker_info_t *mock_ticker_get_info()
{
static const ticker_info_t mock_ticker_info = {
@ -115,6 +119,7 @@ ticker_interface_t mock_ticker_interface = {
.clear_interrupt = mock_ticker_clear_interrupt,
.set_interrupt = mock_ticker_set_interrupt,
.fire_interrupt = mock_ticker_fire_interrupt,
.free = mock_ticker_free,
.get_info = mock_ticker_get_info,
};

View File

@ -35,6 +35,7 @@ static const ticker_interface_t lp_interface = {
#endif
.fire_interrupt = lp_ticker_fire_interrupt,
.get_info = lp_ticker_get_info,
.free = lp_ticker_free,
};
static const ticker_data_t lp_data = {

View File

@ -27,6 +27,7 @@ static const ticker_interface_t us_interface = {
.set_interrupt = us_ticker_set_interrupt,
.fire_interrupt = us_ticker_fire_interrupt,
.get_info = us_ticker_get_info,
.free = us_ticker_free,
};
static const ticker_data_t us_data = {

View File

@ -64,6 +64,7 @@ typedef struct {
void (*clear_interrupt)(void); /**< Clear interrupt function */
void (*set_interrupt)(timestamp_t timestamp); /**< Set interrupt function */
void (*fire_interrupt)(void); /**< Fire interrupt right-away */
void (*free)(void); /**< Disable function */
const ticker_info_t *(*get_info)(void); /**< Return info about this ticker's implementation */
} ticker_interface_t;

View File

@ -73,6 +73,8 @@ extern "C" {
* Verified by ::ticker_fire_now_test
* * The ticker operations ticker_read, ticker_clear_interrupt, ticker_set_interrupt and ticker_fire_interrupt
* take less than 20us to complete - Verified by ::ticker_speed_test
* * The function ticker_free disables the ticker interrupt - ::ticker_free_interrupt_test
* * The function ticker_init re-initializes ticker after has been disabled by means of ticker_free - Verified by ::ticker_init_free_test
*
* # Undefined behavior
* * Calling any function other than ticker_init before the initialization of the ticker
@ -170,6 +172,25 @@ void us_ticker_init(void);
* except us_ticker_init(), calling any function other than init is undefined.
*
* @note This function stops the ticker from counting.
*
* Pseudo Code:
* @code
* uint32_t us_ticker_free()
* {
* // Disable timer
* TIMER_CTRL &= ~TIMER_CTRL_ENABLE_Msk;
*
* // Disable the compare interrupt
* TIMER_CTRL &= ~TIMER_CTRL_COMPARE_ENABLE_Msk;
*
* // Disable timer interrupt
* NVIC_DisableIRQ(TIMER_IRQn);
*
* // Disable clock gate so processor cannot read TIMER registers
* POWER_CTRL &= ~POWER_CTRL_TIMER_Msk;
* }
* @endcode
*
*/
void us_ticker_free(void);

View File

@ -152,4 +152,9 @@ void lp_ticker_clear_interrupt(void)
DualTimer_ClearInterrupt(DUALTIMER0);
}
void lp_ticker_free(void)
{
}
#endif

View File

@ -111,3 +111,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
Timer_ClearInterrupt(TIMER0);
}
void us_ticker_free(void)
{
}

View File

@ -108,6 +108,11 @@ void lp_ticker_fire_interrupt(void)
cmsdk_ticker_fire_interrupt(&timer_data);
}
void lp_ticker_free(void)
{
}
void TIMER1_IRQHandler(void)
{
cmsdk_ticker_irq_handler(&timer_data);

View File

@ -112,6 +112,11 @@ void us_ticker_fire_interrupt(void)
cmsdk_ticker_fire_interrupt(&timer_data);
}
void us_ticker_free(void)
{
}
void TIMER0_IRQHandler(void)
{
cmsdk_ticker_irq_handler(&timer_data);

View File

@ -87,3 +87,8 @@ void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER2->TimerIntClr = 0x1;
}
void us_ticker_free(void)
{
}

View File

@ -81,3 +81,8 @@ void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER2->TimerIntClr = 0x1;
}
void us_ticker_free(void)
{
}

View File

@ -355,6 +355,10 @@ void us_ticker_fire_interrupt(void)
event_timer(); // enable the timer and interrupt
}
void us_ticker_free(void)
{
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, false);
}
/*
** EOF

View File

@ -353,6 +353,10 @@ void us_ticker_fire_interrupt(void)
event_timer(); // enable the timer and interrupt
}
void us_ticker_free(void)
{
adi_tmr_Enable(ADI_TMR_DEVICE_GP2, false);
}
/*
** EOF

View File

@ -167,3 +167,8 @@ void us_ticker_clear_interrupt(void)
tc_clear_interrupt(&us_ticker_module, TC_CALLBACK_CC_CHANNEL0);
NVIC_ClearPendingIRQ(TICKER_COUNTER_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -131,3 +131,8 @@ void lp_ticker_clear_interrupt(void)
{
NVIC_ClearPendingIRQ(TICKER_COUNTER_IRQn2);
}
void lp_ticker_free(void)
{
}

View File

@ -186,3 +186,8 @@ void us_ticker_clear_interrupt(void)
{
NVIC_ClearPendingIRQ(TICKER_COUNTER_IRQn1);
}
void us_ticker_free(void)
{
}

View File

@ -158,3 +158,8 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT_TICKER_IRQ);
}
void us_ticker_free(void)
{
}

View File

@ -81,3 +81,8 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -223,3 +223,8 @@ void us_ticker_fire_interrupt(void)
#endif
}
void us_ticker_free(void)
{
}

View File

@ -136,3 +136,8 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -136,3 +136,16 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
PIT_StopTimer(PIT, kPIT_Chnl_3);
PIT_StopTimer(PIT, kPIT_Chnl_2);
PIT_StopTimer(PIT, kPIT_Chnl_1);
PIT_StopTimer(PIT, kPIT_Chnl_0);
PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
NVIC_DisableIRQ(PIT3_IRQn);
us_ticker_inited = false;
}

View File

@ -152,3 +152,8 @@ void us_ticker_fire_interrupt(void)
NVIC_SetPendingIRQ(TPM2_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -152,3 +152,8 @@ void us_ticker_fire_interrupt(void)
NVIC_SetPendingIRQ(TPM2_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -137,3 +137,8 @@ void us_ticker_fire_interrupt(void)
NVIC_SetPendingIRQ(PIT0_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -136,3 +136,16 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
PIT_StopTimer(PIT, kPIT_Chnl_3);
PIT_StopTimer(PIT, kPIT_Chnl_2);
PIT_StopTimer(PIT, kPIT_Chnl_1);
PIT_StopTimer(PIT, kPIT_Chnl_0);
PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
NVIC_DisableIRQ(PIT3_IRQn);
us_ticker_inited = false;
}

View File

@ -152,3 +152,14 @@ void us_ticker_fire_interrupt(void)
NVIC_SetPendingIRQ(TPM2_IRQn);
}
void us_ticker_free(void)
{
PIT_StopTimer(PIT, kPIT_Chnl_1);
PIT_StopTimer(PIT, kPIT_Chnl_0);
TPM_DisableInterrupts(TPM2, kTPM_TimeOverflowInterruptEnable);
NVIC_DisableIRQ(TPM2_IRQn);
us_ticker_inited = false;
}

View File

@ -136,3 +136,16 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
PIT_StopTimer(PIT, kPIT_Chnl_3);
PIT_StopTimer(PIT, kPIT_Chnl_2);
PIT_StopTimer(PIT, kPIT_Chnl_1);
PIT_StopTimer(PIT, kPIT_Chnl_0);
PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
NVIC_DisableIRQ(PIT3_IRQn);
us_ticker_inited = false;
}

View File

@ -136,3 +136,8 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -70,6 +70,7 @@ void us_ticker_init(void)
PIT_StopTimer(PIT, kPIT_Chnl_2);
PIT_SetTimerPeriod(PIT, kPIT_Chnl_2, busClock / 1000000 - 1);
PIT_SetTimerChainMode(PIT, kPIT_Chnl_3, true);
PIT_ClearStatusFlags(PIT, kPIT_Chnl_3, PIT_TFLG_TIF_MASK);
NVIC_SetVector(PIT3_IRQn, (uint32_t) pit_isr);
NVIC_EnableIRQ(PIT3_IRQn);
PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
@ -136,3 +137,16 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT3_IRQn);
}
void us_ticker_free(void)
{
PIT_StartTimer(PIT, kPIT_Chnl_3);
PIT_StartTimer(PIT, kPIT_Chnl_2);
PIT_StartTimer(PIT, kPIT_Chnl_1);
PIT_StartTimer(PIT, kPIT_Chnl_0);
PIT_DisableInterrupts(PIT, kPIT_Chnl_3, kPIT_TimerInterruptEnable);
NVIC_DisableIRQ(PIT3_IRQn);
us_ticker_inited = false;
}

View File

@ -69,6 +69,7 @@ void lp_ticker_init(void)
lp_ticker_inited = true;
} else {
LPTMR_DisableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
NVIC_EnableIRQ(LPTMR0_IRQn);
}
}
@ -117,4 +118,10 @@ void lp_ticker_clear_interrupt(void)
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
}
void lp_ticker_free(void)
{
LPTMR_DisableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
NVIC_DisableIRQ(LPTMR0_IRQn);
}
#endif /* DEVICE_LPTICKER */

View File

@ -255,3 +255,8 @@ uint32_t lp_ticker_read(void)
{
return rtc_read64();
}
void lp_ticker_free(void)
{
}

View File

@ -268,3 +268,8 @@ void us_ticker_set(timestamp_t timestamp)
NVIC_SetPendingIRQ(US_TIMER_IRQn);
}
}
void us_ticker_free(void)
{
}

View File

@ -252,3 +252,8 @@ inline uint32_t lp_ticker_read(void)
{
return rtc_read64();
}
void lp_ticker_free(void)
{
}

View File

@ -268,3 +268,8 @@ void us_ticker_set(timestamp_t timestamp)
NVIC_SetPendingIRQ(US_TIMER_IRQn);
}
}
void us_ticker_free(void)
{
}

View File

@ -306,3 +306,8 @@ inline uint32_t lp_ticker_read(void)
{
return rtc_read64();
}
void lp_ticker_free(void)
{
}

View File

@ -299,3 +299,8 @@ void us_ticker_set(timestamp_t timestamp)
NVIC_SetPendingIRQ(US_TIMER_IRQn);
}
}
void us_ticker_free(void)
{
}

View File

@ -318,6 +318,11 @@ void us_ticker_clear_interrupt(void)
NRF_RTC1->EVENTS_COMPARE[0] = 0;
}
void us_ticker_free(void)
{
}
#if defined (__CC_ARM) /* ARMCC Compiler */

View File

@ -180,6 +180,15 @@ void common_rtc_init(void)
m_common_rtc_enabled = true;
}
void common_rtc_free()
{
nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_STOP);
nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK);
NVIC_DisableIRQ(nrf_drv_get_IRQn(COMMON_RTC_INSTANCE));
m_common_rtc_enabled = false;
}
void common_rtc_set_interrupt(uint32_t ticks_count, uint32_t cc_channel,
uint32_t int_mask)
{

View File

@ -36,8 +36,7 @@ void lp_ticker_init(void)
void lp_ticker_free(void)
{
// A common counter is used for RTC, lp_ticker and us_ticker, so it can't be
// disabled here, but this does not cause any extra cost.
common_rtc_free();
}
uint32_t lp_ticker_read()

View File

@ -140,8 +140,7 @@ void us_ticker_clear_interrupt(void)
void us_ticker_free(void)
{
nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_STOP);
nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0));
NVIC_DisableIRQ(TIMER1_IRQn);
us_ticker_initialized = false;
}

View File

@ -65,3 +65,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
}

View File

@ -65,3 +65,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
}

View File

@ -65,3 +65,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
}

View File

@ -65,3 +65,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
}

View File

@ -86,3 +86,8 @@ void us_ticker_clear_interrupt(void) {
// Clear SCT3 event 0 interrupt flag
LPC_SCT3->EVFLAG = (1 << 0);
}
void us_ticker_free(void)
{
}

View File

@ -77,3 +77,11 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
US_TICKER_TIMER->TCR = 0;
US_TICKER_TIMER->MCR &= ~1;
NVIC_DisableIRQ(US_TICKER_TIMER_IRQn);
}

View File

@ -67,3 +67,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
}

View File

@ -67,3 +67,8 @@ void us_ticker_disable_interrupt(void) {
void us_ticker_clear_interrupt(void) {
US_TICKER_TIMER->IR = 1;
}
void us_ticker_free(void)
{
}

View File

@ -136,3 +136,8 @@ void us_ticker_clear_interrupt() {
ticker_expired_count_us += ticker_fullcount_us;
}
}
void us_ticker_free(void)
{
}

View File

@ -109,3 +109,8 @@ void us_ticker_clear_interrupt() {
ticker_expired_count_us += ticker_fullcount_us;
}
}
void us_ticker_free(void)
{
}

View File

@ -112,4 +112,9 @@ void lp_ticker_clear_interrupt(void)
GPT_ClearStatusFlags(GPT2, kGPT_OutputCompare1Flag);
}
void lp_ticker_free(void)
{
}
#endif /* DEVICE_LPTICKER */

View File

@ -140,3 +140,8 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(PIT_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -97,3 +97,11 @@ void us_ticker_fire_interrupt(void)
{
NVIC_SetPendingIRQ(CTIMER1_IRQn);
}
void us_ticker_free(void)
{
CTIMER_StopTimer(CTIMER1);
CTIMER1->MCR &= ~1;
NVIC_DisableIRQ(CTIMER1_IRQn);
us_ticker_inited = false;
}

View File

@ -203,3 +203,8 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
// we set the full reminder of 16 bit, the next ISR will do the upper part
ticker_set(delta & 0xFFFF);
}
void us_ticker_free(void)
{
}

View File

@ -119,3 +119,8 @@ void us_ticker_disable_interrupt(void)
void us_ticker_clear_interrupt(void)
{
}
void us_ticker_free(void)
{
HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId);
}

View File

@ -229,7 +229,10 @@ void lp_ticker_clear_interrupt(void)
NVIC_ClearPendingIRQ(LPTIM1_IRQn);
}
void lp_ticker_free(void)
{
lp_ticker_disable_interrupt();
}
/*****************************************************************/
/* lpticker_lptim config is 0 or not defined in json config file */
@ -275,7 +278,12 @@ void lp_ticker_disable_interrupt(void)
void lp_ticker_clear_interrupt(void)
{
NVIC_DisableIRQ(RTC_WKUP_IRQn);
lp_ticker_disable_interrupt();
}
void lp_ticker_free(void)
{
lp_ticker_disable_interrupt();
}
#endif /* MBED_CONF_TARGET_LPTICKER_LPTIM */

View File

@ -206,6 +206,7 @@ void us_ticker_init(void)
{
// Timer is already initialized in HAL_InitTick()
__HAL_TIM_DISABLE_IT(&TimMasterHandle, TIM_IT_CC1);
HAL_TIM_OC_Start(&TimMasterHandle, TIM_CHANNEL_1);
}
uint32_t us_ticker_read()
@ -256,3 +257,10 @@ void restore_timer_ctx(void)
__HAL_TIM_SET_COMPARE(&TimMasterHandle, TIM_CHANNEL_1, timer_ccr1_reg);
TIM_MST->DIER = timer_dier_reg;
}
void us_ticker_free(void)
{
HAL_TIM_OC_Stop(&TimMasterHandle, TIM_CHANNEL_1);
us_ticker_disable_interrupt();
}

View File

@ -107,3 +107,8 @@ void us_ticker_clear_interrupt(void)
{
//no flags to clear
}
void us_ticker_free(void)
{
}

View File

@ -83,3 +83,8 @@ void us_ticker_clear_interrupt(void)
TSB_T32A0->STC = T32A_INT_MASK;
NVIC_ClearPendingIRQ(INTT32A00C_IRQn);
}
void us_ticker_free(void)
{
}

View File

@ -131,3 +131,8 @@ void us_ticker_clear_interrupt(void)
{
// No flag to clear
}
void us_ticker_free(void)
{
}

View File

@ -130,3 +130,8 @@ void us_ticker_clear_interrupt(void)
{
DUALTIMER_IntClear(TIMER_0);
}
void us_ticker_free(void)
{
}

View File

@ -346,3 +346,8 @@ void lp_ticker_clear_interrupt(void)
g_user_interrupt_pending = false;
g_user_interrupt_set = false;
}
void lp_ticker_free(void)
{
}

View File

@ -251,3 +251,8 @@ void us_ticker_clear_interrupt(void)
g_timer_extra_loops_required = 0;
g_us_overflow_increment = 0;
}
void us_ticker_free(void)
{
}