From: Konstantin Kondrashov Date: Thu, 7 Feb 2019 13:18:19 +0000 (+0800) Subject: pcnt/driver: Sped the pcnt_intr_service ISR X-Git-Tag: v4.0-beta1~496^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3307735bc0bf634da28a58e8bfd2f62253c19c16;p=esp-idf pcnt/driver: Sped the pcnt_intr_service ISR Used __builtin_ctz function to sped ISR. --- diff --git a/components/driver/pcnt.c b/components/driver/pcnt.c index 6fcc2b5525..b91cb5965b 100644 --- a/components/driver/pcnt.c +++ b/components/driver/pcnt.c @@ -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)