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