|
48 | 48 | constexpr int32_t MAXIRQTICKSCCYS = microsecondsToClockCycles(10000);
|
49 | 49 | // Maximum servicing time for any single IRQ
|
50 | 50 | constexpr uint32_t ISRTIMEOUTCCYS = microsecondsToClockCycles(18);
|
51 |
| -// The SDK and hardware take some time to actually get to our NMI code, so |
52 |
| -// decrement the next IRQ's timer value by a bit so we can actually catch the |
53 |
| -// real CPU cycle count we want for the waveforms. |
54 |
| -constexpr int32_t DELTAIRQCCYS = clockCyclesPerMicrosecond() == 160 ? |
55 |
| - microsecondsToClockCycles(1) >> 1 : microsecondsToClockCycles(1); |
56 | 51 | // The latency between in-ISR rearming of the timer and the earliest firing
|
57 | 52 | constexpr int32_t IRQLATENCYCCYS = clockCyclesPerMicrosecond() == 160 ?
|
58 | 53 | microsecondsToClockCycles(1) >> 1 : microsecondsToClockCycles(1);
|
@@ -187,7 +182,7 @@ int startWaveformClockCycles(uint8_t pin, uint32_t highCcys, uint32_t lowCcys,
|
187 | 182 | if (!waveform.timer1Running) {
|
188 | 183 | initTimer();
|
189 | 184 | }
|
190 |
| - else if (T1V > ((clockCyclesPerMicrosecond() == 160) ? (IRQLATENCYCCYS + DELTAIRQCCYS) >> 1 : IRQLATENCYCCYS + DELTAIRQCCYS)) { |
| 185 | + else if (T1V > ((clockCyclesPerMicrosecond() == 160) ? IRQLATENCYCCYS >> 1 : IRQLATENCYCCYS)) { |
191 | 186 | // Must not interfere if Timer is due shortly
|
192 | 187 | timer1_write(IRQLATENCYCCYS);
|
193 | 188 | }
|
@@ -224,7 +219,7 @@ int ICACHE_RAM_ATTR stopWaveform(uint8_t pin) {
|
224 | 219 | waveform.toDisableBits = 1UL << pin;
|
225 | 220 | std::atomic_thread_fence(std::memory_order_release);
|
226 | 221 | // Must not interfere if Timer is due shortly
|
227 |
| - if (T1V > ((clockCyclesPerMicrosecond() == 160) ? (IRQLATENCYCCYS + DELTAIRQCCYS) >> 1 : IRQLATENCYCCYS + DELTAIRQCCYS)) { |
| 222 | + if (T1V > ((clockCyclesPerMicrosecond() == 160) ? IRQLATENCYCCYS >> 1 : IRQLATENCYCCYS)) { |
228 | 223 | timer1_write(IRQLATENCYCCYS);
|
229 | 224 | }
|
230 | 225 | while (waveform.toDisableBits) {
|
@@ -306,7 +301,7 @@ static ICACHE_RAM_ATTR void timer1Interrupt() {
|
306 | 301 | uint32_t now = ESP.getCycleCount();
|
307 | 302 | uint32_t isrNextEventCcy = now;
|
308 | 303 | while (busyPins) {
|
309 |
| - if (static_cast<int32_t>(isrNextEventCcy - now) > IRQLATENCYCCYS + DELTAIRQCCYS) { |
| 304 | + if (static_cast<int32_t>(isrNextEventCcy - now) > IRQLATENCYCCYS) { |
310 | 305 | waveform.nextEventCcy = isrNextEventCcy;
|
311 | 306 | break;
|
312 | 307 | }
|
@@ -412,15 +407,9 @@ static ICACHE_RAM_ATTR void timer1Interrupt() {
|
412 | 407 | }
|
413 | 408 |
|
414 | 409 | // Firing timer too soon, the NMI occurs before ISR has returned.
|
415 |
| - if (nextTimerCcys <= IRQLATENCYCCYS + DELTAIRQCCYS) { |
| 410 | + if (nextTimerCcys <= IRQLATENCYCCYS) { |
416 | 411 | nextTimerCcys = IRQLATENCYCCYS;
|
417 | 412 | }
|
418 |
| - else if (nextTimerCcys >= MAXIRQTICKSCCYS + DELTAIRQCCYS) { |
419 |
| - nextTimerCcys = MAXIRQTICKSCCYS; |
420 |
| - } |
421 |
| - else { |
422 |
| - nextTimerCcys -= DELTAIRQCCYS; |
423 |
| - } |
424 | 413 |
|
425 | 414 | // Register access is fast and edge IRQ was configured before.
|
426 | 415 | // Timer is 80MHz fixed. 160MHz binaries need scaling.
|
|
0 commit comments