]> begriffs open source - freertos/blob - portable/IAR/RX600/port.c
Style: uncrustify
[freertos] / portable / IAR / RX600 / port.c
1 /*\r
2  * FreeRTOS Kernel V10.3.1\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  */\r
26 \r
27 /*-----------------------------------------------------------\r
28 * Implementation of functions defined in portable.h for the SH2A port.\r
29 *----------------------------------------------------------*/\r
30 \r
31 /* Scheduler includes. */\r
32 #include "FreeRTOS.h"\r
33 #include "task.h"\r
34 \r
35 /* Library includes. */\r
36 #include "string.h"\r
37 \r
38 /* Hardware specifics. */\r
39 #include <iorx62n.h>\r
40 \r
41 /*-----------------------------------------------------------*/\r
42 \r
43 /* Tasks should start with interrupts enabled and in Supervisor mode, therefore\r
44  * PSW is set with U and I set, and PM and IPL clear. */\r
45 #define portINITIAL_PSW     ( ( StackType_t ) 0x00030000 )\r
46 #define portINITIAL_FPSW    ( ( StackType_t ) 0x00000100 )\r
47 \r
48 /*-----------------------------------------------------------*/\r
49 \r
50 /*\r
51  * Function to start the first task executing - written in asm code as direct\r
52  * access to registers is required.\r
53  */\r
54 extern void prvStartFirstTask( void );\r
55 \r
56 /*\r
57  * The tick ISR handler.  The peripheral used is configured by the application\r
58  * via a hook/callback function.\r
59  */\r
60 __interrupt void vTickISR( void );\r
61 \r
62 /*-----------------------------------------------------------*/\r
63 \r
64 extern void * pxCurrentTCB;\r
65 \r
66 /*-----------------------------------------------------------*/\r
67 \r
68 /*\r
69  * See header file for description.\r
70  */\r
71 StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r
72                                      TaskFunction_t pxCode,\r
73                                      void * pvParameters )\r
74 {\r
75     /* R0 is not included as it is the stack pointer. */\r
76 \r
77     *pxTopOfStack = 0x00;\r
78     pxTopOfStack--;\r
79     *pxTopOfStack = portINITIAL_PSW;\r
80     pxTopOfStack--;\r
81     *pxTopOfStack = ( StackType_t ) pxCode;\r
82 \r
83     /* When debugging it can be useful if every register is set to a known\r
84      * value.  Otherwise code space can be saved by just setting the registers\r
85      * that need to be set. */\r
86     #ifdef USE_FULL_REGISTER_INITIALISATION\r
87         {\r
88             pxTopOfStack--;\r
89             *pxTopOfStack = 0xffffffff; /* r15. */\r
90             pxTopOfStack--;\r
91             *pxTopOfStack = 0xeeeeeeee;\r
92             pxTopOfStack--;\r
93             *pxTopOfStack = 0xdddddddd;\r
94             pxTopOfStack--;\r
95             *pxTopOfStack = 0xcccccccc;\r
96             pxTopOfStack--;\r
97             *pxTopOfStack = 0xbbbbbbbb;\r
98             pxTopOfStack--;\r
99             *pxTopOfStack = 0xaaaaaaaa;\r
100             pxTopOfStack--;\r
101             *pxTopOfStack = 0x99999999;\r
102             pxTopOfStack--;\r
103             *pxTopOfStack = 0x88888888;\r
104             pxTopOfStack--;\r
105             *pxTopOfStack = 0x77777777;\r
106             pxTopOfStack--;\r
107             *pxTopOfStack = 0x66666666;\r
108             pxTopOfStack--;\r
109             *pxTopOfStack = 0x55555555;\r
110             pxTopOfStack--;\r
111             *pxTopOfStack = 0x44444444;\r
112             pxTopOfStack--;\r
113             *pxTopOfStack = 0x33333333;\r
114             pxTopOfStack--;\r
115             *pxTopOfStack = 0x22222222;\r
116             pxTopOfStack--;\r
117         }\r
118     #else /* ifdef USE_FULL_REGISTER_INITIALISATION */\r
119         {\r
120             pxTopOfStack -= 15;\r
121         }\r
122     #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */\r
123 \r
124     *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */\r
125     pxTopOfStack--;\r
126     *pxTopOfStack = portINITIAL_FPSW;\r
127     pxTopOfStack--;\r
128     *pxTopOfStack = 0x12345678; /* Accumulator. */\r
129     pxTopOfStack--;\r
130     *pxTopOfStack = 0x87654321; /* Accumulator. */\r
131 \r
132     return pxTopOfStack;\r
133 }\r
134 /*-----------------------------------------------------------*/\r
135 \r
136 BaseType_t xPortStartScheduler( void )\r
137 {\r
138     extern void vApplicationSetupTimerInterrupt( void );\r
139 \r
140     /* Use pxCurrentTCB just so it does not get optimised away. */\r
141     if( pxCurrentTCB != NULL )\r
142     {\r
143         /* Call an application function to set up the timer that will generate the\r
144          * tick interrupt.  This way the application can decide which peripheral to\r
145          * use.  A demo application is provided to show a suitable example. */\r
146         vApplicationSetupTimerInterrupt();\r
147 \r
148         /* Enable the software interrupt. */\r
149         _IEN( _ICU_SWINT ) = 1;\r
150 \r
151         /* Ensure the software interrupt is clear. */\r
152         _IR( _ICU_SWINT )  = 0;\r
153 \r
154         /* Ensure the software interrupt is set to the kernel priority. */\r
155         _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY;\r
156 \r
157         /* Start the first task. */\r
158         prvStartFirstTask();\r
159     }\r
160 \r
161     /* Should not get here. */\r
162     return pdFAIL;\r
163 }\r
164 /*-----------------------------------------------------------*/\r
165 \r
166 #pragma vector = configTICK_VECTOR\r
167 __interrupt void vTickISR( void )\r
168 {\r
169     /* Re-enable interrupts. */\r
170     __enable_interrupt();\r
171 \r
172     /* Increment the tick, and perform any processing the new tick value\r
173      * necessitates. */\r
174     __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY );\r
175     {\r
176         if( xTaskIncrementTick() != pdFALSE )\r
177         {\r
178             taskYIELD();\r
179         }\r
180     }\r
181     __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY );\r
182 }\r
183 /*-----------------------------------------------------------*/\r
184 \r
185 void vPortEndScheduler( void )\r
186 {\r
187     /* Not implemented in ports where there is nothing to return to.\r
188      * Artificially force an assert. */\r
189     configASSERT( pxCurrentTCB == NULL );\r
190 }\r
191 /*-----------------------------------------------------------*/\r