]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm.s85
Update copyright date ready for tagging V10.1.0.
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm.s85
1 ;/*\r
2 ; * FreeRTOS Kernel V10.1.0\r
3 ; * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4 ; *\r
5 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6 ; * this software and associated documentation files (the "Software"), to deal in\r
7 ; * the Software without restriction, including without limitation the rights to\r
8 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9 ; * the Software, and to permit persons to whom the Software is furnished to do so,\r
10 ; * subject to the following conditions:\r
11 ; *\r
12 ; * The above copyright notice and this permission notice shall be included in all\r
13 ; * copies or substantial portions of the Software.\r
14 ; *\r
15 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21 ; *\r
22 ; * http://www.FreeRTOS.org\r
23 ; * http://aws.amazon.com/freertos\r
24 ; *\r
25 ; * 1 tab == 4 spaces!\r
26 ; */\r
27 ; Note: Select the correct include files for the device used by the application.\r
28 #include "FreeRTOSConfig.h"\r
29 ;------------------------------------------------------------------------------\r
30 \r
31 ; Functions used by scheduler\r
32 ;------------------------------------------------------------------------------\r
33     EXTERN    vTaskSwitchContext\r
34     EXTERN    xTaskIncrementTick\r
35 \r
36 ; Variables used by scheduler\r
37 ;------------------------------------------------------------------------------\r
38     EXTERN    pxCurrentTCB\r
39     EXTERN    usCriticalNesting\r
40 \r
41 ; Functions implemented in this file\r
42 ;------------------------------------------------------------------------------\r
43     PUBLIC    vPortYield\r
44     PUBLIC    vPortStart\r
45 \r
46 ; Security ID definition\r
47 ;------------------------------------------------------------------------------\r
48 #define CG_SECURITY0    0FFH\r
49 #define CG_SECURITY1    0FFH\r
50 #define CG_SECURITY2    0FFH\r
51 #define CG_SECURITY3    0FFH\r
52 #define CG_SECURITY4    0FFH\r
53 #define CG_SECURITY5    0FFH\r
54 #define CG_SECURITY6    0FFH\r
55 #define CG_SECURITY7    0FFH\r
56 #define CG_SECURITY8    0FFH\r
57 #define CG_SECURITY9    0FFH\r
58 \r
59 ; Tick ISR Prototype\r
60 ;------------------------------------------------------------------------------\r
61         PUBWEAK `??MD_INTTM0EQ0??INTVEC 640`\r
62         PUBLIC MD_INTTM0EQ0\r
63 \r
64 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
65 `??MD_INTTM0EQ0??INTVEC 640` SYMBOL "??INTVEC 640", MD_INTTM0EQ0\r
66 \r
67 ;------------------------------------------------------------------------------\r
68 ;   portSAVE_CONTEXT MACRO\r
69 ;   Saves the context of the remaining general purpose registers\r
70 ;   and the usCriticalNesting Value of the active Task onto the task stack\r
71 ;   saves stack pointer to the TCB\r
72 ;------------------------------------------------------------------------------\r
73 portSAVE_CONTEXT MACRO\r
74 #if configDATA_MODE == 1                                        ; Using the Tiny data model\r
75     prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers\r
76     sst.w   r19,72[ep]\r
77     sst.w   r18,68[ep]\r
78     sst.w   r17,64[ep]\r
79     sst.w   r16,60[ep]\r
80     sst.w   r15,56[ep]\r
81     sst.w   r14,52[ep]\r
82     sst.w   r13,48[ep]\r
83     sst.w   r12,44[ep]\r
84     sst.w   r11,40[ep]\r
85     sst.w   r10,36[ep]\r
86     sst.w   r9,32[ep]\r
87     sst.w   r8,28[ep]\r
88     sst.w   r7,24[ep]\r
89     sst.w   r6,20[ep]\r
90     sst.w   r5,16[ep]\r
91     sst.w   r4,12[ep]\r
92 #else                                                           ; Using the Small/Large data model\r
93     prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers\r
94     sst.w   r19,68[ep]\r
95     sst.w   r18,64[ep]\r
96     sst.w   r17,60[ep]\r
97     sst.w   r16,56[ep]\r
98     sst.w   r15,52[ep]\r
99     sst.w   r14,48[ep]\r
100     sst.w   r13,44[ep]\r
101     sst.w   r12,40[ep]\r
102     sst.w   r11,36[ep]\r
103     sst.w   r10,32[ep]\r
104     sst.w   r9,28[ep]\r
105     sst.w   r8,24[ep]\r
106     sst.w   r7,20[ep]\r
107     sst.w   r6,16[ep]\r
108     sst.w   r5,12[ep]\r
109 #endif /* configDATA_MODE */\r
110     sst.w   r2,8[ep]\r
111     sst.w   r1,4[ep]\r
112     MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack\r
113     ld.w    lw1(usCriticalNesting)[r1],r2\r
114     sst.w   r2,0[ep]\r
115     MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB\r
116     ld.w    lw1(pxCurrentTCB)[r1],r2\r
117     st.w    sp,0[r2]\r
118     ENDM\r
119 ;------------------------------------------------------------------------------\r
120 \r
121 ;------------------------------------------------------------------------------\r
122 ;   portRESTORE_CONTEXT MACRO\r
123 ;   Gets stack pointer from the current TCB\r
124 ;   Restores the context of the usCriticalNesting value and general purpose\r
125 ;   registers of the selected task from the task stack\r
126 ;------------------------------------------------------------------------------\r
127 portRESTORE_CONTEXT MACRO\r
128     MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address\r
129     ld.w    lw1(pxCurrentTCB)[r1],sp\r
130     MOV     sp,r1\r
131     ld.w    0[r1],sp                        ; load stackpointer\r
132     MOV     sp,ep                           ; set stack pointer to element pointer\r
133     sld.w   0[ep],r1                        ; load usCriticalNesting value from stack\r
134     MOVHI   hi1(usCriticalNesting),r0,r2\r
135     st.w    r1,lw1(usCriticalNesting)[r2]\r
136     sld.w   4[ep],r1                        ; restore general purpose registers\r
137     sld.w   8[ep],r2\r
138 #if configDATA_MODE == 1                    ; Using Tiny data model\r
139     sld.w   12[ep],r4\r
140     sld.w   16[ep],r5\r
141     sld.w   20[ep],r6\r
142     sld.w   24[ep],r7\r
143     sld.w   28[ep],r8\r
144     sld.w   32[ep],r9\r
145     sld.w   36[ep],r10\r
146     sld.w   40[ep],r11\r
147     sld.w   44[ep],r12\r
148     sld.w   48[ep],r13\r
149     sld.w   52[ep],r14\r
150     sld.w   56[ep],r15\r
151     sld.w   60[ep],r16\r
152     sld.w   64[ep],r17\r
153     sld.w   68[ep],r18\r
154     sld.w   72[ep],r19\r
155     dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}\r
156 #else                                       ; Using Small/Large data model\r
157     sld.w   12[ep],r5\r
158     sld.w   16[ep],r6\r
159     sld.w   20[ep],r7\r
160     sld.w   24[ep],r8\r
161     sld.w   28[ep],r9\r
162     sld.w   32[ep],r10\r
163     sld.w   36[ep],r11\r
164     sld.w   40[ep],r12\r
165     sld.w   44[ep],r13\r
166     sld.w   48[ep],r14\r
167     sld.w   52[ep],r15\r
168     sld.w   56[ep],r16\r
169     sld.w   60[ep],r17\r
170     sld.w   64[ep],r18\r
171     sld.w   68[ep],r19\r
172     dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}\r
173 #endif /* configDATA_MODE */\r
174     ENDM\r
175 ;------------------------------------------------------------------------------\r
176 \r
177 ;------------------------------------------------------------------------------\r
178 ;   Restore the context of the first task that is going to run.\r
179 ;\r
180 ;   Input:  NONE\r
181 ;\r
182 ;   Call:   CALL    vPortStart\r
183 ;\r
184 ;   Output: NONE\r
185 ;------------------------------------------------------------------------------\r
186     RSEG CODE:CODE\r
187 vPortStart:\r
188     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
189     ld.w    0[sp],lp\r
190     ldsr    lp,5                            ; restore PSW\r
191     DI\r
192     ld.w    4[sp],lp                        ; restore LP\r
193     ld.w    8[sp],lp                        ; restore LP\r
194     ADD     0x0C,sp                         ; set SP to right position\r
195     EI\r
196     jmp     [lp]\r
197 ;------------------------------------------------------------------------------\r
198 \r
199 ;------------------------------------------------------------------------------\r
200 ;   Port Yield function to check for a Task switch in the cooperative and\r
201 ;   preemptive mode\r
202 ;\r
203 ;   Input:  NONE\r
204 ;\r
205 ;   Call:   CALL    vPortYield\r
206 ;\r
207 ;   Output: NONE\r
208 ;------------------------------------------------------------------------------\r
209 \r
210         RSEG CODE:CODE\r
211 vPortYield:\r
212 \r
213     add     -0x0C,sp                          ; prepare stack to save necessary values\r
214     st.w    lp,8[sp]                        ; store LP to stack\r
215     stsr    0,r31\r
216     st.w    lp,4[sp]                        ; store EIPC to stack\r
217     stsr    1,lp\r
218     st.w    lp,0[sp]                        ; store EIPSW to stack\r
219     portSAVE_CONTEXT                        ; Save the context of the current task.\r
220     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
221     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
222                                             ; ... scheduler decided should run.\r
223         ld.w    0[sp],lp                        ; restore EIPSW from stack\r
224     ldsr    lp,1\r
225     ld.w    4[sp],lp                        ; restore EIPC from stack\r
226     ldsr    lp,0\r
227     ld.w    8[sp],lp                        ; restore LP from stack\r
228     add     0x0C,sp                         ; set SP to right position\r
229 \r
230     RETI\r
231 \r
232 ;------------------------------------------------------------------------------\r
233 \r
234 ;------------------------------------------------------------------------------\r
235 ;   Perform the necessary steps of the Tick Count Increment and Task Switch\r
236 ;   depending on the chosen kernel configuration\r
237 ;\r
238 ;   Input:  NONE\r
239 ;\r
240 ;   Call:   ISR\r
241 ;\r
242 ;   Output: NONE\r
243 ;------------------------------------------------------------------------------\r
244 #if configUSE_PREEMPTION == 1               ; use preemptive kernel mode\r
245 \r
246 MD_INTTM0EQ0:\r
247 \r
248     add     -0x0C,sp                          ; prepare stack to save necessary values\r
249     st.w    lp,8[sp]                        ; store LP to stack\r
250     stsr    0,r31\r
251     st.w    lp,4[sp]                        ; store EIPC to stack\r
252     stsr    1,lp\r
253     st.w    lp,0[sp]                        ; store EIPSW to stack\r
254     portSAVE_CONTEXT                        ; Save the context of the current task.\r
255     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
256     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
257     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
258                                             ; ... scheduler decided should run.\r
259     ld.w    0[sp],lp                        ; restore EIPSW from stack\r
260     ldsr    lp,1\r
261     ld.w    4[sp],lp                        ; restore EIPC from stack\r
262     ldsr    lp,0\r
263     ld.w    8[sp],lp                        ; restore LP from stack\r
264     add     0x0C,sp                         ; set SP to right position\r
265 \r
266     RETI\r
267 ;------------------------------------------------------------------------------\r
268 #else                                       ; use cooperative kernel mode\r
269 \r
270 MD_INTTM0EQ0:\r
271     prepare {lp,ep},8,sp\r
272     sst.w   r1,4[ep]\r
273     sst.w   r5,0[ep]\r
274     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
275     sld.w   0[ep],r5\r
276     sld.w   4[ep],r1\r
277     dispose 8,{lp,ep}\r
278     RETI\r
279 #endif /* configUSE_PREEMPTION */\r
280 \r
281 ;------------------------------------------------------------------------------\r
282         COMMON INTVEC:CODE:ROOT(2)\r
283         ORG 640\r
284 `??MD_INTTM0EQ0??INTVEC 640`:\r
285         JR MD_INTTM0EQ0\r
286 \r
287         RSEG NEAR_ID:CONST:SORT:NOROOT(2)\r
288 `?<Initializer for usCriticalNesting>`:\r
289         DW 10\r
290 \r
291       COMMON INTVEC:CODE:ROOT(2)\r
292       ORG 40H\r
293 `??vPortYield??INTVEC 40`:\r
294         JR vPortYield\r
295 \r
296 ;------------------------------------------------------------------------------\r
297 ; set microcontroller security ID\r
298 \r
299       COMMON INTVEC:CODE:ROOT(2)\r
300       ORG 70H\r
301 `SECUID`:\r
302       DB CG_SECURITY0\r
303       DB CG_SECURITY1\r
304       DB CG_SECURITY2\r
305       DB CG_SECURITY3\r
306       DB CG_SECURITY4\r
307       DB CG_SECURITY5\r
308       DB CG_SECURITY6\r
309       DB CG_SECURITY7\r
310       DB CG_SECURITY8\r
311       DB CG_SECURITY9\r
312 \r
313 \r
314       END\r
315 \r