From ca08b07949319ed1dd75765bae14a5f33cab843e Mon Sep 17 00:00:00 2001 From: richardbarry Date: Sun, 17 Mar 2013 15:38:23 +0000 Subject: [PATCH] Add an example ISR implementation into the RL78 GCC demo. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1841 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../Demo/RL78_E2Studio_GCC/src/ExampleISR.S | 121 ++++++++++++++++++ .../portable/GCC/RL78/portasm.S | 3 - FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c | 42 ++++++ .../Demo/RL78_E2Studio_GCC/src/main_blinky.c | 3 +- .../Demo/RL78_E2Studio_GCC/src/main_full.c | 3 +- 5 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 FreeRTOS/Demo/RL78_E2Studio_GCC/src/ExampleISR.S diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/ExampleISR.S b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/ExampleISR.S new file mode 100644 index 000000000..d57aa281d --- /dev/null +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/ExampleISR.S @@ -0,0 +1,121 @@ +/* + FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. + + FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT + http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and 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 modification 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 itcan be + viewed here: http://www.freertos.org/a00114.html and also obtained by + writing to Real Time Engineers Ltd., contact details for whom are available + on the FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, and our new + fully thread aware and reentrant UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems, who sell the code with commercial support, + indemnification and middleware, under the OpenRTOS brand. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. +*/ + +/* + * This file defines the RegTest tasks as described at the top of main.c + */ + +/* ISR_Support.h contains the definitions of portSAVE_CONTEXT() and +portRESTORE_CONTEXT(). */ +#include "ISR_Support.h" + + .global _vANExampleISR_ASM_Wrapper + .extern _vAnExampleISR_C_Handler + + .text + + /* + * This demo does not include a functional interrupt service routine - so + * this dummy handler (which is not actually installed) is provided as an + * example of how an ISR that needs to cause a context switch needs to be + * implemented. ISRs that do not cause a context switch have no special + * requirements and can be written as per the compiler documentation. + * + * This assembly wrapper function calls the main handler, which is called + * vAnExampleISR_C_Handler(), and is implemented in main.c. See the + * documentation page for this demo on the FreeRTOS.org website for full + * instructions. + * + * NOTE: vANExampleISR_ASM_Wrapper needs to be installed into the relevant + * vector within vector_table.c. + */ + + vANExampleISR_ASM_Wrapper: + + /* portSAVE_CONTEXT() must be the first thing called in the ASM + wrapper. */ + portSAVE_CONTEXT + + /* Once the context has been saved the C handler can be called. */ + call !!_vAnExampleISR_C_Handler + + /* Finally the ISR must end with a call to portRESTORE_CONTEXT() + followed by a reti instruction to return from the interrupt to whichever + task is now the task selected to run (which may be different to the task + that was running before the interrupt started). */ + portRESTORE_CONTEXT + reti + + .end + diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/portasm.S b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/portasm.S index 35d6e1c34..4e3ab0cc1 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/portasm.S +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/portasm.S @@ -75,9 +75,6 @@ #include "FreeRTOSConfig.h" #include "ISR_Support.h" -#define CS 0xFFFFC -#define ES 0xFFFFD - .global _vPortYield .global _vPortStartFirstTask .global _vPortTickISR diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c index aedbc70cd..2529a68fe 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c @@ -83,6 +83,12 @@ * This file implements the code that is not demo specific, including the * hardware setup and FreeRTOS hook functions. * + * This project does not provide an example of how to write an RTOS compatible + * interrupt service routine (other than the tick interrupt itself), so this + * file contains the function vAnExampleISR_C_Handler() as a dummy example (that + * is not actually installed) that can be used as a reference. Also see the + * file ExampleISR.S, and the documentation page for this demo on the + * FreeRTOS.org website for full instructions. * * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO @@ -93,6 +99,7 @@ /* Scheduler include files. */ #include "FreeRTOS.h" #include "task.h" +#include "semphr.h" /* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo, or 0 to run the more comprehensive test and demo application. */ @@ -114,6 +121,9 @@ void vApplicationIdleHook( void ); void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName ); void vApplicationTickHook( void ); +/* This variable is not actually used, but provided to allow an example of how +to write an ISR to be included in this file. */ +static xSemaphoreHandle xSemaphore = NULL; /*-----------------------------------------------------------*/ int main( void ) @@ -136,6 +146,38 @@ int main( void ) } /*-----------------------------------------------------------*/ +void vAnExampleISR_C_Handler( void ) +{ + /* + * This demo does not include a functional interrupt service routine - so + * this dummy handler (which is not actually installed) is provided as an + * example of how an ISR that needs to cause a context switch needs to be + * implemented. ISRs that do not cause a context switch have no special + * requirements and can be written as per the compiler documentation. + * + * This C function is called from a wrapper function that is implemented + * in assembly code. See vANExampleISR_ASM_Wrapper() in ExampleISR.S. Also + * see the documentation page for this demo on the FreeRTOS.org website for + * full instructions. + */ +short sHigherPriorityTaskWoken = pdFALSE; + + /* Handler code goes here...*/ + + /* For purposes of demonstration, assume at some point the hander calls + xSemaphoreGiveFromISR().*/ + xSemaphoreGiveFromISR( xSemaphore, &sHigherPriorityTaskWoken ); + + /* If giving the semaphore unblocked a task, and the unblocked task has a + priority higher than or equal to the currently running task, then + sHigherPriorityTaskWoken will have been set to pdTRUE internally within the + xSemaphoreGiveFromISR() function. Passing a pdTRUE value to + portYIELD_FROM_ISR() will cause this interrupt to return directly to the + higher priority unblocked task. */ + portYIELD_FROM_ISR( sHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + void vApplicationMallocFailedHook( void ) { /* Called if a call to pvPortMalloc() fails because there is insufficient diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c index 14e000103..35890528f 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c @@ -81,7 +81,8 @@ * * NOTE 2: This file only contains the source code that is specific to the * basic demo. Generic functions, such FreeRTOS hook functions, and functions - * required to configure the hardware, are defined in main.c. + * required to configure the hardware, along with an example interrupt service + * routine, are defined in main.c. ****************************************************************************** * * main_blinky() creates one queue, and two tasks. It then starts the diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c index 5892e78d8..88fdc2673 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c @@ -81,7 +81,8 @@ * * NOTE 2: This file only contains the source code that is specific to the * full demo. Generic functions, such FreeRTOS hook functions, and functions - * required to configure the hardware, are defined in main.c. + * required to configure the hardware, along with an example of how to write an + * interrupt service routine, are defined in main.c. ****************************************************************************** * * main_full() creates all the demo application tasks and two software timers, -- 2.39.5