diff options
Diffstat (limited to 'cores')
| -rw-r--r-- | cores/arduino/CDC.cpp | 56 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial.cpp | 4 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial0.cpp | 4 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial1.cpp | 28 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial2.cpp | 32 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial3.cpp | 32 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial_private.h | 5 | ||||
| -rw-r--r-- | cores/arduino/Stream.cpp | 2 | ||||
| -rw-r--r-- | cores/arduino/USBAPI.h | 5 | ||||
| -rw-r--r-- | cores/arduino/USBCore.cpp | 7 | ||||
| -rw-r--r-- | cores/arduino/avr-libc/malloc.c | 267 | ||||
| -rw-r--r-- | cores/arduino/avr-libc/realloc.c | 150 | ||||
| -rw-r--r-- | cores/arduino/avr-libc/sectionname.h | 49 | ||||
| -rw-r--r-- | cores/arduino/avr-libc/stdlib_private.h | 58 | 
14 files changed, 57 insertions, 642 deletions
diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index aa1275d..bf3d076 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -114,64 +114,43 @@ bool WEAK CDC_Setup(Setup& setup)  } -int _serialPeek = -1;  void Serial_::begin(unsigned long /* baud_count */)  { +	peek_buffer = -1;  }  void Serial_::begin(unsigned long /* baud_count */, byte /* config */)  { +	peek_buffer = -1;  }  void Serial_::end(void)  {  } -void Serial_::accept(void)  -{ -	int i = (unsigned int)(_rx_buffer_head+1) % SERIAL_BUFFER_SIZE; -	 -	// if we should be storing the received character into the location -	// just before the tail (meaning that the head would advance to the -	// current location of the tail), we're about to overflow the buffer -	// and so we don't write the character or advance the head. - -	// while we have room to store a byte -	while (i != _rx_buffer_tail) { -		int c = USB_Recv(CDC_RX); -		if (c == -1) -			break;	// no more data -		_rx_buffer[_rx_buffer_head] = c; -		_rx_buffer_head = i; - -		i = (unsigned int)(_rx_buffer_head+1) % SERIAL_BUFFER_SIZE; -	} -} -  int Serial_::available(void)  { -	return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_BUFFER_SIZE; +	if (peek_buffer >= 0) { +		return 1 + USB_Available(CDC_RX); +	} +	return USB_Available(CDC_RX);  }  int Serial_::peek(void)  { -	if (_rx_buffer_head == _rx_buffer_tail) { -		return -1; -	} else { -		return _rx_buffer[_rx_buffer_tail]; -	} +	if (peek_buffer < 0) +		peek_buffer = USB_Recv(CDC_RX); +	return peek_buffer;  }  int Serial_::read(void)  { -	// if the head isn't ahead of the tail, we don't have any characters -	if (_rx_buffer_head == _rx_buffer_tail) { -		return -1; -	} else { -		unsigned char c = _rx_buffer[_rx_buffer_tail]; -		_rx_buffer_tail = (unsigned int)(_rx_buffer_tail + 1) % SERIAL_BUFFER_SIZE; +	if (peek_buffer >= 0) { +		int c = peek_buffer; +		peek_buffer = -1;  		return c; -	}	 +	} +	return USB_Recv(CDC_RX);  }  void Serial_::flush(void) @@ -181,6 +160,11 @@ void Serial_::flush(void)  size_t Serial_::write(uint8_t c)  { +	return write(&c, 1); +} + +size_t Serial_::write(const uint8_t *buffer, size_t size) +{  	/* only try to send bytes if the high-level CDC connection itself   	 is open (not just the pipe) - the OS should set lineState when the port  	 is opened and clear lineState when the port is closed. @@ -191,7 +175,7 @@ size_t Serial_::write(uint8_t c)  	// open connection isn't broken cleanly (cable is yanked out, host dies  	// or locks up, or host virtual serial port hangs)  	if (_usbLineInfo.lineState > 0)	{ -		int r = USB_Send(CDC_TX,&c,1); +		int r = USB_Send(CDC_TX,buffer,size);  		if (r > 0) {  			return r;  		} else { diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp index e165136..ed29641 100644 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -117,7 +117,7 @@ void HardwareSerial::begin(unsigned long baud, byte config)      baud_setting = (F_CPU / 8 / baud - 1) / 2;    } -  // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) +  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)    *_ubrrh = baud_setting >> 8;    *_ubrrl = baud_setting; @@ -152,7 +152,7 @@ void HardwareSerial::end()  int HardwareSerial::available(void)  { -  return (unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_RX_BUFFER_SIZE; +  return (int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_RX_BUFFER_SIZE;  }  int HardwareSerial::peek(void) diff --git a/cores/arduino/HardwareSerial0.cpp b/cores/arduino/HardwareSerial0.cpp index 67495ad..1146eeb 100644 --- a/cores/arduino/HardwareSerial0.cpp +++ b/cores/arduino/HardwareSerial0.cpp @@ -43,7 +43,7 @@  #elif defined(USART_RXC_vect)    ISR(USART_RXC_vect) // ATmega8  #else -  #error "Don't know what the Data Received vector is called for the first UART" +  #error "Don't know what the Data Received vector is called for Serial"  #endif    {      Serial._rx_complete_irq(); @@ -58,7 +58,7 @@ ISR(USART0_UDRE_vect)  #elif defined(USART_UDRE_vect)  ISR(USART_UDRE_vect)  #else -  #error "Don't know what the Data Register Empty vector is called for the first UART" +  #error "Don't know what the Data Register Empty vector is called for Serial"  #endif  {    Serial._tx_udr_empty_irq(); diff --git a/cores/arduino/HardwareSerial1.cpp b/cores/arduino/HardwareSerial1.cpp index ec076e7..19625e2 100644 --- a/cores/arduino/HardwareSerial1.cpp +++ b/cores/arduino/HardwareSerial1.cpp @@ -36,39 +36,29 @@  #if defined(HAVE_HWSERIAL1) -#if defined(USART_RX_vect) -  ISR(USART_RX_vect) +#if defined(UART1_RX_vect) +ISR(UART1_RX_vect)  #elif defined(USART1_RX_vect) -  ISR(USART1_RX_vect) -#elif defined(USART_RXC_vect) -  ISR(USART_RXC_vect) // ATmega8 +ISR(USART1_RX_vect)  #else -  #error "Don't know what the Data Received vector is called for the first UART" +#error "Don't know what the Data Register Empty vector is called for Serial1"  #endif -  { -    Serial1._rx_complete_irq(); -  } +{ +  Serial1._rx_complete_irq(); +}  #if defined(UART1_UDRE_vect)  ISR(UART1_UDRE_vect) -#elif defined(UART_UDRE_vect) -ISR(UART_UDRE_vect)  #elif defined(USART1_UDRE_vect)  ISR(USART1_UDRE_vect) -#elif defined(USART_UDRE_vect) -ISR(USART_UDRE_vect)  #else -  #error "Don't know what the Data Register Empty vector is called for the first UART" +#error "Don't know what the Data Register Empty vector is called for Serial1"  #endif  {    Serial1._tx_udr_empty_irq();  } -#if defined(UBRRH) && defined(UBRRL) -  HardwareSerial Serial1(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); -#else -  HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1); -#endif +HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1);  // Function that can be weakly referenced by serialEventRun to prevent  // pulling in this file if it's not otherwise used. diff --git a/cores/arduino/HardwareSerial2.cpp b/cores/arduino/HardwareSerial2.cpp index e700770..fd334ae 100644 --- a/cores/arduino/HardwareSerial2.cpp +++ b/cores/arduino/HardwareSerial2.cpp @@ -36,39 +36,17 @@  #if defined(HAVE_HWSERIAL2) -#if defined(USART_RX_vect) -  ISR(USART_RX_vect) -#elif defined(USART2_RX_vect) -  ISR(USART2_RX_vect) -#elif defined(USART_RXC_vect) -  ISR(USART_RXC_vect) // ATmega8 -#else -  #error "Don't know what the Data Received vector is called for the first UART" -#endif -  { -    Serial2._rx_complete_irq(); -  } +ISR(USART2_RX_vect) +{ +  Serial2._rx_complete_irq(); +} -#if defined(UART2_UDRE_vect) -ISR(UART2_UDRE_vect) -#elif defined(UART_UDRE_vect) -ISR(UART_UDRE_vect) -#elif defined(USART2_UDRE_vect)  ISR(USART2_UDRE_vect) -#elif defined(USART_UDRE_vect) -ISR(USART_UDRE_vect) -#else -  #error "Don't know what the Data Register Empty vector is called for the first UART" -#endif  {    Serial2._tx_udr_empty_irq();  } -#if defined(UBRRH) && defined(UBRRL) -  HardwareSerial Serial2(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); -#else -  HardwareSerial Serial2(&UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2); -#endif +HardwareSerial Serial2(&UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2);  // Function that can be weakly referenced by serialEventRun to prevent  // pulling in this file if it's not otherwise used. diff --git a/cores/arduino/HardwareSerial3.cpp b/cores/arduino/HardwareSerial3.cpp index 300c4bd..a68095b 100644 --- a/cores/arduino/HardwareSerial3.cpp +++ b/cores/arduino/HardwareSerial3.cpp @@ -36,39 +36,17 @@  #if defined(HAVE_HWSERIAL3) -#if defined(USART_RX_vect) -  ISR(USART_RX_vect) -#elif defined(USART3_RX_vect) -  ISR(USART3_RX_vect) -#elif defined(USART_RXC_vect) -  ISR(USART_RXC_vect) // ATmega8 -#else -  #error "Don't know what the Data Received vector is called for the first UART" -#endif -  { -    Serial3._rx_complete_irq(); -  } +ISR(USART3_RX_vect) +{ +  Serial3._rx_complete_irq(); +} -#if defined(UART3_UDRE_vect) -ISR(UART3_UDRE_vect) -#elif defined(UART_UDRE_vect) -ISR(UART_UDRE_vect) -#elif defined(USART3_UDRE_vect)  ISR(USART3_UDRE_vect) -#elif defined(USART_UDRE_vect) -ISR(USART_UDRE_vect) -#else -  #error "Don't know what the Data Register Empty vector is called for the first UART" -#endif  {    Serial3._tx_udr_empty_irq();  } -#if defined(UBRRH) && defined(UBRRL) -  HardwareSerial Serial3(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); -#else -  HardwareSerial Serial3(&UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3); -#endif +HardwareSerial Serial3(&UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3);  // Function that can be weakly referenced by serialEventRun to prevent  // pulling in this file if it's not otherwise used. diff --git a/cores/arduino/HardwareSerial_private.h b/cores/arduino/HardwareSerial_private.h index ea41028..761a5e5 100644 --- a/cores/arduino/HardwareSerial_private.h +++ b/cores/arduino/HardwareSerial_private.h @@ -34,6 +34,11 @@  // slower.  #if !defined(TXC0)  #if defined(TXC) +// Some chips like ATmega8 don't have UPE, only PE. The other bits are +// named as expected. +#if !defined(UPE) && defined(PE) +#define UPE PE +#endif  // On ATmega8, the uart and its bits are not numbered, so there is no TXC0 etc.  #define TXC0 TXC  #define RXEN0 RXEN diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp index a12a72e..39873aa 100644 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -75,7 +75,7 @@ void Stream::setTimeout(unsigned long timeout)  // sets the maximum number of mi   // find returns true if the target string is found  bool  Stream::find(char *target)  { -  return findUntil(target, NULL); +  return findUntil(target, "");  }  // reads data from the stream until the target string of given length is found diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index 5a33002..7d41ca0 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -35,17 +35,20 @@ struct ring_buffer;  class Serial_ : public Stream  { +private: +	int peek_buffer;  public: +	Serial_() { peek_buffer = -1; };  	void begin(unsigned long);  	void begin(unsigned long, uint8_t);  	void end(void);  	virtual int available(void); -	virtual void accept(void);  	virtual int peek(void);  	virtual int read(void);  	virtual void flush(void);  	virtual size_t write(uint8_t); +	virtual size_t write(const uint8_t*, size_t);  	using Print::write; // pull in write(str) and write(buf, size) from Print  	operator bool(); diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index 9eb7b33..39a9530 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -289,9 +289,12 @@ int USB_Send(u8 ep, const void* d, int len)  		if (n > len)  			n = len; -		len -= n;  		{  			LockEP lock(ep); +			// Frame may have been released by the SOF interrupt handler +			if (!ReadWriteAllowed()) +				continue; +			len -= n;  			if (ep & TRANSFER_ZERO)  			{  				while (n--) @@ -627,8 +630,6 @@ ISR(USB_GEN_vect)  	{  #ifdef CDC_ENABLED  		USB_Flush(CDC_TX);				// Send a tx frame if found -		if (USB_Available(CDC_RX))	// Handle received bytes (if any) -			Serial.accept();  #endif  		// check whether the one-shot period has elapsed.  if so, turn off the LED diff --git a/cores/arduino/avr-libc/malloc.c b/cores/arduino/avr-libc/malloc.c deleted file mode 100644 index 9dcfe21..0000000 --- a/cores/arduino/avr-libc/malloc.c +++ /dev/null @@ -1,267 +0,0 @@ -/* Copyright (c) 2002, 2004, 2010 Joerg Wunsch -   Copyright (c) 2010  Gerben van den Broeke -   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: malloc.c 2149 2010-06-09 20:45:37Z joerg_wunsch $ */ - -#include <stdlib.h> -#include "sectionname.h" -#include "stdlib_private.h" - -#include <avr/io.h> - -/* - * Exported interface: - * - * When extending the data segment, the allocator will not try to go - * beyond the current stack limit, decreased by __malloc_margin bytes. - * Thus, all possible stack frames of interrupt routines that could - * interrupt the current function, plus all further nested function - * calls must not require more stack space, or they'll risk to collide - * 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; - -char *__brkval; -struct __freelist *__flp; - -ATTRIBUTE_CLIB_SECTION -void * -malloc(size_t len) -{ -	struct __freelist *fp1, *fp2, *sfp1, *sfp2; -	char *cp; -	size_t s, avail; - -	/* -	 * Our minimum chunk size is the size of a pointer (plus the -	 * size of the "sz" field, but we don't need to account for -	 * this), otherwise we could not possibly fit a freelist entry -	 * into the chunk later. -	 */ -	if (len < sizeof(struct __freelist) - sizeof(size_t)) -		len = sizeof(struct __freelist) - sizeof(size_t); - -	/* -	 * First, walk the free list and try finding a chunk that -	 * would match exactly.  If we found one, we are done.  While -	 * walking, note down the smallest chunk we found that would -	 * still fit the request -- we need it for step 2. -	 * -	 */ -	for (s = 0, fp1 = __flp, fp2 = 0; -	     fp1; -	     fp2 = fp1, fp1 = fp1->nx) { -		if (fp1->sz < len) -			continue; -		if (fp1->sz == len) { -			/* -			 * Found it.  Disconnect the chunk from the -			 * freelist, and return it. -			 */ -			if (fp2) -				fp2->nx = fp1->nx; -			else -				__flp = fp1->nx; -			return &(fp1->nx); -		} -		else { -			if (s == 0 || fp1->sz < s) { -				/* this is the smallest chunk found so far */ -				s = fp1->sz; -				sfp1 = fp1; -				sfp2 = fp2; -			} -		} -	} -	/* -	 * Step 2: If we found a chunk on the freelist that would fit -	 * (but was too large), look it up again and use it, since it -	 * is our closest match now.  Since the freelist entry needs -	 * to be split into two entries then, watch out that the -	 * difference between the requested size and the size of the -	 * chunk found is large enough for another freelist entry; if -	 * not, just enlarge the request size to what we have found, -	 * and use the entire chunk. -	 */ -	if (s) { -		if (s - len < sizeof(struct __freelist)) { -			/* Disconnect it from freelist and return it. */ -			if (sfp2) -				sfp2->nx = sfp1->nx; -			else -				__flp = sfp1->nx; -			return &(sfp1->nx); -		} -		/* -		 * Split them up.  Note that we leave the first part -		 * as the new (smaller) freelist entry, and return the -		 * upper portion to the caller.  This saves us the -		 * work to fix up the freelist chain; we just need to -		 * fixup the size of the current entry, and note down -		 * the size of the new chunk before returning it to -		 * the caller. -		 */ -		cp = (char *)sfp1; -		s -= len; -		cp += s; -		sfp2 = (struct __freelist *)cp; -		sfp2->sz = len; -		sfp1->sz = s - sizeof(size_t); -		return &(sfp2->nx); -	} -	/* -	 * Step 3: If the request could not be satisfied from a -	 * freelist entry, just prepare a new chunk.  This means we -	 * need to obtain more memory first.  The largest address just -	 * not allocated so far is remembered in the brkval variable. -	 * Under Unix, the "break value" was the end of the data -	 * segment as dynamically requested from the operating system. -	 * Since we don't have an operating system, just make sure -	 * that we don't collide with the stack. -	 */ -	if (__brkval == 0) -		__brkval = __malloc_heap_start; -	cp = __malloc_heap_end; -	if (cp == 0) -		cp = STACK_POINTER() - __malloc_margin; -	if (cp <= __brkval) -	  /* -	   * Memory exhausted. -	   */ -	  return 0; -	avail = cp - __brkval; -	/* -	 * Both tests below are needed to catch the case len >= 0xfffe. -	 */ -	if (avail >= len && avail >= len + sizeof(size_t)) { -		fp1 = (struct __freelist *)__brkval; -		__brkval += len + sizeof(size_t); -		fp1->sz = len; -		return &(fp1->nx); -	} -	/* -	 * Step 4: There's no help, just fail. :-/ -	 */ -	return 0; -} - - -ATTRIBUTE_CLIB_SECTION -void -free(void *p) -{ -	struct __freelist *fp1, *fp2, *fpnew; -	char *cp1, *cp2, *cpnew; - -	/* ISO C says free(NULL) must be a no-op */ -	if (p == 0) -		return; - -	cpnew = p; -	cpnew -= sizeof(size_t); -	fpnew = (struct __freelist *)cpnew; -	fpnew->nx = 0; - -	/* -	 * Trivial case first: if there's no freelist yet, our entry -	 * will be the only one on it.  If this is the last entry, we -	 * can reduce __brkval instead. -	 */ -	if (__flp == 0) { -		if ((char *)p + fpnew->sz == __brkval) -			__brkval = cpnew; -		else -			__flp = fpnew; -		return; -	} - -	/* -	 * Now, find the position where our new entry belongs onto the -	 * freelist.  Try to aggregate the chunk with adjacent chunks -	 * if possible. -	 */ -	for (fp1 = __flp, fp2 = 0; -	     fp1; -	     fp2 = fp1, fp1 = fp1->nx) { -		if (fp1 < fpnew) -			continue; -		cp1 = (char *)fp1; -		fpnew->nx = fp1; -		if ((char *)&(fpnew->nx) + fpnew->sz == cp1) { -			/* upper chunk adjacent, assimilate it */ -			fpnew->sz += fp1->sz + sizeof(size_t); -			fpnew->nx = fp1->nx; -		} -		if (fp2 == 0) { -			/* new head of freelist */ -			__flp = fpnew; -			return; -		} -		break; -	} -	/* -	 * Note that we get here either if we hit the "break" above, -	 * or if we fell off the end of the loop.  The latter means -	 * we've got a new topmost chunk.  Either way, try aggregating -	 * with the lower chunk if possible. -	 */ -	fp2->nx = fpnew; -	cp2 = (char *)&(fp2->nx); -	if (cp2 + fp2->sz == cpnew) { -		/* lower junk adjacent, merge */ -		fp2->sz += fpnew->sz + sizeof(size_t); -		fp2->nx = fpnew->nx; -	} -	/* -	 * If there's a new topmost chunk, lower __brkval instead. -	 */ -	for (fp1 = __flp, fp2 = 0; -	     fp1->nx != 0; -	     fp2 = fp1, fp1 = fp1->nx) -		/* advance to entry just before end of list */; -	cp2 = (char *)&(fp1->nx); -	if (cp2 + fp1->sz == __brkval) { -		if (fp2 == NULL) -			/* Freelist is empty now. */ -			__flp = NULL; -		else -			fp2->nx = NULL; -		__brkval = cp2 - sizeof(size_t); -	} -} - diff --git a/cores/arduino/avr-libc/realloc.c b/cores/arduino/avr-libc/realloc.c deleted file mode 100644 index b76ce56..0000000 --- a/cores/arduino/avr-libc/realloc.c +++ /dev/null @@ -1,150 +0,0 @@ -/* 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 deleted file mode 100644 index 8e0f448..0000000 --- a/cores/arduino/avr-libc/sectionname.h +++ /dev/null @@ -1,49 +0,0 @@ -/* 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 deleted file mode 100644 index 65c3427..0000000 --- a/cores/arduino/avr-libc/stdlib_private.h +++ /dev/null @@ -1,58 +0,0 @@ -/* 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) -  | 
