From 5f2f0ef4c8f44aefe5c715abf28f9eda32fcf67e Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Wed, 23 Apr 2014 19:13:58 +0200 Subject: [PATCH] Optimize SoftwareSerial::setRxIntMsk() This precalculates the mask register and value, making setRxIntMask considerably less complicated. Right now, this is not a big deal, but simplifying it allows using it inside the ISR next. --- libraries/SoftwareSerial/SoftwareSerial.cpp | 9 +++++++-- libraries/SoftwareSerial/SoftwareSerial.h | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp index 42f796b..bee1107 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -403,6 +403,11 @@ void SoftwareSerial::begin(long speed) // (others might also need it, so we disable the interrupt by using // the per-pin PCMSK register). *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin)); + // Precalculate the pcint mask register and value, so setRxIntMask + // can be used inside the ISR without costing too much time. + _pcint_maskreg = digitalPinToPCMSK(_receivePin); + _pcint_maskvalue = _BV(digitalPinToPCMSKbit(_receivePin)); + tunedDelay(_tx_delay); // if we were low this establishes the end } @@ -417,9 +422,9 @@ void SoftwareSerial::begin(long speed) void SoftwareSerial::setRxIntMsk(bool enable) { if (enable) - *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin)); + *_pcint_maskreg |= _pcint_maskvalue; else - *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin)); + *_pcint_maskreg &= ~_pcint_maskvalue; } void SoftwareSerial::end() diff --git a/libraries/SoftwareSerial/SoftwareSerial.h b/libraries/SoftwareSerial/SoftwareSerial.h index aa9bbf3..302a23b 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.h +++ b/libraries/SoftwareSerial/SoftwareSerial.h @@ -53,6 +53,8 @@ private: volatile uint8_t *_receivePortRegister; uint8_t _transmitBitMask; volatile uint8_t *_transmitPortRegister; + volatile uint8_t *_pcint_maskreg; + uint8_t _pcint_maskvalue; uint16_t _rx_delay_centering; uint16_t _rx_delay_intrabit;