mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-02 12:14:32 +02:00
pcnt/driver: Sped the pcnt_intr_service ISR
Used __builtin_ctz function to sped ISR.
This commit is contained in:
committed by
bot
parent
b8dc48ab18
commit
3307735bc0
@@ -296,15 +296,16 @@ esp_err_t pcnt_isr_register(void (*fun)(void*), void * arg, int intr_alloc_flags
|
|||||||
// pcnt interrupt service
|
// pcnt interrupt service
|
||||||
static void IRAM_ATTR pcnt_intr_service(void* arg)
|
static void IRAM_ATTR pcnt_intr_service(void* arg)
|
||||||
{
|
{
|
||||||
uint32_t intr_status = PCNT.int_st.val;
|
const uint32_t intr_status = PCNT.int_st.val;
|
||||||
for (int unit = 0; unit < PCNT_UNIT_MAX; unit++) {
|
uint32_t status = intr_status;
|
||||||
if (intr_status & (BIT(unit))) {
|
while (status) {
|
||||||
|
int unit = __builtin_ffs(status) - 1;
|
||||||
|
status &= ~(1 << unit);
|
||||||
if (pcnt_isr_func[unit].fn != NULL) {
|
if (pcnt_isr_func[unit].fn != NULL) {
|
||||||
(pcnt_isr_func[unit].fn)(pcnt_isr_func[unit].args);
|
(pcnt_isr_func[unit].fn)(pcnt_isr_func[unit].args);
|
||||||
}
|
}
|
||||||
PCNT.int_clr.val = BIT(unit);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
PCNT.int_clr.val = intr_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t pcnt_isr_handler_add(pcnt_unit_t unit, void(*isr_handler)(void *), void *args)
|
esp_err_t pcnt_isr_handler_add(pcnt_unit_t unit, void(*isr_handler)(void *), void *args)
|
||||||
|
Reference in New Issue
Block a user