Add basic context switching logic
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3682 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
7bd5768988
commit
afbfd492af
@ -63,7 +63,7 @@
|
|||||||
#define AT90USB_IRQ_INT5 5 /* 0x000c External Interrupt Request 5 */
|
#define AT90USB_IRQ_INT5 5 /* 0x000c External Interrupt Request 5 */
|
||||||
#define AT90USB_IRQ_INT6 6 /* 0x000e External Interrupt Request 6 */
|
#define AT90USB_IRQ_INT6 6 /* 0x000e External Interrupt Request 6 */
|
||||||
#define AT90USB_IRQ_INT7 7 /* 0x0010 External Interrupt Request 7 */
|
#define AT90USB_IRQ_INT7 7 /* 0x0010 External Interrupt Request 7 */
|
||||||
#define AT90USB_IRQ_PCINT0 8 /* 0x0012 PCINT0 Pin Change Interrupt Request 0 */
|
#define AT90USB_IRQ_PCINT0 8 /* 0x0012 Pin Change Interrupt Request 0 */
|
||||||
#define AT90USB_IRQ_USBGEN 9 /* 0x0014 USB General USB General Interrupt request */
|
#define AT90USB_IRQ_USBGEN 9 /* 0x0014 USB General USB General Interrupt request */
|
||||||
#define AT90USB_IRQ_USBEP 10 /* 0x0016 USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
|
#define AT90USB_IRQ_USBEP 10 /* 0x0016 USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
|
||||||
#define AT90USB_IRQ_WDT 11 /* 0x0018 Watchdog Time-out Interrupt */
|
#define AT90USB_IRQ_WDT 11 /* 0x0018 Watchdog Time-out Interrupt */
|
||||||
|
@ -52,12 +52,46 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* Register state save array indices */
|
/* Register state save array indices */
|
||||||
|
|
||||||
#define REG_Rx 0 /* Just a placeholder */
|
|
||||||
|
|
||||||
/* Size of the register state save array (in bytes?) */
|
#define REG_SPH 0 /* Stack pointer on exception entry */
|
||||||
|
#define REG_SPL 1
|
||||||
|
#define REG_R27 2 /* r26-r27 */
|
||||||
|
#define REG_R26 3
|
||||||
|
#define REG_R31 4 /* r18-r31 */
|
||||||
|
#define REG_R30 5
|
||||||
|
#define REG_R29 6
|
||||||
|
#define REG_R28 7
|
||||||
|
#define REG_R25 8 /* r25 */
|
||||||
|
#define REG_R23 9 /* r2-r23 */
|
||||||
|
#define REG_R22 10
|
||||||
|
#define REG_R21 11
|
||||||
|
#define REG_R20 12
|
||||||
|
#define REG_R19 13
|
||||||
|
#define REG_R18 14
|
||||||
|
#define REG_R17 15
|
||||||
|
#define REG_R16 16
|
||||||
|
#define REG_R15 17
|
||||||
|
#define REG_R14 18
|
||||||
|
#define REG_R13 19
|
||||||
|
#define REG_R12 20
|
||||||
|
#define REG_R11 21
|
||||||
|
#define REG_R10 22
|
||||||
|
#define REG_R9 23
|
||||||
|
#define REG_R8 24
|
||||||
|
#define REG_R7 25
|
||||||
|
#define REG_R6 26
|
||||||
|
#define REG_R5 27
|
||||||
|
#define REG_R4 28
|
||||||
|
#define REG_R3 29
|
||||||
|
#define REG_R2 30
|
||||||
|
#define REG_R1 31 /* r1 - the "zero" register */
|
||||||
|
#define REG_SREG 32 /* Status register */
|
||||||
|
#define REG_R0 33 /* r0 */
|
||||||
|
#define REG_R24 34 /* r24 */
|
||||||
|
|
||||||
#define XCPTCONTEXT_REGS 1
|
/* Size of the register state save array (in bytes) */
|
||||||
|
|
||||||
|
#define XCPTCONTEXT_REGS 35
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
|
@ -63,20 +63,20 @@
|
|||||||
* files
|
* files
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef signed char _int8_t;
|
typedef signed char _int8_t; /* char is 8-bits */
|
||||||
typedef unsigned char _uint8_t;
|
typedef unsigned char _uint8_t;
|
||||||
|
|
||||||
typedef signed short _int16_t;
|
typedef signed int _int16_t; /* int is 16-bits */
|
||||||
typedef unsigned short _uint16_t;
|
typedef unsigned int _uint16_t;
|
||||||
|
|
||||||
typedef signed int _int32_t;
|
typedef signed long _int32_t; /* long is 32-bits */
|
||||||
typedef unsigned int _uint32_t;
|
typedef unsigned long _uint32_t;
|
||||||
|
|
||||||
typedef signed long long _int64_t;
|
typedef signed long long _int64_t; /* long long is 64-bits */
|
||||||
typedef unsigned long long _uint64_t;
|
typedef unsigned long long _uint64_t;
|
||||||
#define __INT64_DEFINED
|
#define __INT64_DEFINED
|
||||||
|
|
||||||
/* A pointer is 4 bytes */
|
/* A pointer is 2 bytes */
|
||||||
|
|
||||||
typedef signed int _intptr_t;
|
typedef signed int _intptr_t;
|
||||||
typedef unsigned int _uintptr_t;
|
typedef unsigned int _uintptr_t;
|
||||||
|
@ -39,15 +39,15 @@ HEAD_ASRC = at90usb_head.S
|
|||||||
|
|
||||||
# Common AVR files
|
# Common AVR files
|
||||||
|
|
||||||
CMN_ASRCS =
|
CMN_ASRCS = up_switchcontext.S
|
||||||
CMN_CSRCS = up_allocateheap.c up_createstack.c up_exit.c up_idle.c \
|
CMN_CSRCS = up_allocateheap.c up_copystate.c up_createstack.c up_exit.c \
|
||||||
up_initialize.c up_interruptcontext.c up_lowputs.c up_mdelay.c \
|
up_idle.c up_initialize.c up_interruptcontext.c up_lowputs.c \
|
||||||
up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c up_puts.c \
|
up_mdelay.c up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c \
|
||||||
up_releasestack.c up_udelay.c up_usestack.c
|
up_puts.c up_releasestack.c up_udelay.c up_usestack.c
|
||||||
|
|
||||||
# Required aT90USB files
|
# Required aT90USB files
|
||||||
|
|
||||||
CHIP_ASRCS =
|
CHIP_ASRCS = at90usb_exceptions.S
|
||||||
CHIP_CSRCS =
|
CHIP_CSRCS =
|
||||||
|
|
||||||
# Configuration-dependent aT90USB files
|
# Configuration-dependent aT90USB files
|
||||||
|
125
arch/avr/src/at90usb/at90usb_exceptions.S
Executable file
125
arch/avr/src/at90usb/at90usb_exceptions.S
Executable file
@ -0,0 +1,125 @@
|
|||||||
|
/********************************************************************************************
|
||||||
|
* arch/avr/src/at90usb/at90usb_exceptions.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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.
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include "excptmacros.h"
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* External Symbols
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.file "at90usb_exceptions.S"
|
||||||
|
.global up_doirq
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Macros
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Exception Vector Handlers
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.section .handlers, "ax", @progbits
|
||||||
|
|
||||||
|
HANDLER at90usb_int0, ATMEGA_IRQ_INT0, excpt_common /* External interrupt request 0 */
|
||||||
|
HANDLER at90usb_int1, ATMEGA_IRQ_INT1, excpt_common /* External interrupt request 1 */
|
||||||
|
HANDLER at90usb_int2, ATMEGA_IRQ_INT2, excpt_common /* External interrupt request 2 */
|
||||||
|
HANDLER at90usb_int3, ATMEGA_IRQ_INT3, excpt_common /* External interrupt request 3 */
|
||||||
|
HANDLER at90usb_int4, ATMEGA_IRQ_INT4, excpt_common /* External interrupt request 4 */
|
||||||
|
HANDLER at90usb_int5, ATMEGA_IRQ_INT5, excpt_common /* External interrupt request 5 */
|
||||||
|
HANDLER at90usb_int6, ATMEGA_IRQ_INT6, excpt_common /* External interrupt request 6 */
|
||||||
|
HANDLER at90usb_int7, ATMEGA_IRQ_INT7, excpt_common /* External interrupt request 7 */
|
||||||
|
HANDLER at90usb_pcint0, AT90USB_IRQ_PCINT0, excpt_common /* Pin Change Interrupt Request 0 */
|
||||||
|
HANDLER at90usb_usbgen, AT90USB_IRQ_USBGEN, excpt_common /* USB General USB General Interrupt request */
|
||||||
|
HANDLER at90usb_usbep, AT90USB_IRQ_USBEP, excpt_common /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
|
||||||
|
HANDLER at90usb_wdt, AT90USB_IRQ_WDT, excpt_common /* Watchdog Time-out Interrupt */
|
||||||
|
HANDLER at90usb_t2compa, AT90USB_IRQ_T2COMPA, excpt_common /* TIMER2 COMPA Timer/Counter2 Compare Match A */
|
||||||
|
HANDLER at90usb_t2compb, AT90USB_IRQ_T2COMPB, excpt_common /* TIMER2 COMPA Timer/Counter2 Compare Match B */
|
||||||
|
HANDLER at90usb_t2ovf, ATMEGA_IRQ_T2OVF, excpt_common /* TIMER2 OVF timer/counter2 overflow */
|
||||||
|
HANDLER at90usb_t1capt, ATMEGA_IRQ_T1CAPT, excpt_common /* TIMER1 CAPT timer/counter1 capture event */
|
||||||
|
HANDLER at90usb_t1compa, ATMEGA_IRQ_T1COMPA, excpt_common /* TIMER1 COMPA timer/counter1 compare match A */
|
||||||
|
HANDLER at90usb_t1compb, ATMEGA_IRQ_T1COMPB, excpt_common /* TIMER1 COMPB timer/counter1 compare match B */
|
||||||
|
HANDLER at90usb_t1compc, ATMEGA_IRQ_T1COMPC, excpt_common /* TIMER1 COMPC timer/counter1 compare match C */
|
||||||
|
HANDLER at90usb_t1ovf, ATMEGA_IRQ_T1OVF, excpt_common /* TIMER1 OVF timer/counter1 overflow */
|
||||||
|
HANDLER at90usb_t0compa, AT90USB_IRQ_T0COMPA, excpt_common /* TIMER0 COMPA Timer/Counter0 Compare Match A */
|
||||||
|
HANDLER at90usb_t0compb, AT90USB_IRQ_T0COMPB, excpt_common /* TIMER0 COMPB Timer/Counter0 Compare Match B */
|
||||||
|
HANDLER at90usb_t0ovf, ATMEGA_IRQ_T0OVF, excpt_common /* TIMER0 OVF timer/counter0 overflow */
|
||||||
|
HANDLER at90usb_spi, ATMEGA_IRQ_SPI, excpt_common /* STC SPI serial transfer complete */
|
||||||
|
HANDLER at90usb_u1rx, ATMEGA_IRQ_U1RX, excpt_common /* USART1 RX complete */
|
||||||
|
HANDLER at90usb_u1dre, ATMEGA_IRQ_U1DRE, excpt_common /* USART1 data register empty */
|
||||||
|
HANDLER at90usb_u1tx, ATMEGA_IRQ_U1TX, excpt_common /* USART1 TX complete */
|
||||||
|
HANDLER at90usb_anacomp, ATMEGA_IRQ_ANACOMP, excpt_common /* ANALOG COMP analog comparator */
|
||||||
|
HANDLER at90usb_adc, ATMEGA_IRQ_ADC, excpt_common /* ADC conversion complete */
|
||||||
|
HANDLER at90usb_ee, ATMEGA_IRQ_EE, excpt_common /* EEPROM ready */
|
||||||
|
HANDLER at90usb_t3capt, ATMEGA_IRQ_T3CAPT, excpt_common /* TIMER3 CAPT timer/counter3 capture event */
|
||||||
|
HANDLER at90usb_t3compa, ATMEGA_IRQ_T3COMPA, excpt_common /* TIMER3 COMPA timer/counter3 compare match a */
|
||||||
|
HANDLER at90usb_t3compb, ATMEGA_IRQ_T3COMPB, excpt_common /* TIMER3 COMPB timer/counter3 compare match b */
|
||||||
|
HANDLER at90usb_t3compc, ATMEGA_IRQ_T3COMPC, excpt_common /* TIMER3 COMPC timer/counter3 compare match c */
|
||||||
|
HANDLER at90usb_t3ovf, ATMEGA_IRQ_T3OVF, excpt_common /* TIMER3 OVF timer/counter3 overflow */
|
||||||
|
HANDLER at90usb_twi, ATMEGA_IRQ_TWI, excpt_common /* TWI two-wire serial interface */
|
||||||
|
HANDLER at90usb_spmrdy, ATMEGA_IRQ_SPMRDY, excpt_common /* Store program memory ready */
|
||||||
|
|
||||||
|
/* Common exception handling logic. */
|
||||||
|
|
||||||
|
excpt_common:
|
||||||
|
#warning "Missing Logic"
|
||||||
|
|
||||||
|
/****************************************************************************************************
|
||||||
|
* Name: up_interruptstack
|
||||||
|
****************************************************************************************************/
|
||||||
|
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 0
|
||||||
|
.bss
|
||||||
|
.align 4
|
||||||
|
.globl up_interruptstack
|
||||||
|
.type up_interruptstack, object
|
||||||
|
up_interruptstack:
|
||||||
|
.skip CONFIG_ARCH_INTERRUPTSTACK
|
||||||
|
.Lintstackbase:
|
||||||
|
.size up_interruptstack, .-up_interruptstack
|
||||||
|
#endif
|
||||||
|
.end
|
||||||
|
|
@ -38,7 +38,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
#define __AVR_ATmega128__
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/sfr_defs.h>
|
#include <avr/sfr_defs.h>
|
||||||
|
|
||||||
@ -83,7 +83,7 @@
|
|||||||
.global at90usb_int5 /* External interrupt request 5 */
|
.global at90usb_int5 /* External interrupt request 5 */
|
||||||
.global at90usb_int6 /* External interrupt request 6 */
|
.global at90usb_int6 /* External interrupt request 6 */
|
||||||
.global at90usb_int7 /* External interrupt request 7 */
|
.global at90usb_int7 /* External interrupt request 7 */
|
||||||
.global at90usb_pcint0 /* PCINT0 Pin Change Interrupt Request 0 */
|
.global at90usb_pcint0 /* Pin Change Interrupt Request 0 */
|
||||||
.global at90usb_usbgen /* USB General USB General Interrupt request */
|
.global at90usb_usbgen /* USB General USB General Interrupt request */
|
||||||
.global at90usb_usbep /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
|
.global at90usb_usbep /* USB Endpoint/Pipe USB ENdpoint/Pipe Interrupt request */
|
||||||
.global at90usb_wdt /* Watchdog Time-out Interrupt */
|
.global at90usb_wdt /* Watchdog Time-out Interrupt */
|
||||||
|
@ -39,15 +39,15 @@ HEAD_ASRC = atmega_head.S
|
|||||||
|
|
||||||
# Common AVR files
|
# Common AVR files
|
||||||
|
|
||||||
CMN_ASRCS =
|
CMN_ASRCS = up_switchcontext.S
|
||||||
CMN_CSRCS = up_allocateheap.c up_createstack.c up_exit.c up_idle.c \
|
CMN_CSRCS = up_allocateheap.c up_copystate.c up_createstack.c up_exit.c \
|
||||||
up_initialize.c up_interruptcontext.c up_lowputs.c up_mdelay.c \
|
up_idle.c up_initialize.c up_interruptcontext.c up_lowputs.c \
|
||||||
up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c up_puts.c \
|
up_mdelay.c up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c \
|
||||||
up_releasestack.c up_udelay.c up_usestack.c
|
up_puts.c up_releasestack.c up_udelay.c up_usestack.c
|
||||||
|
|
||||||
# Required ATMEGA files
|
# Required ATMEGA files
|
||||||
|
|
||||||
CHIP_ASRCS =
|
CHIP_ASRCS = atmega_exceptions.S
|
||||||
CHIP_CSRCS =
|
CHIP_CSRCS =
|
||||||
|
|
||||||
# Configuration-dependent ATMEGA files
|
# Configuration-dependent ATMEGA files
|
||||||
|
118
arch/avr/src/atmega/atmega_exceptions.S
Executable file
118
arch/avr/src/atmega/atmega_exceptions.S
Executable file
@ -0,0 +1,118 @@
|
|||||||
|
/********************************************************************************************
|
||||||
|
* arch/avr/src/atmega/atmega_exceptions.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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.
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include "excptmacros.h"
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* External Symbols
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.file "atmega_exceptions.S"
|
||||||
|
.global up_doirq
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Macros
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Exception Vector Handlers
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.section .handlers, "ax", @progbits
|
||||||
|
|
||||||
|
HANDLER atmega_int0, ATMEGA_IRQ_INT0, excpt_common /* External interrupt request 0 */
|
||||||
|
HANDLER atmega_int1, ATMEGA_IRQ_INT1, excpt_common /* External interrupt request 1 */
|
||||||
|
HANDLER atmega_int2, ATMEGA_IRQ_INT2, excpt_common /* External interrupt request 2 */
|
||||||
|
HANDLER atmega_int3, ATMEGA_IRQ_INT3, excpt_common /* External interrupt request 3 */
|
||||||
|
HANDLER atmega_int4, ATMEGA_IRQ_INT4, excpt_common /* External interrupt request 4 */
|
||||||
|
HANDLER atmega_int5, ATMEGA_IRQ_INT5, excpt_common /* External interrupt request 5 */
|
||||||
|
HANDLER atmega_int6, ATMEGA_IRQ_INT6, excpt_common /* External interrupt request 6 */
|
||||||
|
HANDLER atmega_int7, ATMEGA_IRQ_INT7, excpt_common /* External interrupt request 7 */
|
||||||
|
HANDLER atmega_t2comp, ATMEGA_IRQ_T2COMP, excpt_common /* TIMER2 COMP timer/counter2 compare match */
|
||||||
|
HANDLER atmega_t2ovf, ATMEGA_IRQ_T2OVF, excpt_common /* TIMER2 OVF timer/counter2 overflow */
|
||||||
|
HANDLER atmega_t1capt, ATMEGA_IRQ_T1CAPT, excpt_common /* TIMER1 CAPT timer/counter1 capture event */
|
||||||
|
HANDLER atmega_t1compa, ATMEGA_IRQ_T1COMPA, excpt_common /* TIMER1 COMPA timer/counter1 compare match a */
|
||||||
|
HANDLER atmega_t1compb, ATMEGA_IRQ_T1COMPB, excpt_common /* TIMER1 COMPB timer/counter1 compare match b */
|
||||||
|
HANDLER atmega_t1ovf, ATMEGA_IRQ_T1OVF, excpt_common /* TIMER1 OVF timer/counter1 overflow */
|
||||||
|
HANDLER atmega_t0comp, ATMEGA_IRQ_T0COMP, excpt_common /* TIMER0 COMP timer/counter0 compare match */
|
||||||
|
HANDLER atmega_t0ovf, ATMEGA_IRQ_T0OVF, excpt_common /* TIMER0 OVF timer/counter0 overflow */
|
||||||
|
HANDLER atmega_spi, ATMEGA_IRQ_SPI, excpt_common /* STC SPI serial transfer complete */
|
||||||
|
HANDLER atmega_u0rx, ATMEGA_IRQ_U0RX, excpt_common /* USART0 RX complete */
|
||||||
|
HANDLER atmega_u0dre, ATMEGA_IRQ_U0DRE, excpt_common /* USART0 data register empty */
|
||||||
|
HANDLER atmega_u0tx, ATMEGA_IRQ_U0TX, excpt_common /* USART0 TX complete */
|
||||||
|
HANDLER atmega_adc, ATMEGA_IRQ_ADC, excpt_common /* ADC conversion complete */
|
||||||
|
HANDLER atmega_ee, ATMEGA_IRQ_EE, excpt_common /* EEPROM ready */
|
||||||
|
HANDLER atmega_anacomp, ATMEGA_IRQ_ANACOMP, excpt_common /* ANALOG COMP analog comparator */
|
||||||
|
HANDLER atmega_t1compc, ATMEGA_IRQ_T1COMPC, excpt_common /* TIMER1 COMPC timer/countre1 compare match c */
|
||||||
|
HANDLER atmega_t3capt, ATMEGA_IRQ_T3CAPT, excpt_common /* TIMER3 CAPT timer/counter3 capture event */
|
||||||
|
HANDLER atmega_t3compa, ATMEGA_IRQ_T3COMPA, excpt_common /* TIMER3 COMPA timer/counter3 compare match a */
|
||||||
|
HANDLER atmega_t3compb, ATMEGA_IRQ_T3COMPB, excpt_common /* TIMER3 COMPB timer/counter3 compare match b */
|
||||||
|
HANDLER atmega_t3compc, ATMEGA_IRQ_T3COMPC, excpt_common /* TIMER3 COMPC timer/counter3 compare match c */
|
||||||
|
HANDLER atmega_t3ovf, ATMEGA_IRQ_T3OVF, excpt_common /* TIMER3 OVF timer/counter3 overflow */
|
||||||
|
HANDLER atmega_u1rx, ATMEGA_IRQ_U1RX, excpt_common /* USART1 RX complete */
|
||||||
|
HANDLER atmega_u1dre, ATMEGA_IRQ_U1DRE, excpt_common /* USART1 data register empty */
|
||||||
|
HANDLER atmega_u1tx, ATMEGA_IRQ_U1TX, excpt_common /* USART1 TX complete */
|
||||||
|
HANDLER atmega_twi, ATMEGA_IRQ_TWI, excpt_common /* TWI two-wire serial interface */
|
||||||
|
HANDLER atmega_spmrdy, ATMEGA_IRQ_SPMRDY, excpt_common /* Store program memory ready */
|
||||||
|
|
||||||
|
/* Common exception handling logic. */
|
||||||
|
|
||||||
|
excpt_common:
|
||||||
|
#warning "Missing Logic"
|
||||||
|
|
||||||
|
/****************************************************************************************************
|
||||||
|
* Name: up_interruptstack
|
||||||
|
****************************************************************************************************/
|
||||||
|
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 0
|
||||||
|
.bss
|
||||||
|
.align 4
|
||||||
|
.globl up_interruptstack
|
||||||
|
.type up_interruptstack, object
|
||||||
|
up_interruptstack:
|
||||||
|
.skip CONFIG_ARCH_INTERRUPTSTACK
|
||||||
|
.Lintstackbase:
|
||||||
|
.size up_interruptstack, .-up_interruptstack
|
||||||
|
#endif
|
||||||
|
.end
|
||||||
|
|
@ -38,7 +38,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
#define __AVR_ATmega128__
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/sfr_defs.h>
|
#include <avr/sfr_defs.h>
|
||||||
|
|
||||||
|
524
arch/avr/src/avr/excptmacros.h
Executable file
524
arch/avr/src/avr/excptmacros.h
Executable file
@ -0,0 +1,524 @@
|
|||||||
|
/********************************************************************************************
|
||||||
|
* arch/avr/src/avr/excptmacros.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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.
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ARCH_AVR_SRC_AVR_EXCPTMACROS_H
|
||||||
|
#define __ARCH_AVR_SRC_AVR_EXCPTMACROS_H
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#ifdef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/sfr_defs.h>
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __SREG__
|
||||||
|
# define __SREG__ 0x3f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __SP_H__
|
||||||
|
# define __SP_H__ 0x3e
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __SP_L__
|
||||||
|
# define __SP_L__ 0x3d
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __tmp_reg__
|
||||||
|
# define __tmp_reg__ r0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __zero_reg__
|
||||||
|
# define __zero_reg__ r1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Global Symbols
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
|
.global g_intstackbase
|
||||||
|
.global g_nestlevel
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Assembly Language Macros
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* General Exception Handling Example:
|
||||||
|
*
|
||||||
|
* HANDLER IRQ_X, my_exception
|
||||||
|
* ...
|
||||||
|
* my_exception:
|
||||||
|
* EXCPT_PROLOGUE - Save registers on stack, enable nested interrupts
|
||||||
|
* in r22, __SP_L__ - Pass register save structure as the parameter 2
|
||||||
|
* in r23, __SP_H__ - (Careful, push post-decrements)
|
||||||
|
* USE_INTSTACK rx, ry, rz - Switch to the interrupt stack
|
||||||
|
* call handler - Handle the exception IN=old regs OUT=new regs
|
||||||
|
* RESTORE_STACK rx, ry - Undo the operations of USE_STACK
|
||||||
|
*
|
||||||
|
* EXCPT_EPILOGUE - Return to the context returned by handler()
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
/****************************************************************************
|
||||||
|
* Macros
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: HANDLER
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This macro provides the exception entry logic. It simply saves one register on the
|
||||||
|
* stack (r24) and passes the IRQ number to to common logic (see EXCPT_PROLOGUE).
|
||||||
|
*
|
||||||
|
* On Entry:
|
||||||
|
* sp - Points to the top of the stack
|
||||||
|
* Only the stack is available for storage
|
||||||
|
*
|
||||||
|
* At completion:
|
||||||
|
* Stack pointer is incremented by one, the saved r24 is on the stack, r24 now contains the
|
||||||
|
* IRQ number
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro HANDLER, label, irqno, common
|
||||||
|
\label:
|
||||||
|
push r24
|
||||||
|
ldi r24, \irqno
|
||||||
|
rjmp \common
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: EXCPT_PROLOGUE
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Provides the common "prologue" logic that should appear at the beginning of the exception
|
||||||
|
* handler.
|
||||||
|
*
|
||||||
|
* On Entry:
|
||||||
|
* r0 - has already been pushed onto the stack and now holds the IRQ number
|
||||||
|
* sp - Points to the top of the stack
|
||||||
|
* Only the stack is available for storage
|
||||||
|
*
|
||||||
|
* At completion:
|
||||||
|
* Register state is saved on the stack; All registers are available for usage except sp.
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro EXCPT_PROLOGUE
|
||||||
|
/* Save R1 - The zero register (but might not be zero) */
|
||||||
|
|
||||||
|
push r1
|
||||||
|
|
||||||
|
/* Save the status register on the stack */
|
||||||
|
|
||||||
|
in r1, __SREG__ /* Save the status register */
|
||||||
|
cli /* Disable interrupts */
|
||||||
|
push r1
|
||||||
|
|
||||||
|
/* R1 must be zero for our purposes */
|
||||||
|
|
||||||
|
clr r1
|
||||||
|
|
||||||
|
/* Save r2-r17 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
push r2
|
||||||
|
push r3
|
||||||
|
push r4
|
||||||
|
push r5
|
||||||
|
push r6
|
||||||
|
push r7
|
||||||
|
push r8
|
||||||
|
push r9
|
||||||
|
push r10
|
||||||
|
push r11
|
||||||
|
push r12
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
|
push r16
|
||||||
|
push r17
|
||||||
|
|
||||||
|
/* Save r18-r27 - Call-used, "volatile" registers (r24 was saved by
|
||||||
|
* HANDLER, r26-r27 saved later, out of sequence)
|
||||||
|
*/
|
||||||
|
|
||||||
|
push r18
|
||||||
|
push r19
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
push r22
|
||||||
|
push r23
|
||||||
|
push r25
|
||||||
|
|
||||||
|
/* Save r28-r29 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
push r28
|
||||||
|
push r29
|
||||||
|
|
||||||
|
/* Save r30-r31 - Call-used, "volatile" registers */
|
||||||
|
|
||||||
|
push r30
|
||||||
|
push r31
|
||||||
|
|
||||||
|
/* Now save r26-r27 */
|
||||||
|
|
||||||
|
push r26
|
||||||
|
push r27
|
||||||
|
|
||||||
|
/* Finally, save the stack pointer. BUT we want the value of the stack pointer as
|
||||||
|
* it was on entry into this macro. We'll have to subtract to get that value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
in r24, __SP_L__
|
||||||
|
in r25, __SP_H__
|
||||||
|
adiw r24, XCPTCONTEXT_REGS
|
||||||
|
|
||||||
|
push r24
|
||||||
|
push r25
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: EXCPT_EPILOGUE
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Provides the "epilogue" logic that should appear at the end of every exception handler.
|
||||||
|
*
|
||||||
|
* On input:
|
||||||
|
* sp points to the address of the register save area (just as left by EXCPT_PROLOGUE).
|
||||||
|
* All registers are available for use.
|
||||||
|
* Interrupts are disabled.
|
||||||
|
*
|
||||||
|
* On completion:
|
||||||
|
* All registers restored
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro EXCPT_EPILOGUE, regs
|
||||||
|
|
||||||
|
/* We don't need to restore the stack pointer */
|
||||||
|
|
||||||
|
pop r27
|
||||||
|
pop r26
|
||||||
|
|
||||||
|
/* Restore r26-r27 */
|
||||||
|
|
||||||
|
pop r27
|
||||||
|
pop r26
|
||||||
|
|
||||||
|
/* Restore r30-r31 - Call-used, "volatile" registers */
|
||||||
|
|
||||||
|
pop r31
|
||||||
|
pop r30
|
||||||
|
|
||||||
|
/* Restore r28-r29 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
pop r29
|
||||||
|
pop r28
|
||||||
|
|
||||||
|
/* Restore r18-r27 - Call-used, "volatile" registers (r26-r27 already
|
||||||
|
* restored, r24 will be restored later)
|
||||||
|
*/
|
||||||
|
|
||||||
|
pop r25
|
||||||
|
pop r23
|
||||||
|
pop r22
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
pop r19
|
||||||
|
pop r18
|
||||||
|
|
||||||
|
/* Restore r2-r17 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
pop r17
|
||||||
|
pop r16
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
pop r12
|
||||||
|
pop r11
|
||||||
|
pop r10
|
||||||
|
pop r9
|
||||||
|
pop r8
|
||||||
|
pop r7
|
||||||
|
pop r6
|
||||||
|
pop r5
|
||||||
|
pop r4
|
||||||
|
pop r3
|
||||||
|
pop r2
|
||||||
|
|
||||||
|
/* Restore r1 - the "zero" register (that may not be zero) */
|
||||||
|
|
||||||
|
pop r1
|
||||||
|
|
||||||
|
/* Restore the status register (probably enabling interrupts) */
|
||||||
|
|
||||||
|
pop r0 /* Restore the status register */
|
||||||
|
out __SREG__, r0
|
||||||
|
|
||||||
|
/* Finally, restore r0 and r24 - the scratch and IRQ number registers */
|
||||||
|
|
||||||
|
pop r0
|
||||||
|
pop r24
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: USER_SAVE
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Similar to EXPCT_PROLOGUE except that (1) this saves values into a register save
|
||||||
|
* data structure instead of on the stack, (2) the pointer is in r26;r27, and (3)
|
||||||
|
* Call-used registers are not saved.
|
||||||
|
*
|
||||||
|
* On Entry:
|
||||||
|
* X [r26:r27] - Points to the register save structure.
|
||||||
|
* Interrupts are disabled.
|
||||||
|
*
|
||||||
|
* At completion:
|
||||||
|
* Register state is saved on the stack; All registers are available for usage except sp.
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro USER_SAVE
|
||||||
|
|
||||||
|
/* Save the current stack pointer. */
|
||||||
|
|
||||||
|
in r24, __SP_L__
|
||||||
|
st x+, r24
|
||||||
|
in r25, __SP_H__
|
||||||
|
st x+, r24
|
||||||
|
|
||||||
|
/* Skip over r26-r27 and r30-r31 - Call-used, "volatile" registers */
|
||||||
|
|
||||||
|
adiw r26, 4 /* Four registers: r26-r27 and r30-r31*/
|
||||||
|
|
||||||
|
/* Save r28-r29 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
st x+, r29
|
||||||
|
st x+, r28
|
||||||
|
|
||||||
|
/* Skip over r18-r27 - Call-used, "volatile" registers (r26-r27 have been skipped) */
|
||||||
|
|
||||||
|
adiw r26, 8 /* Eight registers: r18-r25 */
|
||||||
|
|
||||||
|
/* Save r2-r17 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
st x+, r17
|
||||||
|
st x+, r16
|
||||||
|
st x+, r15
|
||||||
|
st x+, r14
|
||||||
|
st x+, r13
|
||||||
|
st x+, r12
|
||||||
|
st x+, r11
|
||||||
|
st x+, r10
|
||||||
|
st x+, r9
|
||||||
|
st x+, r8
|
||||||
|
st x+, r7
|
||||||
|
st x+, r6
|
||||||
|
st x+, r5
|
||||||
|
st x+, r4
|
||||||
|
st x+, r3
|
||||||
|
st x+, r2
|
||||||
|
|
||||||
|
/* Set r1 to zero - Function calls must return with r1=0 */
|
||||||
|
|
||||||
|
clr r1
|
||||||
|
st x+, r1
|
||||||
|
|
||||||
|
/* Save the status register (probably not necessary since interrupts are disabled) */
|
||||||
|
|
||||||
|
in r0, __SREG__
|
||||||
|
st x+, r0
|
||||||
|
|
||||||
|
/* Skip R0 and r24 - These are scratch register and Call-used, "volatile" registers */
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: TCB_RESTORE
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Functionally equivalent to EXCPT_EPILOGUE excetp that register save area is not on the
|
||||||
|
* stack but is held in a data structure.
|
||||||
|
*
|
||||||
|
* On input:
|
||||||
|
* X [r26:r27] points to the data structure.
|
||||||
|
* All registers are available for use.
|
||||||
|
* Interrupts are disabled.
|
||||||
|
*
|
||||||
|
* On completion:
|
||||||
|
* All registers restored
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro TCB_RESTORE, regs
|
||||||
|
|
||||||
|
/* Fetch the new stack pointer and the saved values of X [r26:r27]. Save X on the new
|
||||||
|
* stack where we can recover it later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ld r24, x+ /* Fetch stack pointer (post-incrementing) */
|
||||||
|
out __SP_L__, r24
|
||||||
|
ld r25, x+
|
||||||
|
out __SP_H__, r25
|
||||||
|
ld r25, x+ /* Fetch r26-r27 and save to the new stack */
|
||||||
|
ld r24, x+
|
||||||
|
push r24
|
||||||
|
push r25
|
||||||
|
|
||||||
|
/* Restore r30-r31 - Call-used, "volatile" registers */
|
||||||
|
|
||||||
|
ld r31, x+
|
||||||
|
ld r30, x+
|
||||||
|
|
||||||
|
/* Restore r28-r29 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
ld r29, x+
|
||||||
|
ld r28, x+
|
||||||
|
|
||||||
|
/* Restore r18-r27 - Call-used, "volatile" registers (r26-r27 have been
|
||||||
|
* moved and r24 will be restore later)
|
||||||
|
*/
|
||||||
|
|
||||||
|
ld r25, x+
|
||||||
|
ld r23, x+
|
||||||
|
ld r22, x+
|
||||||
|
ld r21, x+
|
||||||
|
ld r20, x+
|
||||||
|
ld r19, x+
|
||||||
|
ld r18, x+
|
||||||
|
|
||||||
|
/* Restore r2-r17 - Call-saved, "static" registers */
|
||||||
|
|
||||||
|
ld r17, x+
|
||||||
|
ld r16, x+
|
||||||
|
ld r15, x+
|
||||||
|
ld r14, x+
|
||||||
|
ld r13, x+
|
||||||
|
ld r12, x+
|
||||||
|
ld r11, x+
|
||||||
|
ld r10, x+
|
||||||
|
ld r9, x+
|
||||||
|
ld r8, x+
|
||||||
|
ld r7, x+
|
||||||
|
ld r6, x+
|
||||||
|
ld r5, x+
|
||||||
|
ld r4, x+
|
||||||
|
ld r3, x+
|
||||||
|
ld r2, x+
|
||||||
|
|
||||||
|
/* Restore r1 - The "scratch" register */
|
||||||
|
|
||||||
|
ld r1, x+
|
||||||
|
|
||||||
|
/* Restore the status register (probably enabling interrupts) */
|
||||||
|
|
||||||
|
ld r0, x+
|
||||||
|
out __SREG__, r0
|
||||||
|
|
||||||
|
/* Restore r0 and r241 - The scratch and IRQ number registers */
|
||||||
|
|
||||||
|
ld r0, x+
|
||||||
|
ld r24, x+
|
||||||
|
|
||||||
|
/* Finally, recover X [r26-r27] from the the new stack */
|
||||||
|
|
||||||
|
pop r27
|
||||||
|
pop r26
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: USE_INTSTACK
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Switch to the interrupt stack (if enabled in the configuration) and if the nesting level
|
||||||
|
* is equal to 0. Increment the nesting level in any event.
|
||||||
|
*
|
||||||
|
* On Entry:
|
||||||
|
* sp - Current value of the user stack pointer
|
||||||
|
* tmp1, tmp2, and tmp3 are registers that can be used temporarily.
|
||||||
|
* All interrupts should still be disabled.
|
||||||
|
*
|
||||||
|
* At completion:
|
||||||
|
* If the nesting level is 0, then (1) the user stack pointer is saved at the base of the
|
||||||
|
* interrupt stack and sp points to the interrupt stack.
|
||||||
|
* The values of tmp1, tmp2, tmp3, and sp have been altered
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro USE_INTSTACK, tmp1, tmp2, tmp3
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 0
|
||||||
|
# warning "Not implemented"
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/********************************************************************************************
|
||||||
|
* Name: RESTORE_STACK
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Restore the user stack. Not really.. actually only decrements the nesting level. We
|
||||||
|
* always get the new stack pointer for the register save array.
|
||||||
|
*
|
||||||
|
* On Entry:
|
||||||
|
* tmp1 and tmp2 are registers that can be used temporarily.
|
||||||
|
* All interrupts must be disabled.
|
||||||
|
*
|
||||||
|
* At completion:
|
||||||
|
* Current nesting level is decremented
|
||||||
|
* The values of tmp1 and tmp2 have been altered
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
.macro RESTORE_STACK, tmp1, tmp2
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 0
|
||||||
|
# warning "Not implemented"
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __ARCH_AVR_SRC_AVR_EXCPTMACROS_H */
|
86
arch/avr/src/avr/up_copystate.c
Normal file
86
arch/avr/src/avr/up_copystate.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/avr/src/avr/up_copystate.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_copystate
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Really just a memcpy */
|
||||||
|
|
||||||
|
void up_copystate(uint8_t *dest, uint8_t *src)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* The state is copied from the stack to the TCB, but only a reference is
|
||||||
|
* passed to get the state from the TCB. So the following check avoids
|
||||||
|
* copying the TCB save area onto itself:
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (src != dest)
|
||||||
|
{
|
||||||
|
for (i = 0; i < XCPTCONTEXT_REGS; i++)
|
||||||
|
{
|
||||||
|
*dest++ = *src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
134
arch/avr/src/avr/up_switchcontext.S
Executable file
134
arch/avr/src/avr/up_switchcontext.S
Executable file
@ -0,0 +1,134 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* arch/avr/src/avr/up_switchcontext.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 NuttX 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.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include "excptmacros.h"
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Global Symbols
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
.file "up_switchcontext.S"
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Macros
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: up_switchcontext
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Save the current thread context and restore the specified context. The full
|
||||||
|
* C function prototype is:
|
||||||
|
*
|
||||||
|
* void up_switchcontext(uint8_t *saveregs, uint8_t *restoreregs);
|
||||||
|
*
|
||||||
|
* On Entry:
|
||||||
|
* r24-r25: savregs
|
||||||
|
* r22-r23: restoreregs
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* up_switchcontext forces a context switch to the task "canned" in restoreregs.
|
||||||
|
* It does not 'return' in the normal sense, rather, it will context switch back
|
||||||
|
* to the function point. When it does 'return,' it is because the blocked
|
||||||
|
* task hat was "pickeled" in the saveregs "can" is again ready to run and has
|
||||||
|
* execution priority.
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* global interrupts disabled by the caller.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl up_switchcontext
|
||||||
|
.func up_switchcontext
|
||||||
|
up_switchcontext:
|
||||||
|
/* Use X ]r26:r27] to reference the save structure. (X is Call-used) */
|
||||||
|
|
||||||
|
movw r26, r24
|
||||||
|
|
||||||
|
/* Save the context to saveregs */
|
||||||
|
|
||||||
|
USER_SAVE
|
||||||
|
|
||||||
|
/* Then fall through to do the full context restore with r24-r5 = restoreregs */
|
||||||
|
|
||||||
|
movw r24, r22
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_fullcontextrestore
|
||||||
|
*
|
||||||
|
* Descripion:
|
||||||
|
* Restore the full-running context of a thread.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* r24-r25 = A pointer to the register save area of the thread to be restored.
|
||||||
|
*
|
||||||
|
* C Prototype:
|
||||||
|
* void up_fullcontextrestore(uint8_t *regs);
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* Interrupts are disabled.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.global up_fullcontextrestore
|
||||||
|
.func up_fullcontextrestore
|
||||||
|
up_fullcontextrestore:
|
||||||
|
/* Use X ]r26:r27] to reference the restore structure. */
|
||||||
|
|
||||||
|
movw r26, r24
|
||||||
|
|
||||||
|
/* Restore the context from the TCB saved registers */
|
||||||
|
|
||||||
|
TCB_RESTORE
|
||||||
|
.endfunc
|
||||||
|
.end
|
||||||
|
|
@ -41,7 +41,6 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "os_internal.h"
|
|
||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/avr32/src/avr32/up_exceptions.S
|
* arch/avr/src/avr32/up_exceptions.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
@ -119,6 +119,7 @@ SECTIONS
|
|||||||
_stext = . ;
|
_stext = . ;
|
||||||
*(.vectors)
|
*(.vectors)
|
||||||
*(.init)
|
*(.init)
|
||||||
|
*(.handlers)
|
||||||
*(.text)
|
*(.text)
|
||||||
*(.text.*)
|
*(.text.*)
|
||||||
_etext = . ;
|
_etext = . ;
|
||||||
|
Loading…
Reference in New Issue
Block a user