]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm_Hx2.s85
Add additional critical section to the default tickless implementations.
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm_Hx2.s85
1 ;/*\r
2 ;    FreeRTOS V7.5.2 - 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    xTaskIncrementTick\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 544`\r
88         PUBLIC MD_INTTM0EQ0\r
89 \r
90 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
91 `??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", 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    xTaskIncrementTick,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    xTaskIncrementTick,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 544\r
310 `??MD_INTTM0EQ0??INTVEC 544`:\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 ; set microcontroller Option bytes\r
341 \r
342       COMMON INTVEC:CODE:ROOT(2)\r
343       ORG 122\r
344 `OPTBYTES`:\r
345       DB 0xFD\r
346       DB 0xFF\r
347       DB 0xFF\r
348       DB 0xFF\r
349       DB 0xFF\r
350       DB 0xFF\r
351 \r
352 #if configOCD_USAGE == 1\r
353 \r
354       COMMON   INTVEC:CODE:ROOT(4)\r
355       ORG      0x230\r
356       PUBLIC ROM_INT2\r
357 ROM_INT2:\r
358       DB 0xff, 0xff, 0xff, 0xff\r
359       DB 0xff, 0xff, 0xff, 0xff\r
360       DB 0xff, 0xff, 0xff, 0xff\r
361       DB 0xff, 0xff, 0xff, 0xff\r
362 \r
363 \r
364       COMMON   INTVEC:CODE:ROOT(4)\r
365       ORG      0x60\r
366       PUBLIC   ROM_INT\r
367 ROM_INT:\r
368       DB 0xff, 0xff, 0xff, 0xff\r
369       DB 0xff, 0xff, 0xff, 0xff\r
370       DB 0xff, 0xff, 0xff, 0xff\r
371       DB 0xff, 0xff, 0xff, 0xff\r
372 \r
373 #endif /* configOCD_USAGE */\r
374 \r
375       END\r
376 \r