]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm_Hx2.s85
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm_Hx2.s85
1 ;/*\r
2 ; * FreeRTOS Kernel V10.3.0\r
3 ; * Copyright (C) 2020 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 544`\r
62         PUBLIC MD_INTTM0EQ0\r
63 \r
64 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
65 `??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", 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 544\r
284 `??MD_INTTM0EQ0??INTVEC 544`:\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 ; set microcontroller Option bytes\r
315 \r
316       COMMON INTVEC:CODE:ROOT(2)\r
317       ORG 122\r
318 `OPTBYTES`:\r
319       DB 0xFD\r
320       DB 0xFF\r
321       DB 0xFF\r
322       DB 0xFF\r
323       DB 0xFF\r
324       DB 0xFF\r
325 \r
326 #if configOCD_USAGE == 1\r
327 \r
328       COMMON   INTVEC:CODE:ROOT(4)\r
329       ORG      0x230\r
330       PUBLIC ROM_INT2\r
331 ROM_INT2:\r
332       DB 0xff, 0xff, 0xff, 0xff\r
333       DB 0xff, 0xff, 0xff, 0xff\r
334       DB 0xff, 0xff, 0xff, 0xff\r
335       DB 0xff, 0xff, 0xff, 0xff\r
336 \r
337 \r
338       COMMON   INTVEC:CODE:ROOT(4)\r
339       ORG      0x60\r
340       PUBLIC   ROM_INT\r
341 ROM_INT:\r
342       DB 0xff, 0xff, 0xff, 0xff\r
343       DB 0xff, 0xff, 0xff, 0xff\r
344       DB 0xff, 0xff, 0xff, 0xff\r
345       DB 0xff, 0xff, 0xff, 0xff\r
346 \r
347 #endif /* configOCD_USAGE */\r
348 \r
349       END\r
350 \r