]> granicus.if.org Git - esp-idf/commitdiff
pcnt/driver: Sped the pcnt_intr_service ISR
authorKonstantin Kondrashov <konstantin@espressif.com>
Thu, 7 Feb 2019 13:18:19 +0000 (21:18 +0800)
committerbot <bot@espressif.com>
Wed, 13 Mar 2019 13:50:43 +0000 (13:50 +0000)
Used __builtin_ctz function to sped ISR.

components/driver/pcnt.c

index 6fcc2b5525c6c0f06b27c1c19cf3185b76feecb1..b91cb5965bec755f885ba6e1857b5786c3ecf915 100644 (file)
@@ -296,15 +296,16 @@ esp_err_t pcnt_isr_register(void (*fun)(void*), void * arg, int intr_alloc_flags
 // pcnt interrupt service
 static void IRAM_ATTR pcnt_intr_service(void* arg)
 {
-    uint32_t intr_status = PCNT.int_st.val;
-    for (int unit = 0; unit < PCNT_UNIT_MAX; unit++) {
-        if (intr_status & (BIT(unit))) {
-            if (pcnt_isr_func[unit].fn != NULL) {
-                (pcnt_isr_func[unit].fn)(pcnt_isr_func[unit].args);
-            }
-            PCNT.int_clr.val = BIT(unit);
+    const uint32_t intr_status = PCNT.int_st.val;
+    uint32_t status = intr_status;
+    while (status) {
+        int unit = __builtin_ffs(status) - 1;
+        status &= ~(1 << unit);
+        if (pcnt_isr_func[unit].fn != NULL) {
+            (pcnt_isr_func[unit].fn)(pcnt_isr_func[unit].args);
         }
     }
+    PCNT.int_clr.val = intr_status;
 }
 
 esp_err_t pcnt_isr_handler_add(pcnt_unit_t unit, void(*isr_handler)(void *), void *args)