]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/PIC18_WizC/serial/isrSerialRx.c
48083720ca184c469989ddf31f8316dfb75dbbdc
[freertos] / FreeRTOS / Demo / PIC18_WizC / serial / isrSerialRx.c
1 /*\r
2  * FreeRTOS Kernel V10.3.0\r
3  * Copyright (C) 2020 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 \r
28 /*\r
29 Changes from V3.0.0\r
30         + ISRcode pulled inline to reduce stack-usage.\r
31 \r
32         + Added functionality to only call vTaskSwitchContext() once\r
33           when handling multiple interruptsources in a single interruptcall.\r
34 \r
35         + Filename changed to a .c extension to allow stepping through code\r
36           using F7.\r
37 \r
38 Changes from V3.0.1\r
39 */\r
40 \r
41 #ifndef _FREERTOS_SERIAL_ISRSERIALRX_C\r
42 #define _FREERTOS_SERIAL_ISRSERIALRX_C\r
43 \r
44 #define serCONTINUOUS_RX                ( 1 )\r
45 #define serCLEAR_OVERRUN                ( 0 )\r
46 \r
47 {\r
48         /*\r
49          * Was the interrupt a byte being received?\r
50          */\r
51         if( bRCIF && bRCIE)\r
52         {\r
53                 /*\r
54                  * Queue to interface between comms API and interrupt routine.\r
55                 */\r
56                 extern QueueHandle_t xRxedChars;\r
57                 \r
58                 /*\r
59                  * Because we are not allowed to use local variables here,\r
60                  * PRODL is (ab)used as temporary storage.  This is allowed\r
61                  * because this SFR will be restored before exiting the ISR.\r
62                  */\r
63                 extern char                     cChar;\r
64                 extern portBASE_TYPE xHigherPriorityTaskWoken;\r
65                 #pragma locate cChar    &PRODL\r
66 \r
67                 /*\r
68                  * If there was a framing error, just get and ignore\r
69                  * the character\r
70                  */\r
71                 if( bFERR )\r
72                 {\r
73                         cChar = RCREG;\r
74                 }\r
75                 else\r
76                 {\r
77                         /*\r
78                          * Get the character and post it on the queue of Rxed\r
79                          * characters. If the post causes a task to wake ask\r
80                          * for a context switch as the woken task may have a\r
81                          * higher priority than the task we have interrupted.\r
82                          */\r
83                         cChar = RCREG;\r
84 \r
85                         /*\r
86                          * Clear any overrun errors.\r
87                          */\r
88                         if( bOERR )\r
89                         {\r
90                                 bCREN = serCLEAR_OVERRUN;\r
91                                 bCREN = serCONTINUOUS_RX;       \r
92                         }\r
93 \r
94                         xHigherPriorityTaskWoken = pdFALSE;\r
95                         xQueueSendFromISR( xRxedChars, ( const void * ) &cChar, &xHigherPriorityTaskWoken );\r
96 \r
97                         if( xHigherPriorityTaskWoken )\r
98                         {\r
99                                 uxSwitchRequested = pdTRUE;\r
100                         }\r
101                 }\r
102         }\r
103 }\r
104 \r
105 #endif  /* _FREERTOS_SERIAL_ISRSERIALRX_C */\r