]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm_Hx2.s85
Update version number to 8.1.2 after moving the defaulting of configUSE_PORT_OPTIMISE...
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm_Hx2.s85
1 ;/*\r
2 ;    FreeRTOS V8.1.2 - Copyright (C) 2014 Real Time Engineers Ltd.\r
3 ;    All rights reserved\r
4 ;       \r
5 ;\r
6 ;    ***************************************************************************\r
7 ;     *                                                                       *\r
8 ;     *    FreeRTOS tutorial books are available in pdf and paperback.        *\r
9 ;     *    Complete, revised, and edited pdf reference manuals are also       *\r
10 ;     *    available.                                                         *\r
11 ;     *                                                                       *\r
12 ;     *    Purchasing FreeRTOS documentation will not only help you, by       *\r
13 ;     *    ensuring you get running as quickly as possible and with an        *\r
14 ;     *    in-depth knowledge of how to use FreeRTOS, it will also help       *\r
15 ;     *    the FreeRTOS project to continue with its mission of providing     *\r
16 ;     *    professional grade, cross platform, de facto standard solutions    *\r
17 ;     *    for microcontrollers - completely free of charge!                  *\r
18 ;     *                                                                       *\r
19 ;     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *\r
20 ;     *                                                                       *\r
21 ;     *    Thank you for using FreeRTOS, and thank you for your support!      *\r
22 ;     *                                                                       *\r
23 ;    ***************************************************************************\r
24 ;\r
25 ;\r
26 ;    This file is part of the FreeRTOS distribution.\r
27 ;\r
28 ;    FreeRTOS is free software; you can redistribute it and/or modify it under\r
29 ;    the terms of the GNU General Public License (version 2) as published by the\r
30 ;    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
31 ;    >>>NOTE<<< The modification to the GPL is included to allow you to\r
32 ;    distribute a combined work that includes FreeRTOS without being obliged to\r
33 ;    provide the source code for proprietary components outside of the FreeRTOS\r
34 ;    kernel.  FreeRTOS is distributed in the hope that it will be useful, but\r
35 ;    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
36 ;    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
37 ;    more details. You should have received a copy of the GNU General Public\r
38 ;    License and the FreeRTOS license exception along with FreeRTOS; if not it\r
39 ;    can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
40 ;    by writing to Richard Barry, contact details for whom are available on the\r
41 ;    FreeRTOS WEB site.\r
42 ;\r
43 ;    1 tab == 4 spaces!\r
44 ;\r
45 ;    http://www.FreeRTOS.org - Documentation, latest information, license and\r
46 ;    contact details.\r
47 ;\r
48 ;    http://www.SafeRTOS.com - A version that is certified for use in safety\r
49 ;    critical systems.\r
50 ;\r
51 ;    http://www.OpenRTOS.com - Commercial support, development, porting,\r
52 ;    licensing and training services.\r
53 ;*/\r
54 ; Note: Select the correct include files for the device used by the application.\r
55 #include "FreeRTOSConfig.h"\r
56 ;------------------------------------------------------------------------------\r
57 \r
58 ; Functions used by scheduler\r
59 ;------------------------------------------------------------------------------\r
60     EXTERN    vTaskSwitchContext\r
61     EXTERN    xTaskIncrementTick\r
62 \r
63 ; Variables used by scheduler\r
64 ;------------------------------------------------------------------------------\r
65     EXTERN    pxCurrentTCB\r
66     EXTERN    usCriticalNesting\r
67 \r
68 ; Functions implemented in this file\r
69 ;------------------------------------------------------------------------------\r
70     PUBLIC    vPortYield\r
71     PUBLIC    vPortStart\r
72 \r
73 ; Security ID definition\r
74 ;------------------------------------------------------------------------------\r
75 #define CG_SECURITY0    0FFH\r
76 #define CG_SECURITY1    0FFH\r
77 #define CG_SECURITY2    0FFH\r
78 #define CG_SECURITY3    0FFH\r
79 #define CG_SECURITY4    0FFH\r
80 #define CG_SECURITY5    0FFH\r
81 #define CG_SECURITY6    0FFH\r
82 #define CG_SECURITY7    0FFH\r
83 #define CG_SECURITY8    0FFH\r
84 #define CG_SECURITY9    0FFH\r
85 \r
86 ; Tick ISR Prototype\r
87 ;------------------------------------------------------------------------------\r
88         PUBWEAK `??MD_INTTM0EQ0??INTVEC 544`\r
89         PUBLIC MD_INTTM0EQ0\r
90 \r
91 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
92 `??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0\r
93 \r
94 ;------------------------------------------------------------------------------\r
95 ;   portSAVE_CONTEXT MACRO\r
96 ;   Saves the context of the remaining general purpose registers\r
97 ;   and the usCriticalNesting Value of the active Task onto the task stack\r
98 ;   saves stack pointer to the TCB\r
99 ;------------------------------------------------------------------------------\r
100 portSAVE_CONTEXT MACRO\r
101 #if configDATA_MODE == 1                                        ; Using the Tiny data model\r
102     prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers\r
103     sst.w   r19,72[ep]\r
104     sst.w   r18,68[ep]\r
105     sst.w   r17,64[ep]\r
106     sst.w   r16,60[ep]\r
107     sst.w   r15,56[ep]\r
108     sst.w   r14,52[ep]\r
109     sst.w   r13,48[ep]\r
110     sst.w   r12,44[ep]\r
111     sst.w   r11,40[ep]\r
112     sst.w   r10,36[ep]\r
113     sst.w   r9,32[ep]\r
114     sst.w   r8,28[ep]\r
115     sst.w   r7,24[ep]\r
116     sst.w   r6,20[ep]\r
117     sst.w   r5,16[ep]\r
118     sst.w   r4,12[ep]\r
119 #else                                                           ; Using the Small/Large data model\r
120     prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers\r
121     sst.w   r19,68[ep]\r
122     sst.w   r18,64[ep]\r
123     sst.w   r17,60[ep]\r
124     sst.w   r16,56[ep]\r
125     sst.w   r15,52[ep]\r
126     sst.w   r14,48[ep]\r
127     sst.w   r13,44[ep]\r
128     sst.w   r12,40[ep]\r
129     sst.w   r11,36[ep]\r
130     sst.w   r10,32[ep]\r
131     sst.w   r9,28[ep]\r
132     sst.w   r8,24[ep]\r
133     sst.w   r7,20[ep]\r
134     sst.w   r6,16[ep]\r
135     sst.w   r5,12[ep]\r
136 #endif /* configDATA_MODE */\r
137     sst.w   r2,8[ep]\r
138     sst.w   r1,4[ep]\r
139     MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack\r
140     ld.w    lw1(usCriticalNesting)[r1],r2\r
141     sst.w   r2,0[ep]\r
142     MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB\r
143     ld.w    lw1(pxCurrentTCB)[r1],r2\r
144     st.w    sp,0[r2]\r
145     ENDM\r
146 ;------------------------------------------------------------------------------\r
147 \r
148 ;------------------------------------------------------------------------------\r
149 ;   portRESTORE_CONTEXT MACRO\r
150 ;   Gets stack pointer from the current TCB\r
151 ;   Restores the context of the usCriticalNesting value and general purpose\r
152 ;   registers of the selected task from the task stack\r
153 ;------------------------------------------------------------------------------\r
154 portRESTORE_CONTEXT MACRO\r
155     MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address\r
156     ld.w    lw1(pxCurrentTCB)[r1],sp\r
157     MOV     sp,r1\r
158     ld.w    0[r1],sp                        ; load stackpointer\r
159     MOV     sp,ep                           ; set stack pointer to element pointer\r
160     sld.w   0[ep],r1                        ; load usCriticalNesting value from stack\r
161     MOVHI   hi1(usCriticalNesting),r0,r2\r
162     st.w    r1,lw1(usCriticalNesting)[r2]\r
163     sld.w   4[ep],r1                        ; restore general purpose registers\r
164     sld.w   8[ep],r2\r
165 #if configDATA_MODE == 1                    ; Using Tiny data model\r
166     sld.w   12[ep],r4\r
167     sld.w   16[ep],r5\r
168     sld.w   20[ep],r6\r
169     sld.w   24[ep],r7\r
170     sld.w   28[ep],r8\r
171     sld.w   32[ep],r9\r
172     sld.w   36[ep],r10\r
173     sld.w   40[ep],r11\r
174     sld.w   44[ep],r12\r
175     sld.w   48[ep],r13\r
176     sld.w   52[ep],r14\r
177     sld.w   56[ep],r15\r
178     sld.w   60[ep],r16\r
179     sld.w   64[ep],r17\r
180     sld.w   68[ep],r18\r
181     sld.w   72[ep],r19\r
182     dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}\r
183 #else                                       ; Using Small/Large data model\r
184     sld.w   12[ep],r5\r
185     sld.w   16[ep],r6\r
186     sld.w   20[ep],r7\r
187     sld.w   24[ep],r8\r
188     sld.w   28[ep],r9\r
189     sld.w   32[ep],r10\r
190     sld.w   36[ep],r11\r
191     sld.w   40[ep],r12\r
192     sld.w   44[ep],r13\r
193     sld.w   48[ep],r14\r
194     sld.w   52[ep],r15\r
195     sld.w   56[ep],r16\r
196     sld.w   60[ep],r17\r
197     sld.w   64[ep],r18\r
198     sld.w   68[ep],r19\r
199     dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}\r
200 #endif /* configDATA_MODE */\r
201     ENDM\r
202 ;------------------------------------------------------------------------------\r
203 \r
204 ;------------------------------------------------------------------------------\r
205 ;   Restore the context of the first task that is going to run.\r
206 ;\r
207 ;   Input:  NONE\r
208 ;\r
209 ;   Call:   CALL    vPortStart\r
210 ;\r
211 ;   Output: NONE\r
212 ;------------------------------------------------------------------------------ \r
213     RSEG CODE:CODE\r
214 vPortStart:\r
215     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
216     ld.w    0[sp],lp\r
217     ldsr    lp,5                            ; restore PSW\r
218     DI\r
219     ld.w    4[sp],lp                        ; restore LP\r
220     ld.w    8[sp],lp                        ; restore LP\r
221     ADD     0x0C,sp                         ; set SP to right position\r
222     EI\r
223     jmp     [lp]\r
224 ;------------------------------------------------------------------------------\r
225 \r
226 ;------------------------------------------------------------------------------\r
227 ;   Port Yield function to check for a Task switch in the cooperative and\r
228 ;   preemptive mode\r
229 ;\r
230 ;   Input:  NONE\r
231 ;\r
232 ;   Call:   CALL    vPortYield\r
233 ;\r
234 ;   Output: NONE\r
235 ;------------------------------------------------------------------------------\r
236 \r
237         RSEG CODE:CODE\r
238 vPortYield:\r
239 \r
240     add     -0x0C,sp                          ; prepare stack to save necessary values\r
241     st.w    lp,8[sp]                        ; store LP to stack\r
242     stsr    0,r31\r
243     st.w    lp,4[sp]                        ; store EIPC to stack\r
244     stsr    1,lp\r
245     st.w    lp,0[sp]                        ; store EIPSW to stack\r
246     portSAVE_CONTEXT                        ; Save the context of the current task.\r
247     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
248     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
249                                             ; ... scheduler decided should run.\r
250         ld.w    0[sp],lp                        ; restore EIPSW from stack\r
251     ldsr    lp,1\r
252     ld.w    4[sp],lp                        ; restore EIPC from stack\r
253     ldsr    lp,0\r
254     ld.w    8[sp],lp                        ; restore LP from stack\r
255     add     0x0C,sp                         ; set SP to right position\r
256 \r
257     RETI\r
258 \r
259 ;------------------------------------------------------------------------------\r
260 \r
261 ;------------------------------------------------------------------------------\r
262 ;   Perform the necessary steps of the Tick Count Increment and Task Switch\r
263 ;   depending on the chosen kernel configuration\r
264 ;\r
265 ;   Input:  NONE\r
266 ;\r
267 ;   Call:   ISR\r
268 ;\r
269 ;   Output: NONE\r
270 ;------------------------------------------------------------------------------ \r
271 #if configUSE_PREEMPTION == 1               ; use preemptive kernel mode\r
272 \r
273 MD_INTTM0EQ0:\r
274 \r
275     add     -0x0C,sp                          ; prepare stack to save necessary values\r
276     st.w    lp,8[sp]                        ; store LP to stack\r
277     stsr    0,r31\r
278     st.w    lp,4[sp]                        ; store EIPC to stack\r
279     stsr    1,lp\r
280     st.w    lp,0[sp]                        ; store EIPSW to stack\r
281     portSAVE_CONTEXT                        ; Save the context of the current task.\r
282     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
283     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
284     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
285                                             ; ... scheduler decided should run.\r
286     ld.w    0[sp],lp                        ; restore EIPSW from stack\r
287     ldsr    lp,1\r
288     ld.w    4[sp],lp                        ; restore EIPC from stack\r
289     ldsr    lp,0\r
290     ld.w    8[sp],lp                        ; restore LP from stack\r
291     add     0x0C,sp                         ; set SP to right position\r
292 \r
293     RETI\r
294 ;------------------------------------------------------------------------------\r
295 #else                                       ; use cooperative kernel mode\r
296 \r
297 MD_INTTM0EQ0:\r
298     prepare {lp,ep},8,sp\r
299     sst.w   r1,4[ep]\r
300     sst.w   r5,0[ep]\r
301     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
302     sld.w   0[ep],r5\r
303     sld.w   4[ep],r1\r
304     dispose 8,{lp,ep}\r
305     RETI\r
306 #endif /* configUSE_PREEMPTION */\r
307 \r
308 ;------------------------------------------------------------------------------\r
309         COMMON INTVEC:CODE:ROOT(2)\r
310         ORG 544\r
311 `??MD_INTTM0EQ0??INTVEC 544`:\r
312         JR MD_INTTM0EQ0\r
313 \r
314         RSEG NEAR_ID:CONST:SORT:NOROOT(2)\r
315 `?<Initializer for usCriticalNesting>`:\r
316         DW 10\r
317 \r
318       COMMON INTVEC:CODE:ROOT(2)\r
319       ORG 40H\r
320 `??vPortYield??INTVEC 40`:\r
321         JR vPortYield\r
322 \r
323 ;------------------------------------------------------------------------------\r
324 ; set microcontroller security ID\r
325 \r
326       COMMON INTVEC:CODE:ROOT(2)\r
327       ORG 70H\r
328 `SECUID`:\r
329       DB CG_SECURITY0\r
330       DB CG_SECURITY1\r
331       DB CG_SECURITY2\r
332       DB CG_SECURITY3\r
333       DB CG_SECURITY4\r
334       DB CG_SECURITY5\r
335       DB CG_SECURITY6\r
336       DB CG_SECURITY7\r
337       DB CG_SECURITY8\r
338       DB CG_SECURITY9\r
339 \r
340 \r
341 ; set microcontroller Option bytes\r
342 \r
343       COMMON INTVEC:CODE:ROOT(2)\r
344       ORG 122\r
345 `OPTBYTES`:\r
346       DB 0xFD\r
347       DB 0xFF\r
348       DB 0xFF\r
349       DB 0xFF\r
350       DB 0xFF\r
351       DB 0xFF\r
352 \r
353 #if configOCD_USAGE == 1\r
354 \r
355       COMMON   INTVEC:CODE:ROOT(4)\r
356       ORG      0x230\r
357       PUBLIC ROM_INT2\r
358 ROM_INT2:\r
359       DB 0xff, 0xff, 0xff, 0xff\r
360       DB 0xff, 0xff, 0xff, 0xff\r
361       DB 0xff, 0xff, 0xff, 0xff\r
362       DB 0xff, 0xff, 0xff, 0xff\r
363 \r
364 \r
365       COMMON   INTVEC:CODE:ROOT(4)\r
366       ORG      0x60\r
367       PUBLIC   ROM_INT\r
368 ROM_INT:\r
369       DB 0xff, 0xff, 0xff, 0xff\r
370       DB 0xff, 0xff, 0xff, 0xff\r
371       DB 0xff, 0xff, 0xff, 0xff\r
372       DB 0xff, 0xff, 0xff, 0xff\r
373 \r
374 #endif /* configOCD_USAGE */\r
375 \r
376       END\r
377 \r