aboutsummaryrefslogtreecommitdiff
path: root/cores
diff options
context:
space:
mode:
authorDave Madison <dmadison@users.noreply.github.com>2022-02-22 02:32:00 -0500
committerGitHub <noreply@github.com>2022-02-22 02:32:00 -0500
commitd52b6ea456dd145025659359847e3ba8b58b5a27 (patch)
tree7c106c4e741e47ef5dd9f4f45529fd6a6010a896 /cores
parentf47a97522dc28c16c432422e3085035de69cfaf6 (diff)
parent6f5881438af5b416fe83b0721a51215b9833498c (diff)
Merge pull request #14 from dmadison/upstream-1.8.4
Merge upstream tag '1.8.4'
Diffstat (limited to 'cores')
-rw-r--r--cores/arduino/HardwareSerial.cpp2
-rw-r--r--cores/arduino/HardwareSerial.h2
-rw-r--r--cores/arduino/HardwareSerial_private.h2
-rw-r--r--cores/arduino/Print.h2
-rw-r--r--cores/arduino/Stream.h2
-rw-r--r--cores/arduino/USBAPI.h2
-rw-r--r--cores/arduino/WString.h4
-rw-r--r--cores/arduino/abi.cpp15
-rw-r--r--cores/arduino/new67
-rw-r--r--cores/arduino/new.cpp96
-rw-r--r--cores/arduino/new.h34
-rw-r--r--cores/arduino/wiring.c26
-rw-r--r--cores/arduino/wiring_analog.c18
-rw-r--r--cores/arduino/wiring_digital.c2
14 files changed, 188 insertions, 86 deletions
diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp
index e99d503..561127f 100644
--- a/cores/arduino/HardwareSerial.cpp
+++ b/cores/arduino/HardwareSerial.cpp
@@ -219,7 +219,7 @@ void HardwareSerial::flush()
_tx_udr_empty_irq();
}
// If we get here, nothing is queued anymore (DRIE is disabled) and
- // the hardware finished tranmission (TXC is set).
+ // the hardware finished transmission (TXC is set).
}
size_t HardwareSerial::write(uint8_t c)
diff --git a/cores/arduino/HardwareSerial.h b/cores/arduino/HardwareSerial.h
index 17000c2..6ff29d0 100644
--- a/cores/arduino/HardwareSerial.h
+++ b/cores/arduino/HardwareSerial.h
@@ -32,7 +32,7 @@
// using a ring buffer (I think), in which head is the index of the location
// to which to write the next incoming character and tail is the index of the
// location from which to read.
-// NOTE: a "power of 2" buffer size is reccomended to dramatically
+// NOTE: a "power of 2" buffer size is recommended to dramatically
// optimize all the modulo operations for ring buffers.
// WARNING: When buffer sizes are increased to > 256, the buffer index
// variables are automatically increased in size, but the extra
diff --git a/cores/arduino/HardwareSerial_private.h b/cores/arduino/HardwareSerial_private.h
index 761a5e5..2e23cec 100644
--- a/cores/arduino/HardwareSerial_private.h
+++ b/cores/arduino/HardwareSerial_private.h
@@ -63,7 +63,7 @@
#endif
#endif // !defined TXC0
-// Check at compiletime that it is really ok to use the bit positions of
+// Check at compile time that it is really ok to use the bit positions of
// UART0 for the other UARTs as well, in case these values ever get
// changed for future hardware.
#if defined(TXC1) && (TXC1 != TXC0 || RXEN1 != RXEN0 || RXCIE1 != RXCIE0 || \
diff --git a/cores/arduino/Print.h b/cores/arduino/Print.h
index 058a2ab..0097cc1 100644
--- a/cores/arduino/Print.h
+++ b/cores/arduino/Print.h
@@ -59,7 +59,7 @@ class Print
}
// default to zero, meaning "a single write may block"
- // should be overriden by subclasses with buffering
+ // should be overridden by subclasses with buffering
virtual int availableForWrite() { return 0; }
size_t print(const __FlashStringHelper *);
diff --git a/cores/arduino/Stream.h b/cores/arduino/Stream.h
index 8e950c7..21a247a 100644
--- a/cores/arduino/Stream.h
+++ b/cores/arduino/Stream.h
@@ -25,7 +25,7 @@
#include <inttypes.h>
#include "Print.h"
-// compatability macros for testing
+// compatibility macros for testing
/*
#define getInt() parseInt()
#define getInt(ignore) parseInt(ignore)
diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h
index 47221b8..1ad268c 100644
--- a/cores/arduino/USBAPI.h
+++ b/cores/arduino/USBAPI.h
@@ -32,7 +32,7 @@ typedef unsigned long u32;
#include "Arduino.h"
-// This definitions is usefull if you want to reduce the EP_SIZE to 16
+// This definitions is useful if you want to reduce the EP_SIZE to 16
// at the moment only 64 and 16 as EP_SIZE for all EPs are supported except the control endpoint
#ifndef USB_EP_SIZE
#define USB_EP_SIZE 64
diff --git a/cores/arduino/WString.h b/cores/arduino/WString.h
index 77709c3..2cf4cd7 100644
--- a/cores/arduino/WString.h
+++ b/cores/arduino/WString.h
@@ -95,7 +95,7 @@ public:
// returns true on success, false on failure (in which case, the string
// is left unchanged). if the argument is null or invalid, the
- // concatenation is considered unsucessful.
+ // concatenation is considered unsuccessful.
unsigned char concat(const String &str);
unsigned char concat(const char *cstr);
unsigned char concat(char c);
@@ -152,7 +152,7 @@ public:
unsigned char startsWith(const String &prefix, unsigned int offset) const;
unsigned char endsWith(const String &suffix) const;
- // character acccess
+ // character access
char charAt(unsigned int index) const;
void setCharAt(unsigned int index, char c);
char operator [] (unsigned int index) const;
diff --git a/cores/arduino/abi.cpp b/cores/arduino/abi.cpp
index 8d719b8..6e1b0f8 100644
--- a/cores/arduino/abi.cpp
+++ b/cores/arduino/abi.cpp
@@ -21,15 +21,16 @@
extern "C" void __cxa_pure_virtual(void) __attribute__ ((__noreturn__));
extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__));
+namespace std {
+ [[gnu::weak, noreturn]] void terminate() {
+ abort();
+ }
+}
+
void __cxa_pure_virtual(void) {
- // We might want to write some diagnostics to uart in this case
- //std::terminate();
- abort();
+ std::terminate();
}
void __cxa_deleted_virtual(void) {
- // We might want to write some diagnostics to uart in this case
- //std::terminate();
- abort();
+ std::terminate();
}
-
diff --git a/cores/arduino/new b/cores/arduino/new
index aa8ecb5..8cf2103 100644
--- a/cores/arduino/new
+++ b/cores/arduino/new
@@ -1,5 +1,66 @@
/*
-this header is for compatibility with standard c++ header names
-so that #include<new> works as expected
+ Copyright (c) 2014 Arduino. All right reserved.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "new.h"
+
+#ifndef NEW_H
+#define NEW_H
+
+#include <stdlib.h>
+
+namespace std {
+ struct nothrow_t {};
+ extern const nothrow_t nothrow;
+
+ // These are not actually implemented, to prevent overhead and
+ // complexity. They are still declared to allow implementing
+ // them in user code if needed.
+ typedef void (*new_handler)();
+ new_handler set_new_handler(new_handler new_p) noexcept;
+ new_handler get_new_handler() noexcept;
+
+ // This is normally declared in various headers that we do not have
+ // available, so just define it here. We could also use ::size_t
+ // below, but then anyone including <new> can no longer assume
+ // std::size_t is available.
+ using size_t = ::size_t;
+} // namespace std
+
+[[gnu::weak]] void * operator new(std::size_t size);
+[[gnu::weak]] void * operator new[](std::size_t size);
+
+[[gnu::weak]] void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
+[[gnu::weak]] void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
+
+void * operator new(std::size_t size, void *place) noexcept;
+void * operator new[](std::size_t size, void *place) noexcept;
+
+[[gnu::weak]] void operator delete(void * ptr) noexcept;
+[[gnu::weak]] void operator delete[](void * ptr) noexcept;
+
+#if __cplusplus >= 201402L
+[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept;
+[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept;
+#endif // __cplusplus >= 201402L
+
+[[gnu::weak]] void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
+[[gnu::weak]] void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
+
+void operator delete(void* ptr, void* place) noexcept;
+void operator delete[](void* ptr, void* place) noexcept;
+
+#endif
+
diff --git a/cores/arduino/new.cpp b/cores/arduino/new.cpp
index fc30cf8..7ca4931 100644
--- a/cores/arduino/new.cpp
+++ b/cores/arduino/new.cpp
@@ -16,26 +16,102 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <stdlib.h>
+#include "new.h"
-void *operator new(size_t size) {
- return malloc(size);
+// The C++ spec dictates that allocation failure should cause the
+// (non-nothrow version of the) operator new to throw an exception.
+// Since we expect to have exceptions disabled, it would be more
+// appropriate (and probably standards-compliant) to terminate instead.
+// Historically failure causes null to be returned, but this define
+// allows switching to more robust terminating behaviour (that might
+// become the default at some point in the future). Note that any code
+// that wants null to be returned can (and should) use the nothrow
+// versions of the new statement anyway and is unaffected by this.
+// #define NEW_TERMINATES_ON_FAILURE
+
+namespace std {
+ // Defined in abi.cpp
+ void terminate();
+
+ const nothrow_t nothrow;
}
-void *operator new[](size_t size) {
+static void * new_helper(std::size_t size) {
+ // Even zero-sized allocations should return a unique pointer, but
+ // malloc does not guarantee this
+ if (size == 0)
+ size = 1;
return malloc(size);
}
-void * operator new(size_t size, void * ptr) noexcept {
- (void)size;
- return ptr;
+void * operator new(std::size_t size) {
+ void *res = new_helper(size);
+#if defined(NEW_TERMINATES_ON_FAILURE)
+ if (!res)
+ std::terminate();
+#endif
+ return res;
+}
+void * operator new[](std::size_t size) {
+ return operator new(size);
}
-void operator delete(void * ptr) {
- free(ptr);
+void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
+#if defined(NEW_TERMINATES_ON_FAILURE)
+ // Cannot call throwing operator new as standard suggests, so call
+ // new_helper directly then
+ return new_helper(size);
+#else
+ return operator new(size);
+#endif
+}
+void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept {
+#if defined(NEW_TERMINATES_ON_FAILURE)
+ // Cannot call throwing operator new[] as standard suggests, so call
+ // malloc directly then
+ return new_helper(size);
+#else
+ return operator new[](size);
+#endif
+}
+
+void * operator new(std::size_t size, void *place) noexcept {
+ // Nothing to do
+ (void)size; // unused
+ return place;
+}
+void * operator new[](std::size_t size, void *place) noexcept {
+ return operator new(size, place);
}
-void operator delete[](void * ptr) {
+void operator delete(void * ptr) noexcept {
free(ptr);
}
+void operator delete[](void * ptr) noexcept {
+ operator delete(ptr);
+}
+#if __cplusplus >= 201402L
+void operator delete(void* ptr, std::size_t size) noexcept {
+ operator delete(ptr);
+}
+void operator delete[](void * ptr, std::size_t size) noexcept {
+ operator delete[](ptr);
+}
+#endif // __cplusplus >= 201402L
+
+void operator delete(void* ptr, const std::nothrow_t& tag) noexcept {
+ operator delete(ptr);
+}
+void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept {
+ operator delete[](ptr);
+}
+
+void operator delete(void* ptr, void* place) noexcept {
+ (void)ptr; (void)place; // unused
+ // Nothing to do
+}
+void operator delete[](void* ptr, void* place) noexcept {
+ (void)ptr; (void)place; // unused
+ // Nothing to do
+}
diff --git a/cores/arduino/new.h b/cores/arduino/new.h
index 763f5cc..d529853 100644
--- a/cores/arduino/new.h
+++ b/cores/arduino/new.h
@@ -1,31 +1,3 @@
-/*
- Copyright (c) 2014 Arduino. All right reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef NEW_H
-#define NEW_H
-
-#include <stdlib.h>
-
-void * operator new(size_t size);
-void * operator new[](size_t size);
-void * operator new(size_t size, void * ptr) noexcept;
-void operator delete(void * ptr);
-void operator delete[](void * ptr);
-
-#endif
-
+// This file originally used a non-standard name for this Arduino core
+// only, so still expose the old new.h name for compatibility.
+#include "new"
diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c
index 9727135..8caf455 100644
--- a/cores/arduino/wiring.c
+++ b/cores/arduino/wiring.c
@@ -125,7 +125,7 @@ void delayMicroseconds(unsigned int us)
// 2 microseconds) gives delays longer than desired.
//delay_us(us);
#if F_CPU >= 24000000L
- // for the 24 MHz clock for the aventurous ones, trying to overclock
+ // for the 24 MHz clock for the adventurous ones trying to overclock
// zero delay fix
if (!us) return; // = 3 cycles, (4 when true)
@@ -135,9 +135,9 @@ void delayMicroseconds(unsigned int us)
// delay requested.
us *= 6; // x6 us, = 7 cycles
- // account for the time taken in the preceeding commands.
+ // account for the time taken in the preceding commands.
// we just burned 22 (24) cycles above, remove 5, (5*4=20)
- // us is at least 6 so we can substract 5
+ // us is at least 6 so we can subtract 5
us -= 5; //=2 cycles
#elif F_CPU >= 20000000L
@@ -157,9 +157,9 @@ void delayMicroseconds(unsigned int us)
// delay requested.
us = (us << 2) + us; // x5 us, = 7 cycles
- // account for the time taken in the preceeding commands.
+ // account for the time taken in the preceding commands.
// we just burned 26 (28) cycles above, remove 7, (7*4=28)
- // us is at least 10 so we can substract 7
+ // us is at least 10 so we can subtract 7
us -= 7; // 2 cycles
#elif F_CPU >= 16000000L
@@ -174,9 +174,9 @@ void delayMicroseconds(unsigned int us)
// delay requested.
us <<= 2; // x4 us, = 4 cycles
- // account for the time taken in the preceeding commands.
+ // account for the time taken in the preceding commands.
// we just burned 19 (21) cycles above, remove 5, (5*4=20)
- // us is at least 8 so we can substract 5
+ // us is at least 8 so we can subtract 5
us -= 5; // = 2 cycles,
#elif F_CPU >= 12000000L
@@ -191,9 +191,9 @@ void delayMicroseconds(unsigned int us)
// delay requested.
us = (us << 1) + us; // x3 us, = 5 cycles
- // account for the time taken in the preceeding commands.
+ // account for the time taken in the preceding commands.
// we just burned 20 (22) cycles above, remove 5, (5*4=20)
- // us is at least 6 so we can substract 5
+ // us is at least 6 so we can subtract 5
us -= 5; //2 cycles
#elif F_CPU >= 8000000L
@@ -208,9 +208,9 @@ void delayMicroseconds(unsigned int us)
// delay requested.
us <<= 1; //x2 us, = 2 cycles
- // account for the time taken in the preceeding commands.
+ // account for the time taken in the preceding commands.
// we just burned 17 (19) cycles above, remove 4, (4*4=16)
- // us is at least 6 so we can substract 4
+ // us is at least 6 so we can subtract 4
us -= 4; // = 2 cycles
#else
@@ -218,9 +218,9 @@ void delayMicroseconds(unsigned int us)
// the overhead of the function calls is 14 (16) cycles
if (us <= 16) return; //= 3 cycles, (4 when true)
- if (us <= 25) return; //= 3 cycles, (4 when true), (must be at least 25 if we want to substract 22)
+ if (us <= 25) return; //= 3 cycles, (4 when true), (must be at least 25 if we want to subtract 22)
- // compensate for the time taken by the preceeding and next commands (about 22 cycles)
+ // compensate for the time taken by the preceding and next commands (about 22 cycles)
us -= 22; // = 2 cycles
// the following loop takes 4 microseconds (4 cycles)
// per iteration, so execute it us/4 times
diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c
index e237d6d..0de64f7 100644
--- a/cores/arduino/wiring_analog.c
+++ b/cores/arduino/wiring_analog.c
@@ -37,7 +37,6 @@ void analogReference(uint8_t mode)
int analogRead(uint8_t pin)
{
- uint8_t low, high;
#if defined(analogPinToChannel)
#if defined(__AVR_ATmega32U4__)
@@ -74,27 +73,20 @@ int analogRead(uint8_t pin)
// without a delay, we seem to read from the wrong channel
//delay(1);
-#if defined(ADCSRA) && defined(ADCL)
+#if defined(ADCSRA) && defined(ADC)
// start the conversion
sbi(ADCSRA, ADSC);
// ADSC is cleared when the conversion finishes
while (bit_is_set(ADCSRA, ADSC));
- // we have to read ADCL first; doing so locks both ADCL
- // and ADCH until ADCH is read. reading ADCL second would
- // cause the results of each conversion to be discarded,
- // as ADCL and ADCH would be locked when it completed.
- low = ADCL;
- high = ADCH;
+ // ADC macro takes care of reading ADC register.
+ // avr-gcc implements the proper reading order: ADCL is read first.
+ return ADC;
#else
// we dont have an ADC, return 0
- low = 0;
- high = 0;
+ return 0;
#endif
-
- // combine the two bytes
- return (high << 8) | low;
}
// Right now, PWM output only works on the pins with
diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c
index 27a62fc..432a150 100644
--- a/cores/arduino/wiring_digital.c
+++ b/cores/arduino/wiring_digital.c
@@ -67,7 +67,7 @@ void pinMode(uint8_t pin, uint8_t mode)
//
// Mark Sproul:
// - Removed inline. Save 170 bytes on atmega1280
-// - changed to a switch statment; added 32 bytes but much easier to read and maintain.
+// - changed to a switch statement; added 32 bytes but much easier to read and maintain.
// - Added more #ifdefs, now compiles for atmega645
//
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));