]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/CCS/ARM_CM3/portasm.asm
72e93fc0b6ea650970ae6fd571f471cf11c658a5
[freertos] / FreeRTOS / Source / portable / CCS / ARM_CM3 / portasm.asm
1 ;/*\r
2 ;    FreeRTOS V9.0.0 - Copyright (C) 2016 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 \r
81 NVICOffsetConst:                                        .word   0xE000ED08\r
82 CPACRConst:                                                     .word   0xE000ED88\r
83 pxCurrentTCBConst:                                      .word   pxCurrentTCB\r
84 ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority\r
85 \r
86 ; -----------------------------------------------------------\r
87 \r
88         .align 4\r
89 ulPortGetIPSR: .asmfunc\r
90         mrs r0, ipsr\r
91         bx r14\r
92         .endasmfunc\r
93  ; -----------------------------------------------------------\r
94 \r
95         .align 4\r
96 vPortSetInterruptMask: .asmfunc\r
97         push {r0}\r
98         ldr r0, ulMaxSyscallInterruptPriorityConst\r
99         msr basepri, r0\r
100         pop {r0}\r
101         bx r14\r
102         .endasmfunc\r
103 ; -----------------------------------------------------------\r
104 \r
105         .align 4\r
106 xPortPendSVHandler: .asmfunc\r
107         mrs r0, psp\r
108         isb\r
109 \r
110         ;/* Get the location of the current TCB. */\r
111         ldr     r3, pxCurrentTCBConst\r
112         ldr     r2, [r3]\r
113 \r
114         ;/* Save the core registers. */\r
115         stmdb r0!, {r4-r11}\r
116 \r
117         ;/* Save the new top of stack into the first member of the TCB. */\r
118         str r0, [r2]\r
119 \r
120         stmdb sp!, {r3, r14}\r
121         ldr r0, ulMaxSyscallInterruptPriorityConst\r
122         ldr r1, [r0]\r
123         msr basepri, r1\r
124         dsb\r
125         isb\r
126         bl vTaskSwitchContext\r
127         mov r0, #0\r
128         msr basepri, r0\r
129         ldmia sp!, {r3, r14}\r
130 \r
131         ;/* The first item in pxCurrentTCB is the task top of stack. */\r
132         ldr r1, [r3]\r
133         ldr r0, [r1]\r
134 \r
135         ;/* Pop the core registers. */\r
136         ldmia r0!, {r4-r11}\r
137 \r
138         msr psp, r0\r
139         isb\r
140         bx r14\r
141         .endasmfunc\r
142 \r
143 ; -----------------------------------------------------------\r
144 \r
145         .align 4\r
146 vPortSVCHandler: .asmfunc\r
147         ;/* Get the location of the current TCB. */\r
148         ldr     r3, pxCurrentTCBConst\r
149         ldr r1, [r3]\r
150         ldr r0, [r1]\r
151         ;/* Pop the core registers. */\r
152         ldmia r0!, {r4-r11}\r
153         msr psp, r0\r
154         isb\r
155         mov r0, #0\r
156         msr     basepri, r0\r
157         orr r14, #0xd\r
158         bx r14\r
159         .endasmfunc\r
160 \r
161 ; -----------------------------------------------------------\r
162 \r
163         .align 4\r
164 vPortStartFirstTask: .asmfunc\r
165         ;/* Use the NVIC offset register to locate the stack. */\r
166         ldr r0, NVICOffsetConst\r
167         ldr r0, [r0]\r
168         ldr r0, [r0]\r
169         ;/* Set the msp back to the start of the stack. */\r
170         msr msp, r0\r
171         ;/* Clear the bit that indicates the FPU is in use in case the FPU was used\r
172         ;before the scheduler was started - which would otherwise result in the\r
173         ;unnecessary leaving of space in the SVC stack for lazy saving of FPU\r
174         ;registers. */\r
175         mov r0, #0\r
176         msr control, r0\r
177         ;/* Call SVC to start the first task. */\r
178         cpsie i\r
179         cpsie f\r
180         dsb\r
181         isb\r
182         svc #0\r
183         .endasmfunc\r
184 \r
185 ; -----------------------------------------------------------\r
186 \r