[avr] Made SPI.usingInterrupt() synchronized (Andrew Kroll)

This commit is contained in:
Cristian Maglie 2014-11-18 20:02:27 +01:00
parent 4948bf5650
commit 00f5ed6b45
1 changed files with 7 additions and 9 deletions

View File

@ -111,11 +111,9 @@ void SPIClass::end() {
void SPIClass::usingInterrupt(uint8_t interruptNumber) void SPIClass::usingInterrupt(uint8_t interruptNumber)
{ {
uint8_t mask; uint8_t mask = 0;
uint8_t sreg = SREG;
if (interruptMode > 1) return; noInterrupts(); // Protect from a scheduler and prevent transactionBegin
noInterrupts();
switch (interruptNumber) { switch (interruptNumber) {
#ifdef SPI_INT0_MASK #ifdef SPI_INT0_MASK
case 0: mask = SPI_INT0_MASK; break; case 0: mask = SPI_INT0_MASK; break;
@ -143,12 +141,12 @@ void SPIClass::usingInterrupt(uint8_t interruptNumber)
#endif #endif
default: default:
interruptMode = 2; interruptMode = 2;
interrupts(); break;
return;
} }
interruptMode = 1;
interruptMask |= mask; interruptMask |= mask;
interrupts(); if (!interruptMode)
interruptMode = 1;
SREG = sreg;
} }
void SPIClass::notUsingInterrupt(uint8_t interruptNumber) void SPIClass::notUsingInterrupt(uint8_t interruptNumber)