From 3bb14c3a0be669df687f2cb8e4311302ef4d36b9 Mon Sep 17 00:00:00 2001 From: richardbarry Date: Fri, 18 Sep 2009 14:04:40 +0000 Subject: [PATCH] Update to use the latest Yagarto and change the C handler part of the interrupt routines to use the noinline attribute. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@852 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../RTOSDemo/Makefile | 3 +- .../RTOSDemo/USB/USB_ISR.c | 4 +- .../RTOSDemo/atmel-rom.ld | 6 + .../RTOSDemo/syscalls.c | 162 ++++++++++++++++++ .../RTOSDemo/webserver/EMAC_ISR.c | 4 +- 5 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile index b68a7d855..6eb83205e 100644 --- a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile @@ -105,7 +105,8 @@ THUMB_SOURCE= \ $(RTOS_SOURCE_DIR)/tasks.c \ $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/port.c \ $(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c \ - ./USB/USBSample.c + ./USB/USBSample.c \ + syscalls.c ARM_SOURCE= \ $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/portISR.c \ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c index 1f64aec63..f2df80eda 100644 --- a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c @@ -83,7 +83,7 @@ void vUSB_ISR_Wrapper( void ) __attribute__((naked)); * Actual ISR handler. This must be separate from the entry point as the stack * is used. */ -void vUSB_ISR_Handler( void ); +void vUSB_ISR_Handler( void ) __attribute__((noinline)); /*-----------------------------------------------------------*/ @@ -182,7 +182,7 @@ void vUSB_ISR_Wrapper( void ) /* Call the handler itself. This must be a separate function as it uses the stack. */ - vUSB_ISR_Handler(); + __asm volatile ("bl vUSB_ISR_Handler"); /* Restore the context of the task that is going to execute next. This might not be the same as the originally diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld index db22b4acd..17139f7ae 100644 --- a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld @@ -36,6 +36,12 @@ SECTIONS *(.bss) } >ram + . = ALIGN(4); + .eh_frame : + { + KEEP (*(.eh_frame)) + } > ram + /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. */ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c new file mode 100644 index 000000000..5dff88128 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c @@ -0,0 +1,162 @@ +/**************************************************************************** +* Copyright (c) 2009 by Michael Fischer. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. 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. +* 3. Neither the name of the author nor the names of its 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. +* +**************************************************************************** +* History: +* +* 28.03.09 mifi First Version, based on the original syscall.c from +* newlib version 1.17.0 +****************************************************************************/ + +#include +#include +#include +#include +#include + +/***************************************************************************/ + +int _read_r (struct _reent *r, int file, char * ptr, int len) +{ + r = r; + file = file; + ptr = ptr; + len = len; + + errno = EINVAL; + return -1; +} + +/***************************************************************************/ + +int _lseek_r (struct _reent *r, int file, int ptr, int dir) +{ + r = r; + file = file; + ptr = ptr; + dir = dir; + + return 0; +} + +/***************************************************************************/ + +int _write_r (struct _reent *r, int file, char * ptr, int len) +{ + r = r; + file = file; + ptr = ptr; + +#if 0 + int index; + + /* For example, output string by UART */ + for(index=0; index stack_ptr) + { + /* Some of the libstdc++-v3 tests rely upon detecting + out of memory errors, so do not abort here. */ +#if 0 + extern void abort (void); + + _write (1, "_sbrk: Heap and stack collision\n", 32); + + abort (); +#else + errno = ENOMEM; + return (caddr_t) -1; +#endif + } + + heap_end += incr; + + return (caddr_t) prev_heap_end; +} + +/***************************************************************************/ + +int _fstat_r (struct _reent *r, int file, struct stat * st) +{ + r = r; + file = file; + + memset (st, 0, sizeof (* st)); + st->st_mode = S_IFCHR; + return 0; +} + +/***************************************************************************/ + +int _isatty_r(struct _reent *r, int fd) +{ + r = r; + fd = fd; + + return 1; +} + +/*** EOF ***/ + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c index 1d88c2f5b..f399b0e4d 100644 --- a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c @@ -54,7 +54,7 @@ void vEMACISR_Wrapper( void ) __attribute__((naked)); /* Handler called by the ISR wrapper. This must be kept a separate function to ensure the stack frame is correctly set up. */ -void vEMACISR_Handler( void ); +void vEMACISR_Handler( void ) __attribute__((noinline)); static xSemaphoreHandle xEMACSemaphore; @@ -103,7 +103,7 @@ void vEMACISR_Wrapper( void ) /* Call the handler task to do the actual work. This must be a separate function to ensure the stack frame is correctly set up. */ - vEMACISR_Handler(); + __asm volatile ("bl vEMACISR_Handler"); /* Restore the context of whichever task is the next to run. */ portRESTORE_CONTEXT(); -- 2.39.5