]> git.sur5r.net Git - freertos/blob
ed32a5b2855cac490785615812c12f4b8ac1f688
[freertos] /
1 /*\r
2     FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd.\r
3 \r
4 \r
5         FreeRTOS supports many tools and architectures. V7.0.0 is sponsored by:\r
6         Atollic AB - Atollic provides professional embedded systems development\r
7         tools for C/C++ development, code analysis and test automation.\r
8         See http://www.atollic.com\r
9 \r
10 \r
11     ***************************************************************************\r
12      *                                                                       *\r
13      *    FreeRTOS tutorial books are available in pdf and paperback.        *\r
14      *    Complete, revised, and edited pdf reference manuals are also       *\r
15      *    available.                                                         *\r
16      *                                                                       *\r
17      *    Purchasing FreeRTOS documentation will not only help you, by       *\r
18      *    ensuring you get running as quickly as possible and with an        *\r
19      *    in-depth knowledge of how to use FreeRTOS, it will also help       *\r
20      *    the FreeRTOS project to continue with its mission of providing     *\r
21      *    professional grade, cross platform, de facto standard solutions    *\r
22      *    for microcontrollers - completely free of charge!                  *\r
23      *                                                                       *\r
24      *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *\r
25      *                                                                       *\r
26      *    Thank you for using FreeRTOS, and thank you for your support!      *\r
27      *                                                                       *\r
28     ***************************************************************************\r
29 \r
30 \r
31     This file is part of the FreeRTOS distribution.\r
32 \r
33     FreeRTOS is free software; you can redistribute it and/or modify it under\r
34     the terms of the GNU General Public License (version 2) as published by the\r
35     Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
36     >>>NOTE<<< The modification to the GPL is included to allow you to\r
37     distribute a combined work that includes FreeRTOS without being obliged to\r
38     provide the source code for proprietary components outside of the FreeRTOS\r
39     kernel.  FreeRTOS is distributed in the hope that it will be useful, but\r
40     WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
41     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
42     more details. You should have received a copy of the GNU General Public\r
43     License and the FreeRTOS license exception along with FreeRTOS; if not it\r
44     can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
45     by writing to Richard Barry, contact details for whom are available on the\r
46     FreeRTOS WEB site.\r
47 \r
48     1 tab == 4 spaces!\r
49 \r
50     http://www.FreeRTOS.org - Documentation, latest information, license and\r
51     contact details.\r
52 \r
53     http://www.SafeRTOS.com - A version that is certified for use in safety\r
54     critical systems.\r
55 \r
56     http://www.OpenRTOS.com - Commercial support, development, porting,\r
57     licensing and training services.\r
58 */\r
59 \r
60 #include "FreeRTOSConfig.h"\r
61 \r
62         .extern pxCurrentTCB\r
63         .extern XIntc_DeviceInterruptHandler\r
64         .extern vTaskSwitchContext\r
65         .extern uxCriticalNesting\r
66         .extern pulISRStack\r
67 \r
68         .global _interrupt_handler\r
69         .global VPortYieldASM\r
70         .global vPortStartFirstTask\r
71 \r
72 \r
73 .macro portSAVE_CONTEXT\r
74 \r
75         /* Make room for the context on the stack. */\r
76         addik r1, r1, -132\r
77 \r
78         /* Save r31 so it can then be used as a temporary. */\r
79         swi r31, r1, 4\r
80 \r
81         /* Copy the msr into r31 - this is stacked later. */\r
82         mfs r31, rmsr\r
83 \r
84         /* Stack general registers. */\r
85         swi r30, r1, 12\r
86         swi r29, r1, 16\r
87         swi r28, r1, 20\r
88         swi r27, r1, 24\r
89         swi r26, r1, 28\r
90         swi r25, r1, 32\r
91         swi r24, r1, 36\r
92         swi r23, r1, 40\r
93         swi r22, r1, 44\r
94         swi r21, r1, 48\r
95         swi r20, r1, 52\r
96         swi r19, r1, 56\r
97         swi r18, r1, 60\r
98         swi r17, r1, 64\r
99         swi r16, r1, 68\r
100         swi r15, r1, 72\r
101         swi r13, r1, 80\r
102         swi r12, r1, 84\r
103         swi r11, r1, 88\r
104         swi r10, r1, 92\r
105         swi r9, r1, 96\r
106         swi r8, r1, 100\r
107         swi r7, r1, 104\r
108         swi r6, r1, 108\r
109         swi r5, r1, 112\r
110         swi r4, r1, 116\r
111         swi r3, r1, 120\r
112         swi r2, r1, 124\r
113 \r
114         /* Stack the critical section nesting value. */\r
115         lwi r3, r0, uxCriticalNesting\r
116         swi r3, r1, 128\r
117 \r
118         /* Save the top of stack value to the TCB. */\r
119         lwi r3, r0, pxCurrentTCB\r
120         sw      r1, r0, r3\r
121         \r
122         .endm\r
123 \r
124 .macro portRESTORE_CONTEXT\r
125 \r
126         /* Load the top of stack value from the TCB. */\r
127         lwi r3, r0, pxCurrentTCB\r
128         lw      r1, r0, r3      \r
129 \r
130         /* Restore the general registers. */\r
131         lwi r31, r1, 4          \r
132         lwi r30, r1, 12         \r
133         lwi r29, r1, 16 \r
134         lwi r28, r1, 20 \r
135         lwi r27, r1, 24 \r
136         lwi r26, r1, 28 \r
137         lwi r25, r1, 32 \r
138         lwi r24, r1, 36 \r
139         lwi r23, r1, 40 \r
140         lwi r22, r1, 44 \r
141         lwi r21, r1, 48 \r
142         lwi r20, r1, 52 \r
143         lwi r19, r1, 56 \r
144         lwi r18, r1, 60 \r
145         lwi r17, r1, 64 \r
146         lwi r16, r1, 68 \r
147         lwi r15, r1, 72 \r
148         lwi r14, r1, 76 \r
149         lwi r13, r1, 80 \r
150         lwi r12, r1, 84 \r
151         lwi r11, r1, 88 \r
152         lwi r10, r1, 92 \r
153         lwi r9, r1, 96  \r
154         lwi r8, r1, 100 \r
155         lwi r7, r1, 104\r
156         lwi r6, r1, 108\r
157         lwi r5, r1, 112\r
158         lwi r4, r1, 116\r
159         lwi r2, r1, 124\r
160 \r
161         /* Reload the rmsr from the stack. */\r
162         lwi r3, r1, 8\r
163         mts rmsr, r3\r
164 \r
165         /* Load the critical nesting value. */\r
166         lwi r3, r1, 128\r
167         swi r3, r0, uxCriticalNesting\r
168 \r
169         /* Test the critical nesting value.  If it is non zero then the task last\r
170         exited the running state using a yield.  If it is zero, then the task\r
171         last exited the running state through an interrupt. */\r
172         xori r3, r3, 0\r
173         bnei r3, exit_from_yield\r
174 \r
175         /* r3 was being used as a temporary.  Now restore its true value from the\r
176         stack. */\r
177         lwi r3, r1, 120\r
178 \r
179         /* Remove the stack frame. */\r
180         addik r1, r1, 132\r
181 \r
182         /* Return using rtid so interrupts are re-enabled as this function is\r
183         exited. */\r
184         rtid r14, 0\r
185         or r0, r0, r0\r
186 \r
187         .endm\r
188 \r
189         .text\r
190         .align  2\r
191 \r
192 /* This function is used to exit portRESTORE_CONTEXT() if the task being\r
193 returned to last left the Running state by calling taskYIELD() (rather than\r
194 being preempted by an interrupt. */\r
195 exit_from_yield:\r
196 \r
197         /* r3 was being used as a temporary.  Now restore its true value from the\r
198         stack. */\r
199         lwi r3, r1, 120\r
200 \r
201         /* Remove the stack frame. */\r
202         addik r1, r1, 132\r
203 \r
204         /* Return to the task. */\r
205         rtsd r14, 0\r
206         or r0, r0, r0\r
207 \r
208 \r
209 _interrupt_handler:\r
210 \r
211         portSAVE_CONTEXT\r
212 \r
213         /* Stack msr. */\r
214         swi r31, r1, 8\r
215 \r
216         /* Stack the return address. */\r
217         swi r14, r1, 76\r
218 \r
219         /* Switch to the ISR stack.  The pulISRStack value has already been set to\r
220         leave space for the caller function to write back into the stack of this\r
221         function. */\r
222         lwi r1, r0, pulISRStack\r
223 \r
224         /* The parameter to the interrupt handler. */\r
225         ori     r5, r0, configINTERRUPT_CONTROLLER_TO_USE\r
226 \r
227         /* Execute any pending interrupts. */\r
228         bralid r15, XIntc_DeviceInterruptHandler\r
229         or r0, r0, r0\r
230 \r
231         /* Restore the context of the next task scheduled to execute. */\r
232         portRESTORE_CONTEXT\r
233 \r
234 \r
235 VPortYieldASM:\r
236 \r
237         portSAVE_CONTEXT\r
238 \r
239         /* Stack msr. */\r
240         swi r31, r1, 8\r
241 \r
242         /* Modify the return address so a return is done to the instruction after\r
243         the call to VPortYieldASM. */\r
244         addi r14, r14, 8\r
245         swi r14, r1, 76\r
246 \r
247         /* Switch to use the ISR stack. */\r
248         lwi r1, r0, pulISRStack\r
249 \r
250         /* Select the next task to execute. */\r
251         bralid r15, vTaskSwitchContext\r
252         or r0, r0, r0\r
253 \r
254         /* Restore the context of the next task scheduled to execute. */\r
255         portRESTORE_CONTEXT\r
256 \r
257 vPortStartFirstTask:\r
258 \r
259         portRESTORE_CONTEXT\r
260         \r
261         \r
262 \r
263 \r
264 \r
265 \r