]> git.sur5r.net Git - freertos/blob
c015eed06628ffd3c7307972fae7db6bfeb6504c
[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         .extern pxCurrentTCB\r
61         .extern XIntc_DeviceInterruptHandler\r
62         .extern vTaskSwitchContext\r
63         .extern uxCriticalNesting\r
64         .extern pulISRStack\r
65 \r
66 /*      .global vPortFreeRTOSInterruptHandler */\r
67         .global _interrupt_handler\r
68         .global VPortYieldASM\r
69         .global vStartFirstTask\r
70 \r
71 \r
72 .macro portSAVE_CONTEXT\r
73         /* Make room for the context on the stack. */\r
74         addik r1, r1, -132\r
75         /* Save r31 so it can then be used. */\r
76         swi r31, r1, 4\r
77         /* Copy the msr into r31 - this is stacked later. */\r
78         mfs r31, rmsr\r
79         /* Stack general registers. */\r
80         swi r30, r1, 12\r
81         swi r29, r1, 16\r
82         swi r28, r1, 20\r
83         swi r27, r1, 24\r
84         swi r26, r1, 28\r
85         swi r25, r1, 32\r
86         swi r24, r1, 36\r
87         swi r23, r1, 40\r
88         swi r22, r1, 44\r
89         swi r21, r1, 48\r
90         swi r20, r1, 52\r
91         swi r19, r1, 56\r
92         swi r18, r1, 60\r
93         swi r17, r1, 64\r
94         swi r16, r1, 68\r
95         swi r15, r1, 72\r
96         swi r13, r1, 80\r
97         swi r12, r1, 84\r
98         swi r11, r1, 88\r
99         swi r10, r1, 92\r
100         swi r9, r1, 96\r
101         swi r8, r1, 100\r
102         swi r7, r1, 104\r
103         swi r6, r1, 108\r
104         swi r5, r1, 112\r
105         swi r4, r1, 116\r
106         swi r3, r1, 120\r
107         swi r2, r1, 124\r
108         /* Stack the critical section nesting value. */\r
109         lwi r3, r0, uxCriticalNesting\r
110         swi r3, r1, 128\r
111         /* Save the top of stack value to the TCB. */\r
112         lwi r3, r0, pxCurrentTCB\r
113         sw      r1, r0, r3\r
114         \r
115         .endm\r
116 \r
117 .macro portRESTORE_CONTEXT\r
118         /* Load the top of stack value from the TCB. */\r
119         lwi r3, r0, pxCurrentTCB\r
120         lw      r1, r0, r3      \r
121         /* Restore the general registers. */\r
122         lwi r31, r1, 4          \r
123         lwi r30, r1, 12         \r
124         lwi r29, r1, 16 \r
125         lwi r28, r1, 20 \r
126         lwi r27, r1, 24 \r
127         lwi r26, r1, 28 \r
128         lwi r25, r1, 32 \r
129         lwi r24, r1, 36 \r
130         lwi r23, r1, 40 \r
131         lwi r22, r1, 44 \r
132         lwi r21, r1, 48 \r
133         lwi r20, r1, 52 \r
134         lwi r19, r1, 56 \r
135         lwi r18, r1, 60 \r
136         lwi r17, r1, 64 \r
137         lwi r16, r1, 68 \r
138         lwi r15, r1, 72 \r
139         lwi r14, r1, 76 \r
140         lwi r13, r1, 80 \r
141         lwi r12, r1, 84 \r
142         lwi r11, r1, 88 \r
143         lwi r10, r1, 92 \r
144         lwi r9, r1, 96  \r
145         lwi r8, r1, 100 \r
146         lwi r7, r1, 104\r
147         lwi r6, r1, 108\r
148         lwi r5, r1, 112\r
149         lwi r4, r1, 116\r
150         lwi r2, r1, 124\r
151 \r
152         /* Load the critical nesting value. */\r
153         lwi r3, r1, 128\r
154         swi r3, r0, uxCriticalNesting\r
155 \r
156         /* Obtain the MSR value from the stack. */\r
157         lwi r3, r1, 8\r
158 \r
159         /* Are interrupts enabled in the MSR?  If so return using an return from \r
160         interrupt instruction to ensure interrupts are enabled only once the task\r
161         is running again. */\r
162         andi r3, r3, 2\r
163         beqid r3, 36\r
164         or r0, r0, r0\r
165 \r
166         /* Reload the rmsr from the stack, clear the enable interrupt bit in the\r
167         value before saving back to rmsr register, then return enabling interrupts\r
168         as we return. */\r
169         lwi r3, r1, 8\r
170         andi r3, r3, ~2\r
171         mts rmsr, r3\r
172         lwi r3, r1, 120\r
173         addik r1, r1, 132\r
174         rtid r14, 0\r
175         or r0, r0, r0\r
176 \r
177         /* Reload the rmsr from the stack, place it in the rmsr register, and\r
178         return without enabling interrupts. */\r
179         lwi r3, r1, 8\r
180         mts rmsr, r3\r
181         lwi r3, r1, 120\r
182         addik r1, r1, 132\r
183         rtsd r14, 0\r
184         or r0, r0, r0\r
185 \r
186         .endm\r
187 \r
188         .text\r
189         .align  2\r
190 \r
191 \r
192 /*vPortFreeRTOSInterruptHandler:*/\r
193 _interrupt_handler:\r
194         portSAVE_CONTEXT\r
195         /* Entered via an interrupt so interrupts must be enabled in msr. */\r
196         ori r31, r31, 2\r
197         /* Stack msr. */\r
198         swi r31, r1, 8\r
199         /* Stack the return address.  As we entered via an interrupt we do\r
200         not need to modify the return address prior to stacking. */\r
201         swi r14, r1, 76\r
202         /* Now switch to use the ISR stack. */\r
203         lwi r3, r0, pulISRStack\r
204         add r1, r3, r0\r
205         bralid r15, XIntc_DeviceInterruptHandler\r
206         or r0, r0, r0\r
207         portRESTORE_CONTEXT\r
208 \r
209 \r
210 VPortYieldASM:\r
211         portSAVE_CONTEXT\r
212         /* Stack msr. */\r
213         swi r31, r1, 8\r
214         /* Modify the return address so we return to the instruction after the\r
215         exception. */\r
216         addi r14, r14, 8\r
217         swi r14, r1, 76\r
218         /* Now switch to use the ISR stack. */\r
219         lwi r3, r0, pulISRStack\r
220         add r1, r3, r0\r
221         bralid r15, vTaskSwitchContext\r
222         or r0, r0, r0\r
223         portRESTORE_CONTEXT\r
224 \r
225 vStartFirstTask:\r
226         portRESTORE_CONTEXT\r
227         \r
228         \r
229 \r
230 \r
231 \r
232 \r