aboutsummaryrefslogtreecommitdiff
path: root/cores/arduino
diff options
context:
space:
mode:
authorCristian Maglie <c.maglie@bug.st>2013-04-03 13:51:04 +0200
committerCristian Maglie <c.maglie@bug.st>2013-04-03 13:51:04 +0200
commitee90e68e86dd61d86f5d17b69080338328765b22 (patch)
treee620c0edc2690ab789b665e567910640597aa6fe /cores/arduino
parent0ecdc5ebc96ad4c7c548c438a03d9ce00679db8b (diff)
parentf50c307be280dc6ece9e70c43b301c1db36291a0 (diff)
Merged 1.0.5
Merge remote-tracking branch 'arduino/master' into ide-1.5.x Conflicts: app/src/processing/app/Base.java build/shared/revisions.txt hardware/arduino/avr/cores/arduino/malloc.c hardware/arduino/cores/arduino/avr-libc/malloc.c hardware/arduino/cores/arduino/malloc.c todo.txt
Diffstat (limited to 'cores/arduino')
-rw-r--r--cores/arduino/HardwareSerial.cpp29
-rw-r--r--cores/arduino/WInterrupts.c32
-rw-r--r--cores/arduino/avr-libc/malloc.c (renamed from cores/arduino/malloc.c)151
-rw-r--r--cores/arduino/avr-libc/realloc.c150
-rw-r--r--cores/arduino/avr-libc/sectionname.h49
-rw-r--r--cores/arduino/avr-libc/stdlib_private.h58
-rw-r--r--cores/arduino/wiring.c4
-rw-r--r--cores/arduino/wiring_analog.c2
8 files changed, 305 insertions, 170 deletions
diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp
index 794a7be..eb2365f 100644
--- a/cores/arduino/HardwareSerial.cpp
+++ b/cores/arduino/HardwareSerial.cpp
@@ -104,24 +104,19 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#if !defined(USART0_RX_vect) && defined(USART1_RX_vect)
// do nothing - on the 32u4 the first USART is USART1
#else
-#if !defined(USART_RX_vect) && !defined(SIG_USART0_RECV) && \
- !defined(SIG_UART0_RECV) && !defined(USART0_RX_vect) && \
- !defined(SIG_UART_RECV)
+#if !defined(USART_RX_vect) && !defined(USART0_RX_vect) && \
+ !defined(USART_RXC_vect)
#error "Don't know what the Data Received vector is called for the first UART"
#else
void serialEvent() __attribute__((weak));
void serialEvent() {}
#define serialEvent_implemented
#if defined(USART_RX_vect)
- SIGNAL(USART_RX_vect)
-#elif defined(SIG_USART0_RECV)
- SIGNAL(SIG_USART0_RECV)
-#elif defined(SIG_UART0_RECV)
- SIGNAL(SIG_UART0_RECV)
+ ISR(USART_RX_vect)
#elif defined(USART0_RX_vect)
- SIGNAL(USART0_RX_vect)
-#elif defined(SIG_UART_RECV)
- SIGNAL(SIG_UART_RECV)
+ ISR(USART0_RX_vect)
+#elif defined(USART_RXC_vect)
+ ISR(USART_RXC_vect) // ATmega8
#endif
{
#if defined(UDR0)
@@ -149,7 +144,7 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
void serialEvent1() __attribute__((weak));
void serialEvent1() {}
#define serialEvent1_implemented
- SIGNAL(USART1_RX_vect)
+ ISR(USART1_RX_vect)
{
if (bit_is_clear(UCSR1A, UPE1)) {
unsigned char c = UDR1;
@@ -158,15 +153,13 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
unsigned char c = UDR1;
};
}
-#elif defined(SIG_USART1_RECV)
- #error SIG_USART1_RECV
#endif
#if defined(USART2_RX_vect) && defined(UDR2)
void serialEvent2() __attribute__((weak));
void serialEvent2() {}
#define serialEvent2_implemented
- SIGNAL(USART2_RX_vect)
+ ISR(USART2_RX_vect)
{
if (bit_is_clear(UCSR2A, UPE2)) {
unsigned char c = UDR2;
@@ -175,15 +168,13 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
unsigned char c = UDR2;
};
}
-#elif defined(SIG_USART2_RECV)
- #error SIG_USART2_RECV
#endif
#if defined(USART3_RX_vect) && defined(UDR3)
void serialEvent3() __attribute__((weak));
void serialEvent3() {}
#define serialEvent3_implemented
- SIGNAL(USART3_RX_vect)
+ ISR(USART3_RX_vect)
{
if (bit_is_clear(UCSR3A, UPE3)) {
unsigned char c = UDR3;
@@ -192,8 +183,6 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
unsigned char c = UDR3;
};
}
-#elif defined(SIG_USART3_RECV)
- #error SIG_USART3_RECV
#endif
void serialEventRun(void)
diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c
index 62efc9c..de49cd1 100644
--- a/cores/arduino/WInterrupts.c
+++ b/cores/arduino/WInterrupts.c
@@ -230,82 +230,82 @@ void attachInterruptTwi(void (*userFunc)(void) ) {
*/
#if defined(__AVR_ATmega32U4__)
-SIGNAL(INT0_vect) {
+ISR(INT0_vect) {
if(intFunc[EXTERNAL_INT_0])
intFunc[EXTERNAL_INT_0]();
}
-SIGNAL(INT1_vect) {
+ISR(INT1_vect) {
if(intFunc[EXTERNAL_INT_1])
intFunc[EXTERNAL_INT_1]();
}
-SIGNAL(INT2_vect) {
+ISR(INT2_vect) {
if(intFunc[EXTERNAL_INT_2])
intFunc[EXTERNAL_INT_2]();
}
-SIGNAL(INT3_vect) {
+ISR(INT3_vect) {
if(intFunc[EXTERNAL_INT_3])
intFunc[EXTERNAL_INT_3]();
}
#elif defined(EICRA) && defined(EICRB)
-SIGNAL(INT0_vect) {
+ISR(INT0_vect) {
if(intFunc[EXTERNAL_INT_2])
intFunc[EXTERNAL_INT_2]();
}
-SIGNAL(INT1_vect) {
+ISR(INT1_vect) {
if(intFunc[EXTERNAL_INT_3])
intFunc[EXTERNAL_INT_3]();
}
-SIGNAL(INT2_vect) {
+ISR(INT2_vect) {
if(intFunc[EXTERNAL_INT_4])
intFunc[EXTERNAL_INT_4]();
}
-SIGNAL(INT3_vect) {
+ISR(INT3_vect) {
if(intFunc[EXTERNAL_INT_5])
intFunc[EXTERNAL_INT_5]();
}
-SIGNAL(INT4_vect) {
+ISR(INT4_vect) {
if(intFunc[EXTERNAL_INT_0])
intFunc[EXTERNAL_INT_0]();
}
-SIGNAL(INT5_vect) {
+ISR(INT5_vect) {
if(intFunc[EXTERNAL_INT_1])
intFunc[EXTERNAL_INT_1]();
}
-SIGNAL(INT6_vect) {
+ISR(INT6_vect) {
if(intFunc[EXTERNAL_INT_6])
intFunc[EXTERNAL_INT_6]();
}
-SIGNAL(INT7_vect) {
+ISR(INT7_vect) {
if(intFunc[EXTERNAL_INT_7])
intFunc[EXTERNAL_INT_7]();
}
#else
-SIGNAL(INT0_vect) {
+ISR(INT0_vect) {
if(intFunc[EXTERNAL_INT_0])
intFunc[EXTERNAL_INT_0]();
}
-SIGNAL(INT1_vect) {
+ISR(INT1_vect) {
if(intFunc[EXTERNAL_INT_1])
intFunc[EXTERNAL_INT_1]();
}
#if defined(EICRA) && defined(ISC20)
-SIGNAL(INT2_vect) {
+ISR(INT2_vect) {
if(intFunc[EXTERNAL_INT_2])
intFunc[EXTERNAL_INT_2]();
}
@@ -314,7 +314,7 @@ SIGNAL(INT2_vect) {
#endif
/*
-SIGNAL(SIG_2WIRE_SERIAL) {
+ISR(TWI_vect) {
if(twiIntFunc)
twiIntFunc();
}
diff --git a/cores/arduino/malloc.c b/cores/arduino/avr-libc/malloc.c
index 9c56600..9dcfe21 100644
--- a/cores/arduino/malloc.c
+++ b/cores/arduino/avr-libc/malloc.c
@@ -2,9 +2,6 @@
Copyright (c) 2010 Gerben van den Broeke
All rights reserved.
- malloc, free, realloc from avr-libc 1.7.0
- with minor modifications, by Paul Stoffregen
-
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
@@ -33,20 +30,14 @@
POSSIBILITY OF SUCH DAMAGE.
*/
+
+/* $Id: malloc.c 2149 2010-06-09 20:45:37Z joerg_wunsch $ */
#include <stdlib.h>
-#include <inttypes.h>
-#include <string.h>
-#include <avr/io.h>
-
-
-#define __MALLOC_MARGIN__ 120
+#include "sectionname.h"
+#include "stdlib_private.h"
-
-struct __freelist {
- size_t sz;
- struct __freelist *nx;
-};
+#include <avr/io.h>
/*
* Exported interface:
@@ -59,13 +50,16 @@ struct __freelist {
* with the data segment.
*/
+/* May be changed by the user only before the first malloc() call. */
+
+size_t __malloc_margin = 128;
+char *__malloc_heap_start = &__heap_start;
+char *__malloc_heap_end = &__heap_end;
-#define STACK_POINTER() ((char *)AVR_STACK_POINTER_REG)
-extern char __heap_start;
-char *__brkval = &__heap_start; // first location not yet allocated
-struct __freelist *__flp; // freelist pointer (head of freelist)
-char *__brkval_maximum = 100;
+char *__brkval;
+struct __freelist *__flp;
+ATTRIBUTE_CLIB_SECTION
void *
malloc(size_t len)
{
@@ -160,7 +154,11 @@ malloc(size_t len)
* Since we don't have an operating system, just make sure
* that we don't collide with the stack.
*/
- cp = STACK_POINTER() - __MALLOC_MARGIN__;
+ if (__brkval == 0)
+ __brkval = __malloc_heap_start;
+ cp = __malloc_heap_end;
+ if (cp == 0)
+ cp = STACK_POINTER() - __malloc_margin;
if (cp <= __brkval)
/*
* Memory exhausted.
@@ -173,7 +171,6 @@ malloc(size_t len)
if (avail >= len && avail >= len + sizeof(size_t)) {
fp1 = (struct __freelist *)__brkval;
__brkval += len + sizeof(size_t);
- __brkval_maximum = __brkval;
fp1->sz = len;
return &(fp1->nx);
}
@@ -184,6 +181,7 @@ malloc(size_t len)
}
+ATTRIBUTE_CLIB_SECTION
void
free(void *p)
{
@@ -267,114 +265,3 @@ free(void *p)
}
}
-
-
-void *
-realloc(void *ptr, size_t len)
-{
- struct __freelist *fp1, *fp2, *fp3, *ofp3;
- char *cp, *cp1;
- void *memp;
- size_t s, incr;
-
- /* Trivial case, required by C standard. */
- if (ptr == 0)
- return malloc(len);
-
- cp1 = (char *)ptr;
- cp1 -= sizeof(size_t);
- fp1 = (struct __freelist *)cp1;
-
- cp = (char *)ptr + len; /* new next pointer */
- if (cp < cp1)
- /* Pointer wrapped across top of RAM, fail. */
- return 0;
-
- /*
- * See whether we are growing or shrinking. When shrinking,
- * we split off a chunk for the released portion, and call
- * free() on it. Therefore, we can only shrink if the new
- * size is at least sizeof(struct __freelist) smaller than the
- * previous size.
- */
- if (len <= fp1->sz) {
- /* The first test catches a possible unsigned int
- * rollover condition. */
- if (fp1->sz <= sizeof(struct __freelist) ||
- len > fp1->sz - sizeof(struct __freelist))
- return ptr;
- fp2 = (struct __freelist *)cp;
- fp2->sz = fp1->sz - len - sizeof(size_t);
- fp1->sz = len;
- free(&(fp2->nx));
- return ptr;
- }
-
- /*
- * If we get here, we are growing. First, see whether there
- * is space in the free list on top of our current chunk.
- */
- incr = len - fp1->sz;
- cp = (char *)ptr + fp1->sz;
- fp2 = (struct __freelist *)cp;
- for (s = 0, ofp3 = 0, fp3 = __flp;
- fp3;
- ofp3 = fp3, fp3 = fp3->nx) {
- if (fp3 == fp2 && fp3->sz + sizeof(size_t) >= incr) {
- /* found something that fits */
- if (fp3->sz + sizeof(size_t) - incr > sizeof(struct __freelist)) {
- /* split off a new freelist entry */
- cp = (char *)ptr + len;
- fp2 = (struct __freelist *)cp;
- fp2->nx = fp3->nx;
- fp2->sz = fp3->sz - incr;
- fp1->sz = len;
- } else {
- /* it just fits, so use it entirely */
- fp1->sz += fp3->sz + sizeof(size_t);
- fp2 = fp3->nx;
- }
- if (ofp3)
- ofp3->nx = fp2;
- else
- __flp = fp2;
- return ptr;
- }
- /*
- * Find the largest chunk on the freelist while
- * walking it.
- */
- if (fp3->sz > s)
- s = fp3->sz;
- }
- /*
- * If we are the topmost chunk in memory, and there was no
- * large enough chunk on the freelist that could be re-used
- * (by a call to malloc() below), quickly extend the
- * allocation area if possible, without need to copy the old
- * data.
- */
- if (__brkval == (char *)ptr + fp1->sz && len > s) {
- cp = (char *)ptr + len;
- cp1 = STACK_POINTER() - __MALLOC_MARGIN__;
- if (cp < cp1) {
- __brkval = cp;
- __brkval_maximum = cp;
- fp1->sz = len;
- return ptr;
- }
- /* If that failed, we are out of luck. */
- return 0;
- }
-
- /*
- * Call malloc() for a new chunk, then copy over the data, and
- * release the old region.
- */
- if ((memp = malloc(len)) == 0)
- return 0;
- memcpy(memp, ptr, fp1->sz);
- free(ptr);
- return memp;
-}
-
diff --git a/cores/arduino/avr-libc/realloc.c b/cores/arduino/avr-libc/realloc.c
new file mode 100644
index 0000000..b76ce56
--- /dev/null
+++ b/cores/arduino/avr-libc/realloc.c
@@ -0,0 +1,150 @@
+/* Copyright (c) 2004, 2010 Joerg Wunsch
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of the copyright holders nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/* $Id: realloc.c 2127 2010-06-07 14:49:37Z joerg_wunsch $ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "sectionname.h"
+#include "stdlib_private.h"
+
+#include <avr/io.h>
+
+ATTRIBUTE_CLIB_SECTION
+void *
+realloc(void *ptr, size_t len)
+{
+ struct __freelist *fp1, *fp2, *fp3, *ofp3;
+ char *cp, *cp1;
+ void *memp;
+ size_t s, incr;
+
+ /* Trivial case, required by C standard. */
+ if (ptr == 0)
+ return malloc(len);
+
+ cp1 = (char *)ptr;
+ cp1 -= sizeof(size_t);
+ fp1 = (struct __freelist *)cp1;
+
+ cp = (char *)ptr + len; /* new next pointer */
+ if (cp < cp1)
+ /* Pointer wrapped across top of RAM, fail. */
+ return 0;
+
+ /*
+ * See whether we are growing or shrinking. When shrinking,
+ * we split off a chunk for the released portion, and call
+ * free() on it. Therefore, we can only shrink if the new
+ * size is at least sizeof(struct __freelist) smaller than the
+ * previous size.
+ */
+ if (len <= fp1->sz) {
+ /* The first test catches a possible unsigned int
+ * rollover condition. */
+ if (fp1->sz <= sizeof(struct __freelist) ||
+ len > fp1->sz - sizeof(struct __freelist))
+ return ptr;
+ fp2 = (struct __freelist *)cp;
+ fp2->sz = fp1->sz - len - sizeof(size_t);
+ fp1->sz = len;
+ free(&(fp2->nx));
+ return ptr;
+ }
+
+ /*
+ * If we get here, we are growing. First, see whether there
+ * is space in the free list on top of our current chunk.
+ */
+ incr = len - fp1->sz;
+ cp = (char *)ptr + fp1->sz;
+ fp2 = (struct __freelist *)cp;
+ for (s = 0, ofp3 = 0, fp3 = __flp;
+ fp3;
+ ofp3 = fp3, fp3 = fp3->nx) {
+ if (fp3 == fp2 && fp3->sz + sizeof(size_t) >= incr) {
+ /* found something that fits */
+ if (fp3->sz + sizeof(size_t) - incr > sizeof(struct __freelist)) {
+ /* split off a new freelist entry */
+ cp = (char *)ptr + len;
+ fp2 = (struct __freelist *)cp;
+ fp2->nx = fp3->nx;
+ fp2->sz = fp3->sz - incr;
+ fp1->sz = len;
+ } else {
+ /* it just fits, so use it entirely */
+ fp1->sz += fp3->sz + sizeof(size_t);
+ fp2 = fp3->nx;
+ }
+ if (ofp3)
+ ofp3->nx = fp2;
+ else
+ __flp = fp2;
+ return ptr;
+ }
+ /*
+ * Find the largest chunk on the freelist while
+ * walking it.
+ */
+ if (fp3->sz > s)
+ s = fp3->sz;
+ }
+ /*
+ * If we are the topmost chunk in memory, and there was no
+ * large enough chunk on the freelist that could be re-used
+ * (by a call to malloc() below), quickly extend the
+ * allocation area if possible, without need to copy the old
+ * data.
+ */
+ if (__brkval == (char *)ptr + fp1->sz && len > s) {
+ cp1 = __malloc_heap_end;
+ cp = (char *)ptr + len;
+ if (cp1 == 0)
+ cp1 = STACK_POINTER() - __malloc_margin;
+ if (cp < cp1) {
+ __brkval = cp;
+ fp1->sz = len;
+ return ptr;
+ }
+ /* If that failed, we are out of luck. */
+ return 0;
+ }
+
+ /*
+ * Call malloc() for a new chunk, then copy over the data, and
+ * release the old region.
+ */
+ if ((memp = malloc(len)) == 0)
+ return 0;
+ memcpy(memp, ptr, fp1->sz);
+ free(ptr);
+ return memp;
+}
+
diff --git a/cores/arduino/avr-libc/sectionname.h b/cores/arduino/avr-libc/sectionname.h
new file mode 100644
index 0000000..8e0f448
--- /dev/null
+++ b/cores/arduino/avr-libc/sectionname.h
@@ -0,0 +1,49 @@
+/* Copyright (c) 2009 Atmel Corporation
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of the copyright holders nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __SECTIONNAME_H__
+#define __SECTIONNAME_H__
+
+/* Put all avr-libc functions in a common, unique sub-section name under .text. */
+
+#define CLIB_SECTION .text.avr-libc
+#define MLIB_SECTION .text.avr-libc.fplib
+
+#define STR(x) _STR(x)
+#define _STR(x) #x
+
+#define ATTRIBUTE_CLIB_SECTION __attribute__ ((section (STR(CLIB_SECTION))))
+#define ATTRIBUTE_MLIB_SECTION __attribute__ ((section (STR(MLIB_SECTION))))
+
+#define ASSEMBLY_CLIB_SECTION .section CLIB_SECTION, "ax", @progbits
+#define ASSEMBLY_MLIB_SECTION .section MLIB_SECTION, "ax", @progbits
+
+#endif
diff --git a/cores/arduino/avr-libc/stdlib_private.h b/cores/arduino/avr-libc/stdlib_private.h
new file mode 100644
index 0000000..65c3427
--- /dev/null
+++ b/cores/arduino/avr-libc/stdlib_private.h
@@ -0,0 +1,58 @@
+/* Copyright (c) 2004, Joerg Wunsch
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of the copyright holders nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* $Id: stdlib_private.h 1657 2008-03-24 17:11:08Z arcanum $ */
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <avr/io.h>
+
+#if !defined(__DOXYGEN__)
+
+struct __freelist {
+ size_t sz;
+ struct __freelist *nx;
+};
+
+#endif
+
+extern char *__brkval; /* first location not yet allocated */
+extern struct __freelist *__flp; /* freelist pointer (head of freelist) */
+extern size_t __malloc_margin; /* user-changeable before the first malloc() */
+extern char *__malloc_heap_start;
+extern char *__malloc_heap_end;
+
+extern char __heap_start;
+extern char __heap_end;
+
+/* Needed for definition of AVR_STACK_POINTER_REG. */
+#include <avr/io.h>
+
+#define STACK_POINTER() ((char *)AVR_STACK_POINTER_REG)
+
diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c
index ec5b888..5cbe241 100644
--- a/cores/arduino/wiring.c
+++ b/cores/arduino/wiring.c
@@ -42,9 +42,9 @@ volatile unsigned long timer0_millis = 0;
static unsigned char timer0_fract = 0;
#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
-SIGNAL(TIM0_OVF_vect)
+ISR(TIM0_OVF_vect)
#else
-SIGNAL(TIMER0_OVF_vect)
+ISR(TIMER0_OVF_vect)
#endif
{
// copy these to local variables so they can be stored in registers
diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c
index 23b01c6..3f19c7f 100644
--- a/cores/arduino/wiring_analog.c
+++ b/cores/arduino/wiring_analog.c
@@ -47,6 +47,8 @@ int analogRead(uint8_t pin)
if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644P__)
if (pin >= 24) pin -= 24; // allow for channel or pin numbers
+#elif defined(analogPinToChannel) && (defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__))
+ pin = analogPinToChannel(pin);
#else
if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif