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