]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm
Update version numbers in preparation for new release.
[freertos] / FreeRTOS / Source / portable / CCS / ARM_CM4F / portasm.asm
1 ;/*\r
2 ;    FreeRTOS V8.2.2 - Copyright (C) 2015 Real Time Engineers Ltd.\r
3 ;    All rights reserved\r
4 ;\r
5 ;    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 ;\r
7 ;    This file is part of the FreeRTOS distribution.\r
8 ;\r
9 ;    FreeRTOS is free software; you can redistribute it and/or modify it under\r
10 ;    the terms of the GNU General Public License (version 2) as published by the\r
11 ;    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
12 ;\r
13 ;    ***************************************************************************\r
14 ;    >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
15 ;    >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
16 ;    >>!   obliged to provide the source code for proprietary components     !<<\r
17 ;    >>!   outside of the FreeRTOS kernel.                                   !<<\r
18 ;    ***************************************************************************\r
19 ;\r
20 ;    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
21 ;    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
22 ;    FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
23 ;    link: http://www.freertos.org/a00114.html\r
24 ;\r
25 ;    ***************************************************************************\r
26 ;     *                                                                       *\r
27 ;     *    FreeRTOS provides completely free yet professionally developed,    *\r
28 ;     *    robust, strictly quality controlled, supported, and cross          *\r
29 ;     *    platform software that is more than just the market leader, it     *\r
30 ;     *    is the industry's de facto standard.                               *\r
31 ;     *                                                                       *\r
32 ;     *    Help yourself get started quickly while simultaneously helping     *\r
33 ;     *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
34 ;     *    tutorial book, reference manual, or both:                          *\r
35 ;     *    http://www.FreeRTOS.org/Documentation                              *\r
36 ;     *                                                                       *\r
37 ;    ***************************************************************************\r
38 ;\r
39 ;    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
40 ;    the FAQ page "My application does not run, what could be wrong?".  Have you\r
41 ;    defined configASSERT()?\r
42 ;\r
43 ;    http://www.FreeRTOS.org/support - In return for receiving this top quality\r
44 ;    embedded software for free we request you assist our global community by\r
45 ;    participating in the support forum.\r
46 ;\r
47 ;    http://www.FreeRTOS.org/training - Investing in training allows your team to\r
48 ;    be as productive as possible as early as possible.  Now you can receive\r
49 ;    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
50 ;    Ltd, and the world's leading authority on the world's leading RTOS.\r
51 ;\r
52 ;    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
53 ;    including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
54 ;    compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
55 ;\r
56 ;    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
57 ;    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
58 ;\r
59 ;    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
60 ;    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
61 ;    licenses offer ticketed support, indemnification and commercial middleware.\r
62 ;\r
63 ;    http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
64 ;    engineered and independently SIL3 certified version for use in safety and\r
65 ;    mission critical applications that require provable dependability.\r
66 ;\r
67 ;    1 tab == 4 spaces!\r
68 ;*/\r
69 \r
70         .thumb\r
71 \r
72         .ref pxCurrentTCB\r
73         .ref vTaskSwitchContext\r
74         .ref ulMaxSyscallInterruptPriority\r
75 \r
76         .def xPortPendSVHandler\r
77         .def ulPortGetIPSR\r
78         .def vPortSVCHandler\r
79         .def vPortStartFirstTask\r
80         .def vPortEnableVFP\r
81 \r
82 NVICOffsetConst:                                        .word   0xE000ED08\r
83 CPACRConst:                                                     .word   0xE000ED88\r
84 pxCurrentTCBConst:                                      .word   pxCurrentTCB\r
85 ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority\r
86 \r
87 ; -----------------------------------------------------------\r
88 \r
89         .align 4\r
90 ulPortGetIPSR: .asmfunc\r
91         mrs r0, ipsr\r
92         bx r14\r
93         .endasmfunc\r
94  ; -----------------------------------------------------------\r
95 \r
96         .align 4\r
97 vPortSetInterruptMask: .asmfunc\r
98         push {r0}\r
99         ldr r0, ulMaxSyscallInterruptPriorityConst\r
100         msr basepri, r0\r
101         pop {r0}\r
102         bx r14\r
103         .endasmfunc\r
104 ; -----------------------------------------------------------\r
105 \r
106         .align 4\r
107 xPortPendSVHandler: .asmfunc\r
108         mrs r0, psp\r
109         isb\r
110 \r
111         ;/* Get the location of the current TCB. */\r
112         ldr     r3, pxCurrentTCBConst\r
113         ldr     r2, [r3]\r
114 \r
115         ;/* Is the task using the FPU context?  If so, push high vfp registers. */\r
116         tst r14, #0x10\r
117         it eq\r
118         vstmdbeq r0!, {s16-s31}\r
119 \r
120         ;/* Save the core registers. */\r
121         stmdb r0!, {r4-r11, r14}\r
122 \r
123         ;/* Save the new top of stack into the first member of the TCB. */\r
124         str r0, [r2]\r
125 \r
126         stmdb sp!, {r3}\r
127         ldr r0, ulMaxSyscallInterruptPriorityConst\r
128         ldr r1, [r0]\r
129         msr basepri, r1\r
130         dsb\r
131         isb\r
132         bl vTaskSwitchContext\r
133         mov r0, #0\r
134         msr basepri, r0\r
135         ldmia sp!, {r3}\r
136 \r
137         ;/* The first item in pxCurrentTCB is the task top of stack. */\r
138         ldr r1, [r3]\r
139         ldr r0, [r1]\r
140 \r
141         ;/* Pop the core registers. */\r
142         ldmia r0!, {r4-r11, r14}\r
143 \r
144         ;/* Is the task using the FPU context?  If so, pop the high vfp registers\r
145         ;too. */\r
146         tst r14, #0x10\r
147         it eq\r
148         vldmiaeq r0!, {s16-s31}\r
149 \r
150         msr psp, r0\r
151         isb\r
152         bx r14\r
153         .endasmfunc\r
154 \r
155 ; -----------------------------------------------------------\r
156 \r
157         .align 4\r
158 vPortSVCHandler: .asmfunc\r
159         ;/* Get the location of the current TCB. */\r
160         ldr     r3, pxCurrentTCBConst\r
161         ldr r1, [r3]\r
162         ldr r0, [r1]\r
163         ;/* Pop the core registers. */\r
164         ldmia r0!, {r4-r11, r14}\r
165         msr psp, r0\r
166         isb\r
167         mov r0, #0\r
168         msr     basepri, r0\r
169         bx r14\r
170         .endasmfunc\r
171 \r
172 ; -----------------------------------------------------------\r
173 \r
174         .align 4\r
175 vPortStartFirstTask: .asmfunc\r
176         ;/* Use the NVIC offset register to locate the stack. */\r
177         ldr r0, NVICOffsetConst\r
178         ldr r0, [r0]\r
179         ldr r0, [r0]\r
180         ;/* Set the msp back to the start of the stack. */\r
181         msr msp, r0\r
182         ;/* Call SVC to start the first task. */\r
183         cpsie i\r
184         cpsie f\r
185         dsb\r
186         isb\r
187         svc #0\r
188         .endasmfunc\r
189 \r
190 ; -----------------------------------------------------------\r
191 \r
192         .align 4\r
193 vPortEnableVFP: .asmfunc\r
194         ;/* The FPU enable bits are in the CPACR. */\r
195         ldr.w r0, CPACRConst\r
196         ldr     r1, [r0]\r
197 \r
198         ;/* Enable CP10 and CP11 coprocessors, then save back. */\r
199         orr     r1, r1, #( 0xf << 20 )\r
200         str r1, [r0]\r
201         bx      r14\r
202         .endasmfunc\r
203 \r
204         .end\r
205 \r
206 ; -----------------------------------------------------------\r
207 \r