]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/CCS/ARM_Cortex-R4/portASM.asm
Prepare for V7.4.0 release.
[freertos] / FreeRTOS / Source / portable / CCS / ARM_Cortex-R4 / portASM.asm
1 ;/*\r
2 ;    FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd.\r
3 ;       \r
4 ;\r
5 ;    ***************************************************************************\r
6 ;     *                                                                       *\r
7 ;     *    FreeRTOS tutorial books are available in pdf and paperback.        *\r
8 ;     *    Complete, revised, and edited pdf reference manuals are also       *\r
9 ;     *    available.                                                         *\r
10 ;     *                                                                       *\r
11 ;     *    Purchasing FreeRTOS documentation will not only help you, by       *\r
12 ;     *    ensuring you get running as quickly as possible and with an        *\r
13 ;     *    in-depth knowledge of how to use FreeRTOS, it will also help       *\r
14 ;     *    the FreeRTOS project to continue with its mission of providing     *\r
15 ;     *    professional grade, cross platform, de facto standard solutions    *\r
16 ;     *    for microcontrollers - completely free of charge!                  *\r
17 ;     *                                                                       *\r
18 ;     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *\r
19 ;     *                                                                       *\r
20 ;     *    Thank you for using FreeRTOS, and thank you for your support!      *\r
21 ;     *                                                                       *\r
22 ;    ***************************************************************************\r
23 ;\r
24 ;\r
25 ;    This file is part of the FreeRTOS distribution.\r
26 ;\r
27 ;    FreeRTOS is free software; you can redistribute it and/or modify it under\r
28 ;    the terms of the GNU General Public License (version 2) as published by the\r
29 ;    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
30 ;    >>>NOTE<<< The modification to the GPL is included to allow you to\r
31 ;    distribute a combined work that includes FreeRTOS without being obliged to\r
32 ;    provide the source code for proprietary components outside of the FreeRTOS\r
33 ;    kernel.  FreeRTOS is distributed in the hope that it will be useful, but\r
34 ;    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
35 ;    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
36 ;    more details. You should have received a copy of the GNU General Public\r
37 ;    License and the FreeRTOS license exception along with FreeRTOS; if not it\r
38 ;    can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
39 ;    by writing to Richard Barry, contact details for whom are available on the\r
40 ;    FreeRTOS WEB site.\r
41 ;\r
42 ;    1 tab == 4 spaces!\r
43 ;\r
44 ;    http://www.FreeRTOS.org - Documentation, latest information, license and\r
45 ;    contact details.\r
46 ;\r
47 ;    http://www.SafeRTOS.com - A version that is certified for use in safety\r
48 ;    critical systems.\r
49 ;\r
50 ;    http://www.OpenRTOS.com - Commercial support, development, porting,\r
51 ;    licensing and training services.\r
52 ;*/\r
53 \r
54         .text\r
55         .arm\r
56         .ref vTaskSwitchContext\r
57         .ref vTaskIncrementTick\r
58         .ref ulTaskHasFPUContext\r
59                 .ref pxCurrentTCB\r
60 \r
61 ;/*-----------------------------------------------------------*/\r
62 ;\r
63 ; Save Task Context \r
64 ;\r
65 portSAVE_CONTEXT .macro\r
66                 DSB\r
67 \r
68                 ; Push R0 as we are going to use it\r
69                 STMDB   SP!, {R0}\r
70 \r
71                 ; Set R0 to point to the task stack pointer.\r
72                 STMDB   SP,{SP}^\r
73                 SUB     SP, SP, #4\r
74                 LDMIA   SP!,{R0}\r
75 \r
76                 ; Push the return address onto the stack.\r
77                 STMDB   R0!, {LR}\r
78 \r
79                 ; Now LR has been saved, it can be used instead of R0.\r
80                 MOV     LR, R0\r
81 \r
82                 ; Pop R0 so it can be saved onto the task stack.\r
83                 LDMIA   SP!, {R0}\r
84 \r
85                 ; Push all the system mode registers onto the task stack.\r
86                 STMDB   LR,{R0-LR}^\r
87                 SUB     LR, LR, #60\r
88 \r
89                 ; Push the SPSR onto the task stack.\r
90                 MRS     R0, SPSR\r
91                 STMDB   LR!, {R0}\r
92 \r
93     .if (__TI_VFP_SUPPORT__)\r
94                 ;Determine if the task maintains an FPU context.\r
95                 LDR     R0, ulFPUContextConst\r
96                 LDR     R0, [R0]\r
97 \r
98                 ; Test the flag\r
99                 CMP             R0, #0\r
100 \r
101                 ; If the task is not using a floating point context then skip the\r
102                 ; saving of the FPU registers.\r
103                 BEQ             PC+3\r
104                 FSTMDBD LR!, {D0-D15}\r
105                 FMRX    R1,  FPSCR\r
106                 STMFD   LR!, {R1}\r
107 \r
108                 ; Save the flag\r
109                 STMDB   LR!, {R0}\r
110         .endif\r
111 \r
112                 ; Store the new top of stack for the task.\r
113                 LDR     R0, pxCurrentTCBConst\r
114                 LDR     R0, [R0]\r
115                 STR     LR, [R0]\r
116 \r
117         .endm\r
118 \r
119 ;/*-----------------------------------------------------------*/\r
120 ;\r
121 ; Restore Task Context\r
122 ;\r
123 portRESTORE_CONTEXT .macro\r
124                 LDR             R0, pxCurrentTCBConst\r
125                 LDR             R0, [R0]\r
126                 LDR             LR, [R0]\r
127 \r
128         .if (__TI_VFP_SUPPORT__)\r
129                 ; The floating point context flag is the first thing on the stack.\r
130                 LDR             R0, ulFPUContextConst\r
131                 LDMFD   LR!, {R1}\r
132                 STR             R1, [R0]\r
133 \r
134                 ; Test the flag\r
135                 CMP             R1, #0\r
136 \r
137                 ; If the task is not using a floating point context then skip the\r
138                 ; VFP register loads.\r
139                 BEQ             PC+3\r
140 \r
141                 ; Restore the floating point context.\r
142                 LDMFD   LR!, {R0}\r
143                 FLDMIAD LR!, {D0-D15}\r
144                 FMXR    FPSCR, R0\r
145         .endif\r
146 \r
147                 ; Get the SPSR from the stack.\r
148                 LDMFD   LR!, {R0}\r
149                 MSR             SPSR_CSXF, R0\r
150 \r
151                 ; Restore all system mode registers for the task.\r
152                 LDMFD   LR, {R0-R14}^\r
153 \r
154                 ; Restore the return address.\r
155                 LDR             LR, [LR, #+60]\r
156 \r
157                 ; And return - correcting the offset in the LR to obtain the\r
158                 ; correct address.\r
159                 SUBS    PC, LR, #4\r
160         .endm\r
161 \r
162 ;/*-----------------------------------------------------------*/\r
163 ; Start the first task by restoring its context.\r
164 \r
165         .def vPortStartFirstTask\r
166 \r
167 vPortStartFirstTask:\r
168         portRESTORE_CONTEXT\r
169 \r
170 ;/*-----------------------------------------------------------*/\r
171 ; Yield to another task.\r
172 \r
173         .def vPortYieldProcessor\r
174 \r
175 vPortYieldProcessor:\r
176                 ; Within an IRQ ISR the link register has an offset from the true return\r
177                 ; address.  SWI doesn't do this. Add the offset manually so the ISR\r
178                 ; return code can be used.\r
179         ADD     LR, LR, #4\r
180 \r
181         ; First save the context of the current task.\r
182         portSAVE_CONTEXT\r
183 \r
184         ; Select the next task to execute. */\r
185         BL      vTaskSwitchContext\r
186 \r
187         ; Restore the context of the task selected to execute.\r
188         portRESTORE_CONTEXT\r
189 \r
190 ;/*-----------------------------------------------------------*/\r
191 ; Yield to another task from within the FreeRTOS API\r
192 \r
193                 .def vPortYeildWithinAPI\r
194 \r
195 vPortYeildWithinAPI:\r
196                 ; Save the context of the current task.\r
197 \r
198         portSAVE_CONTEXT\r
199                 ; Clear SSI flag.\r
200                 MOVW    R0, #0xFFF4\r
201                 MOVT    R0, #0xFFFF\r
202                 LDR     R0, [R0]\r
203 \r
204                 ; Select the next task to execute. */\r
205         BL      vTaskSwitchContext\r
206 \r
207         ; Restore the context of the task selected to execute.\r
208         portRESTORE_CONTEXT\r
209 \r
210 ;/*-----------------------------------------------------------*/\r
211 ; Preemptive Tick\r
212 \r
213         .def vPortPreemptiveTick\r
214 \r
215 vPortPreemptiveTick:\r
216 \r
217                 ; Save the context of the current task.\r
218         portSAVE_CONTEXT\r
219 \r
220         ; Clear interrupt flag\r
221         MOVW    R0, #0xFC88\r
222         MOVT    R0, #0xFFFF\r
223         MOV     R1, #1\r
224         STR     R1, [R0]\r
225 \r
226         ; Increment the tick count, making any adjustments to the blocked lists\r
227         ; that may be necessary.\r
228         BL      vTaskIncrementTick\r
229 \r
230         ; Select the next task to execute.\r
231         BL      vTaskSwitchContext\r
232 \r
233         ; Restore the context of the task selected to execute.\r
234         portRESTORE_CONTEXT\r
235 \r
236 ;-------------------------------------------------------------------------------\r
237 \r
238         .if (__TI_VFP_SUPPORT__)\r
239 \r
240                 .def vPortInitialiseFPSCR\r
241 \r
242 vPortInitialiseFPSCR:\r
243 \r
244                 MOV             R0, #0\r
245                 FMXR    FPSCR, R0\r
246                 BX              LR\r
247 \r
248         .endif ;__TI_VFP_SUPPORT__\r
249 \r
250 \r
251 pxCurrentTCBConst       .word   pxCurrentTCB\r
252 ulFPUContextConst       .word   ulTaskHasFPUContext\r
253 ;-------------------------------------------------------------------------------\r
254 \r