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