From a6d098947bed36d4747cd8ce61e433e60e319f6d Mon Sep 17 00:00:00 2001 From: RichardBarry Date: Thu, 14 Jan 2010 12:23:07 +0000 Subject: [PATCH] Work in progress. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@954 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- Source/portable/Renesas/SH2A_FPU/port.c | 99 ++++++++++++-- Source/portable/Renesas/SH2A_FPU/portasm.src | 136 +++++++++++++++++++ Source/portable/Renesas/SH2A_FPU/portmacro.h | 2 +- 3 files changed, 225 insertions(+), 12 deletions(-) create mode 100644 Source/portable/Renesas/SH2A_FPU/portasm.src diff --git a/Source/portable/Renesas/SH2A_FPU/port.c b/Source/portable/Renesas/SH2A_FPU/port.c index 0da075662..a74097fc5 100644 --- a/Source/portable/Renesas/SH2A_FPU/port.c +++ b/Source/portable/Renesas/SH2A_FPU/port.c @@ -51,15 +51,15 @@ licensing and training services. */ +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the SH2A port. - *----------------------------------------------------------*/ +#define portINITIAL_SR 0UL /* No interrupts masked. */ /*-----------------------------------------------------------*/ @@ -74,6 +74,16 @@ static void prvSetupTimerInterrupt( void ); */ void vPortYield( void ); +/* + * Function to start the first task executing - defined in portasm.src. + */ +extern void vPortStartFirstTask( void ); + +/* + * Obtains the current GBR value - defined in portasm.src. + */ +extern unsigned long ulPortGetGBR( void ); + /*-----------------------------------------------------------*/ /* @@ -81,16 +91,88 @@ void vPortYield( void ); */ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) { - +*pxTopOfStack = 0x11111111UL; +pxTopOfStack--; +*pxTopOfStack = 0x22222222UL; +pxTopOfStack--; +*pxTopOfStack = 0x33333333UL; +pxTopOfStack--; + + /* SR. */ + *pxTopOfStack = portINITIAL_SR; + pxTopOfStack--; + + /* PC then MACL, MACH. */ +// *pxTopOfStack = ( unsigned long ) pxCode; +// pxTopOfStack -= 3; +*pxTopOfStack = ( unsigned long ) pxCode; +pxTopOfStack--; +*pxTopOfStack = 0xffffUL; +pxTopOfStack--; +*pxTopOfStack = 0xeeeeUL; +pxTopOfStack--; + + /* GBR then PR, R14-R5. */ +// *pxTopOfStack = ulPortGetGBR(); +// pxTopOfStack -= 12; +*pxTopOfStack = 0x00UL; +pxTopOfStack--; +*pxTopOfStack = 0x11UL; +pxTopOfStack--; +*pxTopOfStack = 0x22UL; +pxTopOfStack--; +*pxTopOfStack = 0x33UL; +pxTopOfStack--; +*pxTopOfStack = 0x44UL; +pxTopOfStack--; +*pxTopOfStack = 0x55UL; +pxTopOfStack--; +*pxTopOfStack = 0x66UL; +pxTopOfStack--; +*pxTopOfStack = 0x77UL; +pxTopOfStack--; +*pxTopOfStack = 0x88UL; +pxTopOfStack--; +*pxTopOfStack = 0x99UL; +pxTopOfStack--; +*pxTopOfStack = 0xaaUL; +pxTopOfStack--; +*pxTopOfStack = 0xbbUL; +pxTopOfStack--; + + + /* Parameters in R4 then R3-R0. */ +// *pxTopOfStack = ( unsigned long ) pvParameters; +// pxTopOfStack -= 5; + +*pxTopOfStack = 0x1UL; +pxTopOfStack--; +*pxTopOfStack = 0x2UL; +pxTopOfStack--; +*pxTopOfStack = 0x3UL; +pxTopOfStack--; +*pxTopOfStack = 0x4UL; +pxTopOfStack--; +*pxTopOfStack = 0x5UL; +//pxTopOfStack--; + + + /* GBR = global base register. + VBR = vector base register. + TBR = jump table base register. + R15 is the stack pointer. */ + + return pxTopOfStack; } /*-----------------------------------------------------------*/ portBASE_TYPE xPortStartScheduler( void ) { /* Start the tick interrupt. */ - prvSetupTimerInterrupt(); +// prvSetupTimerInterrupt(); /* Start the first task. */ + trapa( 32 ); /* Should not get here. */ return pdFAIL; @@ -103,11 +185,6 @@ void vPortEndScheduler( void ) } /*-----------------------------------------------------------*/ -void vPortYield( void ) -{ -} -/*-----------------------------------------------------------*/ - void vPortTickInterrupt( void ) { vTaskIncrementTick(); diff --git a/Source/portable/Renesas/SH2A_FPU/portasm.src b/Source/portable/Renesas/SH2A_FPU/portasm.src new file mode 100644 index 000000000..30f80e6cb --- /dev/null +++ b/Source/portable/Renesas/SH2A_FPU/portasm.src @@ -0,0 +1,136 @@ +;/* +; FreeRTOS V6.0.1 - Copyright (C) 2009 Real Time Engineers Ltd. +; +; *************************************************************************** +; * * +; * If you are: * +; * * +; * + New to FreeRTOS, * +; * + Wanting to learn FreeRTOS or multitasking in general quickly * +; * + Looking for basic training, * +; * + Wanting to improve your FreeRTOS skills and productivity * +; * * +; * then take a look at the FreeRTOS eBook * +; * * +; * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * +; * http://www.FreeRTOS.org/Documentation * +; * * +; * A pdf reference manual is also available. Both are usually delivered * +; * to your inbox within 20 minutes to two hours when purchased between 8am * +; * and 8pm GMT (although please allow up to 24 hours in case of * +; * exceptional circumstances). Thank you for your support! * +; * * +; *************************************************************************** +; +; This file is part of the FreeRTOS distribution. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; ***NOTE*** The exception to the GPL is included to allow you to distribute +; a combined work that includes FreeRTOS without being obliged to provide the +; source code for proprietary components outside of the FreeRTOS kernel. +; FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. +; +; 1 tab == 4 spaces! +; +; http://www.FreeRTOS.org - Documentation, latest information, license and +; contact details. +; +; http://www.SafeRTOS.com - A version that is certified for use in safety +; critical systems. +; +; http://www.OpenRTOS.com - Commercial support, development, porting, +; licensing and training services. +;*/ + + .import _pxCurrentTCB + .import _vTaskSwitchContext + + .export _vPortStartFirstTask + .export _ulPortGetGBR + .export _vPortYield + + .section P + +_vPortStartFirstTask: + + ; Get the address of the pxCurrentTCB variable. + mov.l #_pxCurrentTCB, r15 + + ; Get the address of the task stack from pxCurrentTCB. + mov.l @r15, r15 + + ; Get the task stack itself into the stack pointer. + mov.l @r15, r15 + + ; Restore r0 to PR (PR is used in place of r15). + movml.l @r15+, r15 + + ; Restore system registers. + ldc.l @r15+, gbr + lds.l @r15+, mach + lds.l @r15+, macl + + ; Pop the SR and PC to jump to the start of the task. + rte + nop + +_vPortYield: + + ; Save registers in the same order used by the CPU itself. + sts.l macl, @-r15 + sts.l mach, @-r15 + stc.l gbr, @-r15 + movml.l r15, @-r15 + + ; Get the address of pxCurrentTCB + mov.l #_pxCurrentTCB, r0 + + ; Get the address of pxTopOfStack from the TCB. + mov.l @r0, r0 + + ; Save the stack pointer in pxTopOfStack. + mov.l r15, @r0 + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + ; Get the address of the pxCurrentTCB variable. + mov.l #_pxCurrentTCB, r15 + + ; Get the address of the task stack from pxCurrentTCB. + mov.l @r15, r15 + + ; Get the task stack itself into the stack pointer. + mov.l @r15, r15 + + ; Restore r0 to PR (PR is used in place of r15). + movml.l @r15+, r15 + + ; Restore system registers. + ldc.l @r15+, gbr + lds.l @r15+, mach + lds.l @r15+, macl + + ; Pop the SR and PC to jump to the start of the task. + rte + nop + + +_ulPortGetGBR: + + stc.l gbr, r0 + rts + nop + + .end + diff --git a/Source/portable/Renesas/SH2A_FPU/portmacro.h b/Source/portable/Renesas/SH2A_FPU/portmacro.h index 0eb105509..bdc5fa416 100644 --- a/Source/portable/Renesas/SH2A_FPU/portmacro.h +++ b/Source/portable/Renesas/SH2A_FPU/portmacro.h @@ -93,7 +93,7 @@ extern "C" { #define portBYTE_ALIGNMENT 4 #define portSTACK_GROWTH -1 #define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) -#define portYIELD() trapa( 0 ) +#define portYIELD() trapa( 33 ) #define portNOP() nop() /*-----------------------------------------------------------*/ -- 2.39.5