Skip to content

fix(timer): Add check to avoid crashing #10069

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 59 additions & 11 deletions cores/esp32/esp32-hal-timer.c
Original file line number Diff line number Diff line change
@@ -37,17 +37,28 @@ struct timer_struct_t {
};

inline uint64_t timerRead(hw_timer_t *timer) {

if (timer == NULL) {
log_e("Timer handle is NULL");
return 0;
}
uint64_t value;
gptimer_get_raw_count(timer->timer_handle, &value);
return value;
}

void timerWrite(hw_timer_t *timer, uint64_t val) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
gptimer_set_raw_count(timer->timer_handle, val);
}

void timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
esp_err_t err = ESP_OK;
gptimer_alarm_config_t alarm_cfg = {
.alarm_count = alarm_value,
@@ -61,22 +72,37 @@ void timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64
}

uint32_t timerGetFrequency(hw_timer_t *timer) {
if (timer == NULL) {
return 0;
}
uint32_t frequency;
gptimer_get_resolution(timer->timer_handle, &frequency);
return frequency;
}

void timerStart(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
gptimer_start(timer->timer_handle);
timer->timer_started = true;
}

void timerStop(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
gptimer_stop(timer->timer_handle);
timer->timer_started = false;
}

void timerRestart(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
gptimer_set_raw_count(timer->timer_handle, 0);
}

@@ -129,17 +155,19 @@ hw_timer_t *timerBegin(uint32_t frequency) {
}

void timerEnd(hw_timer_t *timer) {
esp_err_t err = ESP_OK;
if (timer->timer_started == true) {
gptimer_stop(timer->timer_handle);
}
gptimer_disable(timer->timer_handle);
err = gptimer_del_timer(timer->timer_handle);
if (err != ESP_OK) {
log_e("Failed to destroy GPTimer, error num=%d", err);
return;
if (timer != NULL) {
esp_err_t err = ESP_OK;
if (timer->timer_started == true) {
gptimer_stop(timer->timer_handle);
}
gptimer_disable(timer->timer_handle);
err = gptimer_del_timer(timer->timer_handle);
if (err != ESP_OK) {
log_e("Failed to destroy GPTimer, error num=%d", err);
return;
}
free(timer);
}
free(timer);
}

bool IRAM_ATTR timerFnWrapper(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *args) {
@@ -156,6 +184,10 @@ bool IRAM_ATTR timerFnWrapper(gptimer_handle_t timer, const gptimer_alarm_event_
}

void timerAttachInterruptFunctionalArg(hw_timer_t *timer, void (*userFunc)(void *), void *arg) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
esp_err_t err = ESP_OK;
gptimer_event_callbacks_t cbs = {
.on_alarm = timerFnWrapper,
@@ -187,6 +219,10 @@ void timerAttachInterrupt(hw_timer_t *timer, voidFuncPtr userFunc) {
}

void timerDetachInterrupt(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return;
}
esp_err_t err = ESP_OK;
err = gptimer_set_alarm_action(timer->timer_handle, NULL);
timer->interrupt_handle.fn = NULL;
@@ -197,18 +233,30 @@ void timerDetachInterrupt(hw_timer_t *timer) {
}

uint64_t timerReadMicros(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return 0;
}
uint64_t timer_val = timerRead(timer);
uint32_t frequency = timerGetFrequency(timer);
return timer_val * 1000000 / frequency;
}

uint64_t timerReadMilis(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return 0;
}
uint64_t timer_val = timerRead(timer);
uint32_t frequency = timerGetFrequency(timer);
return timer_val * 1000 / frequency;
}

double timerReadSeconds(hw_timer_t *timer) {
if (timer == NULL) {
log_e("Timer handle is NULL");
return 0;
}
uint64_t timer_val = timerRead(timer);
uint32_t frequency = timerGetFrequency(timer);
return (double)timer_val / frequency;
Loading