]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm.s85
Update version number in preparation for maintenance release.
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm.s85
1 ;/*\r
2 ;    FreeRTOS V9.0.1 - Copyright (C) 2017 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 640`\r
89         PUBLIC MD_INTTM0EQ0\r
90 \r
91 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
92 `??MD_INTTM0EQ0??INTVEC 640` SYMBOL "??INTVEC 640", 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 640\r
311 `??MD_INTTM0EQ0??INTVEC 640`:\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       END\r
342 \r