PIO[ABCD] handlers improvement using ATSAM3X8E CLZ instruction

This commit is contained in:
Antonio C. Domínguez Brito 2015-10-15 09:04:12 +01:00
parent c1ce649554
commit 296c5f0fbf
1 changed files with 32 additions and 32 deletions

View File

@ -135,45 +135,45 @@ extern "C" {
void PIOA_Handler(void) { void PIOA_Handler(void) {
uint32_t isr = PIOA->PIO_ISR; uint32_t isr = PIOA->PIO_ISR;
uint32_t i; uint8_t leading_zeros;
for (i=0; i<32; i++, isr>>=1) { while((leading_zeros=__CLZ(isr))<32)
if ((isr & 0x1) == 0) {
continue; uint8_t pin=32-leading_zeros-1;
if (callbacksPioA[i]) if(callbacksPioA[pin]) callbacksPioA[pin]();
callbacksPioA[i](); isr=isr&(~(1<<pin));
} }
} }
void PIOB_Handler(void) { void PIOB_Handler(void) {
uint32_t isr = PIOB->PIO_ISR; uint32_t isr = PIOB->PIO_ISR;
uint32_t i; uint8_t leading_zeros;
for (i=0; i<32; i++, isr>>=1) { while((leading_zeros=__CLZ(isr))<32)
if ((isr & 0x1) == 0) {
continue; uint8_t pin=32-leading_zeros-1;
if (callbacksPioB[i]) if(callbacksPioB[pin]) callbacksPioB[pin]();
callbacksPioB[i](); isr=isr&(~(1<<pin));
} }
} }
void PIOC_Handler(void) { void PIOC_Handler(void) {
uint32_t isr = PIOC->PIO_ISR; uint32_t isr = PIOC->PIO_ISR;
uint32_t i; uint8_t leading_zeros;
for (i=0; i<32; i++, isr>>=1) { while((leading_zeros=__CLZ(isr))<32)
if ((isr & 0x1) == 0) {
continue; uint8_t pin=32-leading_zeros-1;
if (callbacksPioC[i]) if(callbacksPioC[pin]) callbacksPioC[pin]();
callbacksPioC[i](); isr=isr&(~(1<<pin));
} }
} }
void PIOD_Handler(void) { void PIOD_Handler(void) {
uint32_t isr = PIOD->PIO_ISR; uint32_t isr = PIOD->PIO_ISR;
uint32_t i; uint8_t leading_zeros;
for (i=0; i<32; i++, isr>>=1) { while((leading_zeros=__CLZ(isr))<32)
if ((isr & 0x1) == 0) {
continue; uint8_t pin=32-leading_zeros-1;
if (callbacksPioD[i]) if(callbacksPioD[pin]) callbacksPioD[pin]();
callbacksPioD[i](); isr=isr&(~(1<<pin));
} }
} }