Skip to content

Commit be77bd4

Browse files
authored
Resolve crash with timer interrupt functions called from ISR (#4684)
1 parent ef99cd7 commit be77bd4

File tree

1 file changed

+28
-28
lines changed

1 file changed

+28
-28
lines changed

Diff for: cores/esp32/esp32-hal-timer.c

+28-28
Original file line numberDiff line numberDiff line change
@@ -90,56 +90,56 @@ void IRAM_ATTR __timerISR(void * arg){
9090
}
9191
}
9292

93-
uint64_t timerRead(hw_timer_t *timer){
93+
uint64_t IRAM_ATTR timerRead(hw_timer_t *timer){
9494
timer->dev->update = 1;
9595
uint64_t h = timer->dev->cnt_high;
9696
uint64_t l = timer->dev->cnt_low;
9797
return (h << 32) | l;
9898
}
9999

100-
uint64_t timerAlarmRead(hw_timer_t *timer){
100+
uint64_t IRAM_ATTR timerAlarmRead(hw_timer_t *timer){
101101
uint64_t h = timer->dev->alarm_high;
102102
uint64_t l = timer->dev->alarm_low;
103103
return (h << 32) | l;
104104
}
105105

106-
void timerWrite(hw_timer_t *timer, uint64_t val){
106+
void IRAM_ATTR timerWrite(hw_timer_t *timer, uint64_t val){
107107
timer->dev->load_high = (uint32_t) (val >> 32);
108108
timer->dev->load_low = (uint32_t) (val);
109109
timer->dev->reload = 1;
110110
}
111111

112-
void timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload){
112+
void IRAM_ATTR timerAlarmWrite(hw_timer_t *timer, uint64_t alarm_value, bool autoreload){
113113
timer->dev->alarm_high = (uint32_t) (alarm_value >> 32);
114114
timer->dev->alarm_low = (uint32_t) alarm_value;
115115
timer->dev->config.autoreload = autoreload;
116116
}
117117

118-
void timerSetConfig(hw_timer_t *timer, uint32_t config){
118+
void IRAM_ATTR timerSetConfig(hw_timer_t *timer, uint32_t config){
119119
timer->dev->config.val = config;
120120
}
121121

122-
uint32_t timerGetConfig(hw_timer_t *timer){
122+
uint32_t IRAM_ATTR timerGetConfig(hw_timer_t *timer){
123123
return timer->dev->config.val;
124124
}
125125

126-
void timerSetCountUp(hw_timer_t *timer, bool countUp){
126+
void IRAM_ATTR timerSetCountUp(hw_timer_t *timer, bool countUp){
127127
timer->dev->config.increase = countUp;
128128
}
129129

130-
bool timerGetCountUp(hw_timer_t *timer){
130+
bool IRAM_ATTR timerGetCountUp(hw_timer_t *timer){
131131
return timer->dev->config.increase;
132132
}
133133

134-
void timerSetAutoReload(hw_timer_t *timer, bool autoreload){
134+
void IRAM_ATTR timerSetAutoReload(hw_timer_t *timer, bool autoreload){
135135
timer->dev->config.autoreload = autoreload;
136136
}
137137

138-
bool timerGetAutoReload(hw_timer_t *timer){
138+
bool IRAM_ATTR timerGetAutoReload(hw_timer_t *timer){
139139
return timer->dev->config.autoreload;
140140
}
141141

142-
void timerSetDivider(hw_timer_t *timer, uint16_t divider){//2 to 65536
142+
void IRAM_ATTR timerSetDivider(hw_timer_t *timer, uint16_t divider){//2 to 65536
143143
if(!divider){
144144
divider = 0xFFFF;
145145
} else if(divider == 1){
@@ -151,41 +151,41 @@ void timerSetDivider(hw_timer_t *timer, uint16_t divider){//2 to 65536
151151
timer->dev->config.enable = timer_en;
152152
}
153153

154-
uint16_t timerGetDivider(hw_timer_t *timer){
154+
uint16_t IRAM_ATTR timerGetDivider(hw_timer_t *timer){
155155
return timer->dev->config.divider;
156156
}
157157

158-
void timerStart(hw_timer_t *timer){
158+
void IRAM_ATTR timerStart(hw_timer_t *timer){
159159
timer->dev->config.enable = 1;
160160
}
161161

162-
void timerStop(hw_timer_t *timer){
162+
void IRAM_ATTR timerStop(hw_timer_t *timer){
163163
timer->dev->config.enable = 0;
164164
}
165165

166-
void timerRestart(hw_timer_t *timer){
166+
void IRAM_ATTR timerRestart(hw_timer_t *timer){
167167
timer->dev->config.enable = 0;
168168
timer->dev->reload = 1;
169169
timer->dev->config.enable = 1;
170170
}
171171

172-
bool timerStarted(hw_timer_t *timer){
172+
bool IRAM_ATTR timerStarted(hw_timer_t *timer){
173173
return timer->dev->config.enable;
174174
}
175175

176-
void timerAlarmEnable(hw_timer_t *timer){
176+
void IRAM_ATTR timerAlarmEnable(hw_timer_t *timer){
177177
timer->dev->config.alarm_en = 1;
178178
}
179179

180-
void timerAlarmDisable(hw_timer_t *timer){
180+
void IRAM_ATTR timerAlarmDisable(hw_timer_t *timer){
181181
timer->dev->config.alarm_en = 0;
182182
}
183183

184-
bool timerAlarmEnabled(hw_timer_t *timer){
184+
bool IRAM_ATTR timerAlarmEnabled(hw_timer_t *timer){
185185
return timer->dev->config.alarm_en;
186186
}
187187

188-
static void _on_apb_change(void * arg, apb_change_ev_t ev_type, uint32_t old_apb, uint32_t new_apb){
188+
static void IRAM_ATTR _on_apb_change(void * arg, apb_change_ev_t ev_type, uint32_t old_apb, uint32_t new_apb){
189189
hw_timer_t * timer = (hw_timer_t *)arg;
190190
if(ev_type == APB_BEFORE_CHANGE){
191191
timer->dev->config.enable = 0;
@@ -197,7 +197,7 @@ static void _on_apb_change(void * arg, apb_change_ev_t ev_type, uint32_t old_apb
197197
}
198198
}
199199

200-
hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp){
200+
hw_timer_t * IRAM_ATTR timerBegin(uint8_t num, uint16_t divider, bool countUp){
201201
if(num > 3){
202202
return NULL;
203203
}
@@ -222,13 +222,13 @@ hw_timer_t * timerBegin(uint8_t num, uint16_t divider, bool countUp){
222222
return timer;
223223
}
224224

225-
void timerEnd(hw_timer_t *timer){
225+
void IRAM_ATTR timerEnd(hw_timer_t *timer){
226226
timer->dev->config.enable = 0;
227227
timerAttachInterrupt(timer, NULL, false);
228228
removeApbChangeCallback(timer, _on_apb_change);
229229
}
230230

231-
void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge){
231+
void IRAM_ATTR timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge){
232232
static bool initialized = false;
233233
static intr_handle_t intr_handle = NULL;
234234
if(intr_handle){
@@ -279,29 +279,29 @@ void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge){
279279
}
280280
}
281281

282-
void timerDetachInterrupt(hw_timer_t *timer){
282+
void IRAM_ATTR timerDetachInterrupt(hw_timer_t *timer){
283283
timerAttachInterrupt(timer, NULL, false);
284284
}
285285

286-
uint64_t timerReadMicros(hw_timer_t *timer){
286+
uint64_t IRAM_ATTR timerReadMicros(hw_timer_t *timer){
287287
uint64_t timer_val = timerRead(timer);
288288
uint16_t div = timerGetDivider(timer);
289289
return timer_val * div / (getApbFrequency() / 1000000);
290290
}
291291

292-
double timerReadSeconds(hw_timer_t *timer){
292+
double IRAM_ATTR timerReadSeconds(hw_timer_t *timer){
293293
uint64_t timer_val = timerRead(timer);
294294
uint16_t div = timerGetDivider(timer);
295295
return (double)timer_val * div / getApbFrequency();
296296
}
297297

298-
uint64_t timerAlarmReadMicros(hw_timer_t *timer){
298+
uint64_t IRAM_ATTR timerAlarmReadMicros(hw_timer_t *timer){
299299
uint64_t timer_val = timerAlarmRead(timer);
300300
uint16_t div = timerGetDivider(timer);
301301
return timer_val * div / (getApbFrequency() / 1000000);
302302
}
303303

304-
double timerAlarmReadSeconds(hw_timer_t *timer){
304+
double IRAM_ATTR timerAlarmReadSeconds(hw_timer_t *timer){
305305
uint64_t timer_val = timerAlarmRead(timer);
306306
uint16_t div = timerGetDivider(timer);
307307
return (double)timer_val * div / getApbFrequency();

0 commit comments

Comments
 (0)