Skip to content

Commit 1ad17fb

Browse files
committed
Merge pull request #3983 from antodom/pio_handlers
PIO[ABCD] handlers improvement using ATSAM3X8E CLZ instruction
2 parents 5d9e0c5 + 296c5f0 commit 1ad17fb

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

Diff for: hardware/arduino/sam/cores/arduino/WInterrupts.c

+32-32
Original file line numberDiff line numberDiff line change
@@ -134,47 +134,47 @@ extern "C" {
134134
#endif
135135

136136
void PIOA_Handler(void) {
137-
uint32_t isr = PIOA->PIO_ISR;
138-
uint32_t i;
139-
for (i=0; i<32; i++, isr>>=1) {
140-
if ((isr & 0x1) == 0)
141-
continue;
142-
if (callbacksPioA[i])
143-
callbacksPioA[i]();
144-
}
137+
uint32_t isr = PIOA->PIO_ISR;
138+
uint8_t leading_zeros;
139+
while((leading_zeros=__CLZ(isr))<32)
140+
{
141+
uint8_t pin=32-leading_zeros-1;
142+
if(callbacksPioA[pin]) callbacksPioA[pin]();
143+
isr=isr&(~(1<<pin));
144+
}
145145
}
146146

147147
void PIOB_Handler(void) {
148-
uint32_t isr = PIOB->PIO_ISR;
149-
uint32_t i;
150-
for (i=0; i<32; i++, isr>>=1) {
151-
if ((isr & 0x1) == 0)
152-
continue;
153-
if (callbacksPioB[i])
154-
callbacksPioB[i]();
155-
}
148+
uint32_t isr = PIOB->PIO_ISR;
149+
uint8_t leading_zeros;
150+
while((leading_zeros=__CLZ(isr))<32)
151+
{
152+
uint8_t pin=32-leading_zeros-1;
153+
if(callbacksPioB[pin]) callbacksPioB[pin]();
154+
isr=isr&(~(1<<pin));
155+
}
156156
}
157157

158158
void PIOC_Handler(void) {
159-
uint32_t isr = PIOC->PIO_ISR;
160-
uint32_t i;
161-
for (i=0; i<32; i++, isr>>=1) {
162-
if ((isr & 0x1) == 0)
163-
continue;
164-
if (callbacksPioC[i])
165-
callbacksPioC[i]();
166-
}
159+
uint32_t isr = PIOC->PIO_ISR;
160+
uint8_t leading_zeros;
161+
while((leading_zeros=__CLZ(isr))<32)
162+
{
163+
uint8_t pin=32-leading_zeros-1;
164+
if(callbacksPioC[pin]) callbacksPioC[pin]();
165+
isr=isr&(~(1<<pin));
166+
}
167167
}
168168

169169
void PIOD_Handler(void) {
170-
uint32_t isr = PIOD->PIO_ISR;
171-
uint32_t i;
172-
for (i=0; i<32; i++, isr>>=1) {
173-
if ((isr & 0x1) == 0)
174-
continue;
175-
if (callbacksPioD[i])
176-
callbacksPioD[i]();
177-
}
170+
uint32_t isr = PIOD->PIO_ISR;
171+
uint8_t leading_zeros;
172+
while((leading_zeros=__CLZ(isr))<32)
173+
{
174+
uint8_t pin=32-leading_zeros-1;
175+
if(callbacksPioD[pin]) callbacksPioD[pin]();
176+
isr=isr&(~(1<<pin));
177+
}
178178
}
179179

180180
#ifdef __cplusplus

0 commit comments

Comments
 (0)