aboutsummaryrefslogtreecommitdiff
path: root/libraries
AgeCommit message (Collapse)Author
2015-01-26Disable the RX PCINT inside SoftwareSerial::recvMatthijs Kooijman
Before, the interrupt would remain enabled during reception, which would re-set the PCINT flag because of the level changes inside the received byte. Because interrupts are globally disabled, this would not immediately trigger an interrupt, but the flag would be remembered to trigger another PCINT interrupt immediately after the first one is processed. Typically this was not a problem, because the second interrupt would see the stop bit, or an idle line, and decide that the interrupt triggered for someone else. However, at high baud rates, this could cause the next interrupt for the real start bit to be delayed so much that the byte got corrupted. By clearing the interrupt mask bit for just the RX pin (as opposed to the PCINT mask bit for the entire port), any PCINT events on other bits can still set the PCINT flag and be processed as normal. In this case, it's likely that there will be corruption, but that's inevitable when (other) interrupts happen during SoftwareSerial reception.
2015-01-26Optimize SoftwareSerial::setRxIntMsk()Matthijs Kooijman
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.
2015-01-26In SoftwareSerial::recv, only calculate the new tail onceMatthijs Kooijman
This shortens the generated code a bit more.
2015-01-26Mark SoftwareSerial::recv and handle_interrupt as always_inlineMatthijs Kooijman
Since those functions are only called once now, it makes sense to inline them. This saves a few bytes of program space, but also saves a few cycles in the critical RX path.
2015-01-26In SoftwareSerial, use ISR_ALIASOF to prevent duplicationMatthijs Kooijman
Previously, up to four separate but identical ISR routines were defined, for PCINT0, PCINT1, PCINT2 and PCINT3. Each of these would generate their own function, with a lot of push-popping because another function was called. Now, the ISR_ALIASOF macro from avr-libc is used to declare just the PCINT0 version and make all other ISRs point to that one, saving a lot of program space, as well as some speed because of improved inlining. On an Arduino Uno with gcc 4.3, this saves 168 bytes. With gcc 4.8, this saves 150 bytes.
2015-01-26Optimize SoftwareSerial::recvMatthijs Kooijman
Similar to SoftwareSerial::write, this rewrites the loop to only touch the MSB and then shift those bits up, allowing the compiler to generate more efficient code. Unlike the write function however, it is not needed to put all instance variables used into local variables, for some reason the compiler already does this (and doing it manually even makes the code bigger). On the Arduino Uno using gcc 4.3 this saves 26 bytes. Using gcc 4.8 this saves 30 bytes. Note that this removes the else clause in the code, making the C code unbalanced, which looks like it breaks timing balance. However, looking at the code generated by the compiler, it turns out that the old code was actually unbalanced, while the new code is properly balanced.
2015-01-26Further optimize SoftwareSerial::writeMatthijs Kooijman
This change restructures the loop, to help the compiler generate shorter code (because now only the LSB of the data byte is checked and subsequent bytes are shifted down one by one, it can use th "skip if bit set" instruction). Furthermore, it puts most attributes in local variables, which causes the compiler to put them into registers. This makes the timing-critical part of the code smaller, making it easier to provide accurate timings. On an Arduino uno using gcc 4.3, this saves 58 bytes. On gcc 4.8, this saves 14 bytes.
2015-01-26Mark SoftwareSerial::tx_pin_write as "always_inline"Matthijs Kooijman
Somehow gcc 4.8 doesn't inline this function, even though it is always called with constant arguments and can be reduced to just a few instructions when inlined. Adding the always_inline attribute makes gcc inline it, saving 46 bytes on the Arduino uno. gcc 4.3 already inlined this function, so there are no space savings there.
2015-01-26Simplify SoftwareSerial::writeMatthijs Kooijman
Before, there was nearly identical code for the inverted and regular cases. However, simply inverting the byte in the inverted case allows using the regular code twice, reducing the generated code size by 100 bytes (on an Arduino Uno and gcc 4.3, on gcc 4.8 the reduction is 50 bytes).
2015-01-26Use stopListening() in SoftwareSerial::end()Matthijs Kooijman
stopListening also disabled the interrupt, if needed, so calling that function makes more sense. Since stopListening only disables the interrupt when the current SoftwareSerial is the active object, and that can only be the case when _rx_delay_stopbit is non-zero, there is no need to separately check _rx_delay_stopbit anymore.
2015-01-26Fix race condition in SoftwareSerial::overflow()Matthijs Kooijman
If an interrupt causing overflow would occur between reading _buffer_overflow and clearing it, this overflow condition would be immediately cleared and never be returned by overflow(). By only clearing the overflow flag if an overflow actually occurred, this problem goes away (worst case overflow() returns false even though an overflow _just_ occurred, but then the next call to overflow() will return true).
2015-01-26Toggle SoftwareSerial interrupts when starting / stopping to listenMatthijs Kooijman
This prevents interrupts from triggering when the SoftwareSerial instance is not even listening. Additionally, this removes the need to disable interrupts in SoftwareSerial::listen, since no interrupts are active while it touches the variables.
2015-01-26Add SoftwareSerial::stopListening()Matthijs Kooijman
This allows one to explicitly stop a SoftwareSerial instance from listening, without having to make another one listening.
2015-01-26Add SoftwareSerial::setRxIntMsk()Matthijs Kooijman
This moves the interrupt mask enabling / disabling code into a separate method, so we can call it from multiple spots next.
2015-01-26Let SoftwareSerial::end also check against _rx_delay_stopbitMatthijs Kooijman
The current check is still always false when the old check was, but additionally it will not disable the interrupts when they were never enabled (which shouldn't matter much, but this is more consistent).
2015-01-26Let SoftwareSerial::listen() fail on invalid rx baud ratesMatthijs Kooijman
In this case, SoftwareSerial::begin will not have enabled the interrupts, so better not allow the SoftwareSerial instance to enter the listening state either.
2015-01-26Clear SoftwareSerial rx delay if no interrupt register is foundMatthijs Kooijman
Before enabling interupts, begin would see if the given receive pin actually has an associated PCINT register. If not, the interrupts would not be enabled. Now, the same check is done, but when no register is available, the rx parameters are not loaded at all (which in turn prevents the interrupt from being enabled). This allows all code to use the same "is rx enabled" (which will be added next).
2014-11-25Fix atomicity issues in SPI::beginTransaction and SPI::endTransaction ↵Cristian Maglie
(Andrew Kroll) Previously, it could happen that SPI::beginTransaction was interrupted by an ISR, while it is changing the SPI_AVR_EIMSK register or interruptSave variable (it seems that there is a small window after changing SPI_AVR_EIMSK where an interrupt might still occur). If this happens, interruptSave is overwritten with an invalid value, permanently disabling the pin interrupts. To prevent this, disable interrupts globally while changing these values.
2014-11-25[avr] Made SPI.usingInterrupt() synchronized (Andrew Kroll)Cristian Maglie
2014-11-25[avr] Added SPI.notUsingInterrupt() (Andrew Kroll)Cristian Maglie
2014-11-25[avr] Made SPI.begin() and SPI.end() synchronized (Andrew Kroll)Cristian Maglie
2014-11-25[avr] Improved SPI speed on 16bit transfer.Cristian Maglie
From https://github.com/arduino/Arduino/pull/2376#issuecomment-59671152 Quoting Andrew Kroll: [..this commit..] introduces a small delay that can prevent the wait loop form iterating when running at the maximum speed. This gives you a little more speed, even if it seems counter-intuitive. At lower speeds, it is unnoticed. Watch the output on an oscilloscope when running full SPI speed, and you should see closer back-to-back writes. Quoting Paul Stoffregen: I did quite a bit of experimenting with the NOP addition. The one that's in my copy gives about a 10% speedup on AVR.
2014-11-14[avr] SPI: removed redundant includeCristian Maglie
2014-11-14[avr] Small comments and headers fixes in SPICristian Maglie
2014-08-01SPI Transactions for AVRPaulStoffregen
2014-07-18missing paragraph field in library.propertiesFede85
2014-07-18modified sentences in library.properties filesFede85
2014-07-02Merge pull request #1912 from Lauszus/issues440Cristian Maglie
Enable user to change the I2C clock frequency by calling setClock in the Wire library
2014-05-23Merge remote-tracking branch 'arduino/master' into ide-1.5.xCristian Maglie
Conflicts: build/shared/examples/01.Basics/Blink/Blink.ino build/shared/examples/09.USB/Keyboard/KeyboardReprogram/KeyboardReprogram.ino build/shared/examples/10.StarterKit/p02_SpaceshipInterface/p02_SpaceshipInterface.ino hardware/arduino/cores/arduino/HardwareSerial.cpp
2014-03-06Enable user to change the I2C clock frequency by calling setClock in the ↵Kristian Lauszus
Wire library
2013-11-21Revert "SPI library to new format"Cristian Maglie
2013-11-21Revert "EEPROM library to the new format"Cristian Maglie
This reverts commits: 3223d4fdca32ec03de4a3a2a0c22f2d40de5f374 77f8dd63ab102ab5d2929ac4edd5c00ae9d70493
2013-11-15Revert "SoftwareSerial library to the new format"Cristian Maglie
This reverts commit 38c3bbbd3c83eda057d4857635fbd78a4785c3a4.
2013-11-15Revert "Wire library to the 1.5 format"Cristian Maglie
This reverts commit a31857688bdc270ed65307755ff3b73ef4867982.
2013-09-10Wire library to the 1.5 formatFede85
2013-09-06SpacebrewYun library to the 1.5 formatFede85
2013-09-06Temboo library to the 1.5 formatFede85
2013-09-06Bridge library to the 1.5 formatFede85
2013-08-28Spacebrew keywordsFederico Fissore
2013-08-28spacebrew updateFederico Fissore
2013-08-28removed .DS_Store folderFederico Fissore
2013-08-23Merge branch 'ide-1.5.x' into dev-ide-1.5.x-discoveryCristian Maglie
Conflicts: app/src/processing/app/Preferences.java app/src/processing/app/debug/Uploader.java
2013-07-25TemperatureWebPanel: widening refresh intervalFederico Fissore
2013-07-19WiFi library to the new formatFede85
2013-07-19Bridge: Bridge.begin should wait more before giving up, as other processes ↵Federico Fissore
may consume linux cpu power
2013-07-18SpacebrewYun: added new exampleFederico Fissore
2013-07-15Bridge: CRC16 being used as CRCAngelo Scialabba
2013-07-15updated temboo examples (added ControlBySMS)Federico Fissore
2013-07-14Merge branch 'ide-1.5.x' into dev-ide-1.5.x-discoveryCristian Maglie
Conflicts: app/src/cc/arduino/packages/uploaders/SerialUploader.java app/src/processing/app/Editor.java app/src/processing/app/Sketch.java app/src/processing/app/debug/Uploader.java
2013-07-14Merge branch 'master' into ide-1.5.xCristian Maglie