]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm_Fx3.s85
Update version number to 9.0.0rc2.
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm_Fx3.s85
1 ;/*\r
2 ;    FreeRTOS V9.0.0rc2 - Copyright (C) 2016 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 ; Option Byte definitions\r
87 ;------------------------------------------------------------------------------\r
88 #define CG_OPTION7A     0x00\r
89 #define CG_OPTION7B     0x04\r
90 #define OPT7C           0x00\r
91 #define OPT7D           0x00\r
92 #define OPT7E           0x00\r
93 #define OPT7F           0x00\r
94 \r
95 ; Tick ISR Prototype\r
96 ;------------------------------------------------------------------------------\r
97         PUBWEAK `??MD_INTTM0EQ0??INTVEC 608`\r
98         PUBLIC MD_INTTM0EQ0\r
99 \r
100 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
101 `??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0\r
102 \r
103 ;------------------------------------------------------------------------------\r
104 ;   portSAVE_CONTEXT MACRO\r
105 ;   Saves the context of the remaining general purpose registers\r
106 ;   and the usCriticalNesting Value of the active Task onto the task stack\r
107 ;   saves stack pointer to the TCB\r
108 ;------------------------------------------------------------------------------\r
109 portSAVE_CONTEXT MACRO\r
110 #if configDATA_MODE == 1                                        ; Using the Tiny data model\r
111     prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers\r
112     sst.w   r19,72[ep]\r
113     sst.w   r18,68[ep]\r
114     sst.w   r17,64[ep]\r
115     sst.w   r16,60[ep]\r
116     sst.w   r15,56[ep]\r
117     sst.w   r14,52[ep]\r
118     sst.w   r13,48[ep]\r
119     sst.w   r12,44[ep]\r
120     sst.w   r11,40[ep]\r
121     sst.w   r10,36[ep]\r
122     sst.w   r9,32[ep]\r
123     sst.w   r8,28[ep]\r
124     sst.w   r7,24[ep]\r
125     sst.w   r6,20[ep]\r
126     sst.w   r5,16[ep]\r
127     sst.w   r4,12[ep]\r
128 #else                                                           ; Using the Small/Large data model\r
129     prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers\r
130     sst.w   r19,68[ep]\r
131     sst.w   r18,64[ep]\r
132     sst.w   r17,60[ep]\r
133     sst.w   r16,56[ep]\r
134     sst.w   r15,52[ep]\r
135     sst.w   r14,48[ep]\r
136     sst.w   r13,44[ep]\r
137     sst.w   r12,40[ep]\r
138     sst.w   r11,36[ep]\r
139     sst.w   r10,32[ep]\r
140     sst.w   r9,28[ep]\r
141     sst.w   r8,24[ep]\r
142     sst.w   r7,20[ep]\r
143     sst.w   r6,16[ep]\r
144     sst.w   r5,12[ep]\r
145 #endif /* configDATA_MODE */\r
146     sst.w   r2,8[ep]\r
147     sst.w   r1,4[ep]\r
148     MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack\r
149     ld.w    lw1(usCriticalNesting)[r1],r2\r
150     sst.w   r2,0[ep]\r
151     MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB\r
152     ld.w    lw1(pxCurrentTCB)[r1],r2\r
153     st.w    sp,0[r2]\r
154     ENDM\r
155 ;------------------------------------------------------------------------------\r
156 \r
157 ;------------------------------------------------------------------------------\r
158 ;   portRESTORE_CONTEXT MACRO\r
159 ;   Gets stack pointer from the current TCB\r
160 ;   Restores the context of the usCriticalNesting value and general purpose\r
161 ;   registers of the selected task from the task stack\r
162 ;------------------------------------------------------------------------------\r
163 portRESTORE_CONTEXT MACRO\r
164     MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address\r
165     ld.w    lw1(pxCurrentTCB)[r1],sp\r
166     MOV     sp,r1\r
167     ld.w    0[r1],sp                        ; load stackpointer\r
168     MOV     sp,ep                           ; set stack pointer to element pointer\r
169     sld.w   0[ep],r1                        ; load usCriticalNesting value from stack\r
170     MOVHI   hi1(usCriticalNesting),r0,r2\r
171     st.w    r1,lw1(usCriticalNesting)[r2]\r
172     sld.w   4[ep],r1                        ; restore general purpose registers\r
173     sld.w   8[ep],r2\r
174 #if configDATA_MODE == 1                    ; Using Tiny data model\r
175     sld.w   12[ep],r4\r
176     sld.w   16[ep],r5\r
177     sld.w   20[ep],r6\r
178     sld.w   24[ep],r7\r
179     sld.w   28[ep],r8\r
180     sld.w   32[ep],r9\r
181     sld.w   36[ep],r10\r
182     sld.w   40[ep],r11\r
183     sld.w   44[ep],r12\r
184     sld.w   48[ep],r13\r
185     sld.w   52[ep],r14\r
186     sld.w   56[ep],r15\r
187     sld.w   60[ep],r16\r
188     sld.w   64[ep],r17\r
189     sld.w   68[ep],r18\r
190     sld.w   72[ep],r19\r
191     dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}\r
192 #else                                       ; Using Small/Large data model\r
193     sld.w   12[ep],r5\r
194     sld.w   16[ep],r6\r
195     sld.w   20[ep],r7\r
196     sld.w   24[ep],r8\r
197     sld.w   28[ep],r9\r
198     sld.w   32[ep],r10\r
199     sld.w   36[ep],r11\r
200     sld.w   40[ep],r12\r
201     sld.w   44[ep],r13\r
202     sld.w   48[ep],r14\r
203     sld.w   52[ep],r15\r
204     sld.w   56[ep],r16\r
205     sld.w   60[ep],r17\r
206     sld.w   64[ep],r18\r
207     sld.w   68[ep],r19\r
208     dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}\r
209 #endif /* configDATA_MODE */\r
210     ENDM\r
211 ;------------------------------------------------------------------------------\r
212 \r
213 ;------------------------------------------------------------------------------\r
214 ;   Restore the context of the first task that is going to run.\r
215 ;\r
216 ;   Input:  NONE\r
217 ;\r
218 ;   Call:   CALL    vPortStart\r
219 ;\r
220 ;   Output: NONE\r
221 ;------------------------------------------------------------------------------ \r
222     RSEG CODE:CODE\r
223 vPortStart:\r
224     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
225     ld.w    0[sp],lp\r
226     ldsr    lp,5                            ; restore PSW\r
227     DI\r
228     ld.w    4[sp],lp                        ; restore LP\r
229     ld.w    8[sp],lp                        ; restore LP\r
230     ADD     0x0C,sp                         ; set SP to right position\r
231     EI\r
232     jmp     [lp]\r
233 ;------------------------------------------------------------------------------\r
234 \r
235 ;------------------------------------------------------------------------------\r
236 ;   Port Yield function to check for a Task switch in the cooperative and\r
237 ;   preemptive mode\r
238 ;\r
239 ;   Input:  NONE\r
240 ;\r
241 ;   Call:   CALL    vPortYield\r
242 ;\r
243 ;   Output: NONE\r
244 ;------------------------------------------------------------------------------\r
245 \r
246         RSEG CODE:CODE\r
247 vPortYield:\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    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 ;------------------------------------------------------------------------------\r
269 \r
270 ;------------------------------------------------------------------------------\r
271 ;   Perform the necessary steps of the Tick Count Increment and Task Switch\r
272 ;   depending on the chosen kernel configuration\r
273 ;\r
274 ;   Input:  NONE\r
275 ;\r
276 ;   Call:   ISR\r
277 ;\r
278 ;   Output: NONE\r
279 ;------------------------------------------------------------------------------ \r
280 #if configUSE_PREEMPTION == 1               ; use preemptive kernel mode\r
281 \r
282 MD_INTTM0EQ0:\r
283 \r
284     add     -0x0C,sp                          ; prepare stack to save necessary values\r
285     st.w    lp,8[sp]                        ; store LP to stack\r
286     stsr    0,r31\r
287     st.w    lp,4[sp]                        ; store EIPC to stack\r
288     stsr    1,lp\r
289     st.w    lp,0[sp]                        ; store EIPSW to stack\r
290     portSAVE_CONTEXT                        ; Save the context of the current task.\r
291     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
292     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
293     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
294                                             ; ... scheduler decided should run.\r
295     ld.w    0[sp],lp                        ; restore EIPSW from stack\r
296     ldsr    lp,1\r
297     ld.w    4[sp],lp                        ; restore EIPC from stack\r
298     ldsr    lp,0\r
299     ld.w    8[sp],lp                        ; restore LP from stack\r
300     add     0x0C,sp                         ; set SP to right position\r
301 \r
302     RETI\r
303 ;------------------------------------------------------------------------------\r
304 #else                                       ; use cooperative kernel mode\r
305 \r
306 MD_INTTM0EQ0:\r
307     prepare {lp,ep},8,sp\r
308     sst.w   r1,4[ep]\r
309     sst.w   r5,0[ep]\r
310     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
311     sld.w   0[ep],r5\r
312     sld.w   4[ep],r1\r
313     dispose 8,{lp,ep}\r
314     RETI\r
315 #endif /* configUSE_PREEMPTION */\r
316 \r
317 ;------------------------------------------------------------------------------\r
318         COMMON INTVEC:CODE:ROOT(2)\r
319         ORG 608\r
320 `??MD_INTTM0EQ0??INTVEC 608`:\r
321         JR MD_INTTM0EQ0\r
322 \r
323         RSEG NEAR_ID:CONST:SORT:NOROOT(2)\r
324 `?<Initializer for usCriticalNesting>`:\r
325         DW 10\r
326 \r
327       COMMON INTVEC:CODE:ROOT(2)\r
328       ORG 40H\r
329 `??vPortYield??INTVEC 40`:\r
330         JR vPortYield\r
331 \r
332 ;------------------------------------------------------------------------------\r
333 ; set microcontroller security ID\r
334 \r
335       COMMON INTVEC:CODE:ROOT(2)\r
336       ORG 70H\r
337 `SECUID`:\r
338       DB CG_SECURITY0\r
339       DB CG_SECURITY1\r
340       DB CG_SECURITY2\r
341       DB CG_SECURITY3\r
342       DB CG_SECURITY4\r
343       DB CG_SECURITY5\r
344       DB CG_SECURITY6\r
345       DB CG_SECURITY7\r
346       DB CG_SECURITY8\r
347       DB CG_SECURITY9\r
348 \r
349 ;------------------------------------------------------------------------------\r
350 ; set microcontroller option bytes\r
351 \r
352       COMMON INTVEC:CODE:ROOT(2)\r
353       ORG 7AH\r
354 `OPTBYTES`:\r
355       DB CG_OPTION7A\r
356       DB CG_OPTION7B\r
357       DB OPT7C\r
358       DB OPT7D\r
359       DB OPT7E\r
360       DB OPT7F\r
361 \r
362       END