From 57ac49f1221badd88724efe03f3da1305c23127a Mon Sep 17 00:00:00 2001 From: RichardBarry Date: Wed, 4 Feb 2009 13:08:12 +0000 Subject: Continue 78K0R development. git-svn-id: https://freertos.svn.sourceforge.net/svnroot/freertos/trunk@673 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- Source/portable/IAR/78K0R/ISR_Support.h | 99 +++++++++++++++++++++++++++++++++ Source/portable/IAR/78K0R/portasm.s26 | 69 +---------------------- Source/portable/IAR/78K0R/portmacro.h | 3 +- 3 files changed, 101 insertions(+), 70 deletions(-) create mode 100644 Source/portable/IAR/78K0R/ISR_Support.h diff --git a/Source/portable/IAR/78K0R/ISR_Support.h b/Source/portable/IAR/78K0R/ISR_Support.h new file mode 100644 index 00000000..6b291cc9 --- /dev/null +++ b/Source/portable/IAR/78K0R/ISR_Support.h @@ -0,0 +1,99 @@ +; FreeRTOS.org V5.1.1 - Copyright (C) 2003-2008 Richard Barry. +; +; This file is part of the FreeRTOS.org distribution. +; +; FreeRTOS.org is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; FreeRTOS.org is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with FreeRTOS.org; if not, write to the Free Software +; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +; +; A special exception to the GPL can be applied should you wish to distribute +; a combined work that includes FreeRTOS.org, without being obliged to provide +; the source code for any proprietary components. See the licensing section +; of http://www.FreeRTOS.org for full details of how and when the exception +; can be applied. +; +; *************************************************************************** +; See http://www.FreeRTOS.org for documentation, latest information, license +; and contact details. Please ensure to read the configuration and relevant +; port sections of the online documentation. +; *************************************************************************** +; +;------------------------------------------------------------------------------ + +#include "FreeRTOSConfig.h" + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers, CS and ES +; (only in far memory mode) registers +; the usCriticalNesting Value and the Stack Pointer +; of the active Task onto the task stack +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO + + PUSH AX ; save AX Register to stack + PUSH HL +#if configMEMORY_MODE == 1 + MOV A, CS ; save CS register + XCH A, X + MOV A, ES ; save ES register + PUSH AX +#else + MOV A, CS ; save CS register + PUSH AX +#endif + PUSH DE ; save the remaining general purpose registers + PUSH BC + MOVW AX, usCriticalNesting ; save the usCriticalNesting value + PUSH AX + MOVW AX, pxCurrentTCB ; save the Stack pointer + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Restores the context of the Stack Pointer, usCriticalNesting +; value, general purpose registers and the CS and ES (only in far memory mode) +; of the selected task from the task stack +;------------------------------------------------------------------------------ + +portRESTORE_CONTEXT MACRO + MOVW AX, pxCurrentTCB ; restore the Stack pointer + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + POP AX ; restore usCriticalNesting value + MOVW usCriticalNesting, AX + POP BC ; restore the necessary general purpose registers + POP DE +#if configMEMORY_MODE == 1 + POP AX ; restore the ES register + MOV ES, A + XCH A, X ; restore the CS register + MOV CS, A +#else + POP AX + MOV CS, A ; restore CS register +#endif + POP HL ; restore general purpose register HL + POP AX ; restore AX + ENDM +;------------------------------------------------------------------------------ diff --git a/Source/portable/IAR/78K0R/portasm.s26 b/Source/portable/IAR/78K0R/portasm.s26 index 62206ed5..2bb46e1c 100644 --- a/Source/portable/IAR/78K0R/portasm.s26 +++ b/Source/portable/IAR/78K0R/portasm.s26 @@ -29,8 +29,7 @@ ; *************************************************************************** ; ;------------------------------------------------------------------------------ -; Note: Select the correct include files for the device used by the application. -#include "FreeRTOSConfig.h" +#include "ISR_Support.h" ;------------------------------------------------------------------------------ #if __CORE__ != __78K0R__ @@ -51,12 +50,6 @@ EXTERN vTaskSwitchContext EXTERN vTaskIncrementTick -; Variables used by scheduler -;------------------------------------------------------------------------------ - EXTERN pxCurrentTCB - EXTERN usCriticalNesting - - ; Tick ISR Prototype ;------------------------------------------------------------------------------ EXTERN ?CL78K0R_V2_L00 @@ -68,66 +61,6 @@ MD_INTTM05 SYMBOL "MD_INTTM05" `??MD_INTTM05??INTVEC 68` SYMBOL "??INTVEC 68", MD_INTTM05 -;------------------------------------------------------------------------------ -; portSAVE_CONTEXT MACRO -; Saves the context of the remaining general purpose registers, CS and ES -; (only in far memory mode) registers -; the usCriticalNesting Value and the Stack Pointer -; of the active Task onto the task stack -;------------------------------------------------------------------------------ -portSAVE_CONTEXT MACRO - - PUSH AX ; save AX Register to stack - PUSH HL -#if configMEMORY_MODE == 1 - MOV A, CS ; save CS register - XCH A, X - MOV A, ES ; save ES register - PUSH AX -#else - MOV A, CS ; save CS register - PUSH AX -#endif - PUSH DE ; save the remaining general purpose registers - PUSH BC - MOVW AX, usCriticalNesting ; save the usCriticalNesting value - PUSH AX - MOVW AX, pxCurrentTCB ; save the Stack pointer - MOVW HL, AX - MOVW AX, SP - MOVW [HL], AX - ENDM -;------------------------------------------------------------------------------ - -;------------------------------------------------------------------------------ -; portRESTORE_CONTEXT MACRO -; Restores the context of the Stack Pointer, usCriticalNesting -; value, general purpose registers and the CS and ES (only in far memory mode) -; of the selected task from the task stack -;------------------------------------------------------------------------------ - -portRESTORE_CONTEXT MACRO - MOVW AX, pxCurrentTCB ; restore the Stack pointer - MOVW HL, AX - MOVW AX, [HL] - MOVW SP, AX - POP AX ; restore usCriticalNesting value - MOVW usCriticalNesting, AX - POP BC ; restore the necessary general purpose registers - POP DE -#if configMEMORY_MODE == 1 - POP AX ; restore the ES register - MOV ES, A - XCH A, X ; restore the CS register - MOV CS, A -#else - POP AX - MOV CS, A ; restore CS register -#endif - POP HL ; restore general purpose register HL - POP AX ; restore AX - ENDM -;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Port Yield function to check for a Task switch in the cooperative mode diff --git a/Source/portable/IAR/78K0R/portmacro.h b/Source/portable/IAR/78K0R/portmacro.h index 08d68cf2..1255ff6d 100644 --- a/Source/portable/IAR/78K0R/portmacro.h +++ b/Source/portable/IAR/78K0R/portmacro.h @@ -124,9 +124,8 @@ extern volatile unsigned portSHORT usCriticalNesting; \ /* Task utilities. */ extern void vPortStart( void ); -extern void portSAVE_CONTEXT( void ); -extern void portRESTORE_CONTEXT( void ); #define portYIELD() __asm( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken ) vTaskSwitchContext() #define portNOP() __asm( "NOP" ) /*-----------------------------------------------------------*/ -- cgit v1.2.3