]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/RX600/port.c
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Source / portable / IAR / RX600 / port.c
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 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. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 /*-----------------------------------------------------------\r
30  * Implementation of functions defined in portable.h for the SH2A port.\r
31  *----------------------------------------------------------*/\r
32 \r
33 /* Scheduler includes. */\r
34 #include "FreeRTOS.h"\r
35 #include "task.h"\r
36 \r
37 /* Library includes. */\r
38 #include "string.h"\r
39 \r
40 /* Hardware specifics. */\r
41 #include <iorx62n.h>\r
42 \r
43 /*-----------------------------------------------------------*/\r
44 \r
45 /* Tasks should start with interrupts enabled and in Supervisor mode, therefore\r
46 PSW is set with U and I set, and PM and IPL clear. */\r
47 #define portINITIAL_PSW  ( ( StackType_t ) 0x00030000 )\r
48 #define portINITIAL_FPSW        ( ( StackType_t ) 0x00000100 )\r
49 \r
50 /*-----------------------------------------------------------*/\r
51 \r
52 /*\r
53  * Function to start the first task executing - written in asm code as direct\r
54  * access to registers is required.\r
55  */\r
56 extern void prvStartFirstTask( void );\r
57 \r
58 /*\r
59  * The tick ISR handler.  The peripheral used is configured by the application\r
60  * via a hook/callback function.\r
61  */\r
62 __interrupt void vTickISR( void );\r
63 \r
64 /*-----------------------------------------------------------*/\r
65 \r
66 extern void *pxCurrentTCB;\r
67 \r
68 /*-----------------------------------------------------------*/\r
69 \r
70 /*\r
71  * See header file for description.\r
72  */\r
73 StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, 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\r
119         {\r
120                 pxTopOfStack -= 15;\r
121         }\r
122         #endif\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
192 \r
193 \r
194 \r