1
6
7
12
13
14
15
16
20
21
22
26
27
31
32
33
34
35
39
40
41
42
43
44
45
46
53
54
63
64
65
66
67
68
/* ... */
#include "esp_timer_impl.h"
#include "esp_timer.h"
#include "esp_err.h"
#include "esp_task.h"
#include "esp_attr.h"5 includes
portMUX_TYPE s_time_update_lock = portMUX_INITIALIZER_UNLOCKED;
/* ... */
uint64_t timestamp_id[2] = { UINT64_MAX, UINT64_MAX };
void esp_timer_impl_lock(void)
{
portENTER_CRITICAL(&s_time_update_lock);
}{ ... }
void esp_timer_impl_unlock(void)
{
portEXIT_CRITICAL(&s_time_update_lock);
}{ ... }
void esp_timer_private_lock(void) __attribute__((alias("esp_timer_impl_lock")));
void esp_timer_private_unlock(void) __attribute__((alias("esp_timer_impl_unlock")));
void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
{
esp_timer_impl_set_alarm_id(timestamp, 0);
}{ ... }
#ifdef CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD
void IRAM_ATTR esp_timer_impl_try_to_set_next_alarm(void)
{
portENTER_CRITICAL_ISR(&s_time_update_lock);
unsigned now_alarm_idx;
unsigned next_alarm_idx;
if (timestamp_id[0] < timestamp_id[1]) {
now_alarm_idx = 0;
next_alarm_idx = 1;
}{...} else {
now_alarm_idx = 1;
next_alarm_idx = 0;
}{...}
if (timestamp_id[next_alarm_idx] != UINT64_MAX) {
esp_timer_impl_set_alarm_id(UINT64_MAX, now_alarm_idx);
}{...} else {
timestamp_id[now_alarm_idx] = UINT64_MAX;
}{...}
portEXIT_CRITICAL_ISR(&s_time_update_lock);
}{...}
/* ... */#endif
uint64_t IRAM_ATTR esp_timer_impl_get_min_period_us(void)
{
return 50;
}{ ... }