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:
parent
26f3caf9d7
commit
6540609c35
@ -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();
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user