]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/ARM7_LPC2138_Rowley/mainISR.c
bd81c823d7dd33ecad76ec3d148f8a22df886d1b
[freertos] / FreeRTOS / Demo / ARM7_LPC2138_Rowley / mainISR.c
1 /*\r
2  * FreeRTOS Kernel V10.2.1\r
3  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 #include "FreeRTOS.h"\r
28 #include "semphr.h"\r
29 \r
30 #define isrCLEAR_EINT_1 2\r
31 \r
32 /*\r
33  * Interrupt routine that simply wakes vButtonHandlerTask on each interrupt \r
34  * generated by a push of the built in button.  The wrapper takes care of\r
35  * the ISR entry.  This then calls the actual handler function to perform\r
36  * the work.  This work should not be done in the wrapper itself unless\r
37  * you are absolutely sure that no stack space is used.\r
38  */\r
39 void vButtonISRWrapper( void ) __attribute__ ((naked));\r
40 void vButtonHandler( void ) __attribute__ ((noinline));\r
41 \r
42 void vButtonHandler( void )\r
43 {\r
44 extern SemaphoreHandle_t xButtonSemaphore;\r
45 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;\r
46 \r
47         xSemaphoreGiveFromISR( xButtonSemaphore, &xHigherPriorityTaskWoken );\r
48 \r
49         if( xHigherPriorityTaskWoken )\r
50         {\r
51                 /* We have woken a task.  Calling "yield from ISR" here will ensure\r
52                 the interrupt returns to the woken task if it has a priority higher\r
53                 than the interrupted task. */\r
54                 portYIELD_FROM_ISR();\r
55         }\r
56 \r
57     EXTINT = isrCLEAR_EINT_1;\r
58     VICVectAddr = 0;\r
59 }\r
60 /*-----------------------------------------------------------*/\r
61 \r
62 void vButtonISRWrapper( void )\r
63 {\r
64         /* Save the context of the interrupted task. */\r
65         portSAVE_CONTEXT();\r
66 \r
67         /* Call the handler to do the work.  This must be a separate function to\r
68         the wrapper to ensure the correct stack frame is set up. */\r
69         __asm volatile( "bl vButtonHandler" );\r
70 \r
71         /* Restore the context of whichever task is going to run once the interrupt\r
72         completes. */\r
73         portRESTORE_CONTEXT();\r
74 }\r
75 \r
76 \r
77 \r