1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-29 16:31:18 +01:00

cpu/sam0_common: gpio: save a few cycles in isr_eic()

Don't iterate over all bits in the GPIO status register, instead
just loop as many times as there are set bits.
This commit is contained in:
Benjamin Valentin 2020-03-09 18:34:06 +01:00
parent 26f3caf9d7
commit 6540609c35

View File

@ -322,12 +322,18 @@ void gpio_irq_disable(gpio_t pin)
void isr_eic(void)
{
for (unsigned i = 0; i < NUMOF_IRQS; i++) {
if (_EIC->INTFLAG.reg & (1 << i)) {
_EIC->INTFLAG.reg = (1 << i);
gpio_config[i].cb(gpio_config[i].arg);
}
/* read & clear interrupt flags */
uint32_t state = _EIC->INTFLAG.reg;
state &= (1 << NUMOF_IRQS) - 1;
_EIC->INTFLAG.reg = state;
/* execute interrupt callbacks */
while (state) {
unsigned pin = 8 * sizeof(state) - __builtin_clz(state) - 1;
state &= ~(1 << pin);
gpio_config[pin].cb(gpio_config[pin].arg);
}
cortexm_isr_end();
}