]> begriffs open source - freertos/blob - portable/IAR/ARM_CM3/portasm.s
[AUTO][RELEASE]: Bump file header version to "10.4.6"
[freertos] / portable / IAR / ARM_CM3 / portasm.s
1 /*\r
2  * FreeRTOS Kernel V10.4.6\r
3  * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * SPDX-License-Identifier: MIT\r
6  *\r
7  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
8  * this software and associated documentation files (the "Software"), to deal in\r
9  * the Software without restriction, including without limitation the rights to\r
10  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
11  * the Software, and to permit persons to whom the Software is furnished to do so,\r
12  * subject to the following conditions:\r
13  *\r
14  * The above copyright notice and this permission notice shall be included in all\r
15  * copies or substantial portions of the Software.\r
16  *\r
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
19  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
20  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
21  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
23  *\r
24  * https://www.FreeRTOS.org\r
25  * https://github.com/FreeRTOS\r
26  *\r
27  */\r
28 \r
29 #include <FreeRTOSConfig.h>\r
30 \r
31         RSEG    CODE:CODE(2)\r
32         thumb\r
33 \r
34         EXTERN pxCurrentTCB\r
35         EXTERN vTaskSwitchContext\r
36 \r
37         PUBLIC xPortPendSVHandler\r
38         PUBLIC vPortSVCHandler\r
39         PUBLIC vPortStartFirstTask\r
40 \r
41 \r
42 \r
43 /*-----------------------------------------------------------*/\r
44 \r
45 xPortPendSVHandler:\r
46         mrs r0, psp\r
47         isb\r
48         ldr     r3, =pxCurrentTCB                       /* Get the location of the current TCB. */\r
49         ldr     r2, [r3]\r
50 \r
51         stmdb r0!, {r4-r11}                             /* Save the remaining registers. */\r
52         str r0, [r2]                                    /* Save the new top of stack into the first member of the TCB. */\r
53 \r
54         stmdb sp!, {r3, r14}\r
55         mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY\r
56         msr basepri, r0\r
57         dsb\r
58         isb\r
59         bl vTaskSwitchContext\r
60         mov r0, #0\r
61         msr basepri, r0\r
62         ldmia sp!, {r3, r14}\r
63 \r
64         ldr r1, [r3]\r
65         ldr r0, [r1]                                    /* The first item in pxCurrentTCB is the task top of stack. */\r
66         ldmia r0!, {r4-r11}                             /* Pop the registers. */\r
67         msr psp, r0\r
68         isb\r
69         bx r14\r
70 \r
71 \r
72 /*-----------------------------------------------------------*/\r
73 \r
74 vPortSVCHandler:\r
75         /* Get the location of the current TCB. */\r
76         ldr     r3, =pxCurrentTCB\r
77         ldr r1, [r3]\r
78         ldr r0, [r1]\r
79         /* Pop the core registers. */\r
80         ldmia r0!, {r4-r11}\r
81         msr psp, r0\r
82         isb\r
83         mov r0, #0\r
84         msr     basepri, r0\r
85         orr r14, r14, #13\r
86         bx r14\r
87 \r
88 /*-----------------------------------------------------------*/\r
89 \r
90 vPortStartFirstTask\r
91         /* Use the NVIC offset register to locate the stack. */\r
92         ldr r0, =0xE000ED08\r
93         ldr r0, [r0]\r
94         ldr r0, [r0]\r
95         /* Set the msp back to the start of the stack. */\r
96         msr msp, r0\r
97         /* Call SVC to start the first task, ensuring interrupts are enabled. */\r
98         cpsie i\r
99         cpsie f\r
100         dsb\r
101         isb\r
102         svc 0\r
103 \r
104         END\r