From: notaz Date: Sat, 25 Oct 2014 22:14:39 +0000 (+0300) Subject: micros() implementation without irq disable X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=328c1b3394b711135fed11225cccef84220ef6be;p=teensytas.git micros() implementation without irq disable --- diff --git a/teensy3/pins_teensy.c b/teensy3/pins_teensy.c index 1c81ee9..52df777 100644 --- a/teensy3/pins_teensy.c +++ b/teensy3/pins_teensy.c @@ -690,7 +690,7 @@ volatile uint32_t systick_millis_count = 0; //uint32_t systick_current, systick_count, systick_istatus; // testing only -uint32_t micros(void) +static uint32_t micros_mask(void) { uint32_t count, current, istatus; @@ -707,6 +707,24 @@ uint32_t micros(void) return count * 1000 + current / (F_CPU / 1000000); } +uint32_t micros(void) +{ + uint32_t count, current, istatus; + + if (nvic_execution_priority() <= (SCB_SHPR3 >> 24)) + return micros_mask(); + + do { + current = SYST_CVR; + count = systick_millis_count; + istatus = SCB_ICSR; // bit 26 indicates if systick exception pending + } + while (istatus & SCB_ICSR_PENDSTSET); + + current = ((F_CPU / 1000) - 1) - current; + return count * 1000 + current / (F_CPU / 1000000); +} + void delay(uint32_t ms) { uint32_t start = micros();