]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/V850ES/portasm_Fx3.s85
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Source / portable / IAR / V850ES / portasm_Fx3.s85
1 ;/*\r
2 ; * FreeRTOS Kernel V10.0.0\r
3 ; * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4 ; *\r
5 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6 ; * this software and associated documentation files (the "Software"), to deal in\r
7 ; * the Software without restriction, including without limitation the rights to\r
8 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9 ; * the Software, and to permit persons to whom the Software is furnished to do so,\r
10 ; * subject to the following conditions:\r
11 ; *\r
12 ; * The above copyright notice and this permission notice shall be included in all\r
13 ; * copies or substantial portions of the Software. If you wish to use our Amazon\r
14 ; * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15 ; *\r
16 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22 ; *\r
23 ; * http://www.FreeRTOS.org\r
24 ; * http://aws.amazon.com/freertos\r
25 ; *\r
26 ; * 1 tab == 4 spaces!\r
27 ; */\r
28 ; Note: Select the correct include files for the device used by the application.\r
29 #include "FreeRTOSConfig.h"\r
30 ;------------------------------------------------------------------------------\r
31 \r
32 ; Functions used by scheduler\r
33 ;------------------------------------------------------------------------------\r
34     EXTERN    vTaskSwitchContext\r
35     EXTERN    xTaskIncrementTick\r
36 \r
37 ; Variables used by scheduler\r
38 ;------------------------------------------------------------------------------\r
39     EXTERN    pxCurrentTCB\r
40     EXTERN    usCriticalNesting\r
41 \r
42 ; Functions implemented in this file\r
43 ;------------------------------------------------------------------------------\r
44     PUBLIC    vPortYield\r
45     PUBLIC    vPortStart\r
46 \r
47 ; Security ID definition\r
48 ;------------------------------------------------------------------------------\r
49 #define CG_SECURITY0    0FFH\r
50 #define CG_SECURITY1    0FFH\r
51 #define CG_SECURITY2    0FFH\r
52 #define CG_SECURITY3    0FFH\r
53 #define CG_SECURITY4    0FFH\r
54 #define CG_SECURITY5    0FFH\r
55 #define CG_SECURITY6    0FFH\r
56 #define CG_SECURITY7    0FFH\r
57 #define CG_SECURITY8    0FFH\r
58 #define CG_SECURITY9    0FFH\r
59 \r
60 ; Option Byte definitions\r
61 ;------------------------------------------------------------------------------\r
62 #define CG_OPTION7A     0x00\r
63 #define CG_OPTION7B     0x04\r
64 #define OPT7C           0x00\r
65 #define OPT7D           0x00\r
66 #define OPT7E           0x00\r
67 #define OPT7F           0x00\r
68 \r
69 ; Tick ISR Prototype\r
70 ;------------------------------------------------------------------------------\r
71         PUBWEAK `??MD_INTTM0EQ0??INTVEC 608`\r
72         PUBLIC MD_INTTM0EQ0\r
73 \r
74 MD_INTTM0EQ0        SYMBOL "MD_INTTM0EQ0"\r
75 `??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0\r
76 \r
77 ;------------------------------------------------------------------------------\r
78 ;   portSAVE_CONTEXT MACRO\r
79 ;   Saves the context of the remaining general purpose registers\r
80 ;   and the usCriticalNesting Value of the active Task onto the task stack\r
81 ;   saves stack pointer to the TCB\r
82 ;------------------------------------------------------------------------------\r
83 portSAVE_CONTEXT MACRO\r
84 #if configDATA_MODE == 1                                        ; Using the Tiny data model\r
85     prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers\r
86     sst.w   r19,72[ep]\r
87     sst.w   r18,68[ep]\r
88     sst.w   r17,64[ep]\r
89     sst.w   r16,60[ep]\r
90     sst.w   r15,56[ep]\r
91     sst.w   r14,52[ep]\r
92     sst.w   r13,48[ep]\r
93     sst.w   r12,44[ep]\r
94     sst.w   r11,40[ep]\r
95     sst.w   r10,36[ep]\r
96     sst.w   r9,32[ep]\r
97     sst.w   r8,28[ep]\r
98     sst.w   r7,24[ep]\r
99     sst.w   r6,20[ep]\r
100     sst.w   r5,16[ep]\r
101     sst.w   r4,12[ep]\r
102 #else                                                           ; Using the Small/Large data model\r
103     prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers\r
104     sst.w   r19,68[ep]\r
105     sst.w   r18,64[ep]\r
106     sst.w   r17,60[ep]\r
107     sst.w   r16,56[ep]\r
108     sst.w   r15,52[ep]\r
109     sst.w   r14,48[ep]\r
110     sst.w   r13,44[ep]\r
111     sst.w   r12,40[ep]\r
112     sst.w   r11,36[ep]\r
113     sst.w   r10,32[ep]\r
114     sst.w   r9,28[ep]\r
115     sst.w   r8,24[ep]\r
116     sst.w   r7,20[ep]\r
117     sst.w   r6,16[ep]\r
118     sst.w   r5,12[ep]\r
119 #endif /* configDATA_MODE */\r
120     sst.w   r2,8[ep]\r
121     sst.w   r1,4[ep]\r
122     MOVHI   hi1(usCriticalNesting),r0,r1                        ; save usCriticalNesting value to stack\r
123     ld.w    lw1(usCriticalNesting)[r1],r2\r
124     sst.w   r2,0[ep]\r
125     MOVHI   hi1(pxCurrentTCB),r0,r1                             ; save SP to top of current TCB\r
126     ld.w    lw1(pxCurrentTCB)[r1],r2\r
127     st.w    sp,0[r2]\r
128     ENDM\r
129 ;------------------------------------------------------------------------------\r
130 \r
131 ;------------------------------------------------------------------------------\r
132 ;   portRESTORE_CONTEXT MACRO\r
133 ;   Gets stack pointer from the current TCB\r
134 ;   Restores the context of the usCriticalNesting value and general purpose\r
135 ;   registers of the selected task from the task stack\r
136 ;------------------------------------------------------------------------------\r
137 portRESTORE_CONTEXT MACRO\r
138     MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address\r
139     ld.w    lw1(pxCurrentTCB)[r1],sp\r
140     MOV     sp,r1\r
141     ld.w    0[r1],sp                        ; load stackpointer\r
142     MOV     sp,ep                           ; set stack pointer to element pointer\r
143     sld.w   0[ep],r1                        ; load usCriticalNesting value from stack\r
144     MOVHI   hi1(usCriticalNesting),r0,r2\r
145     st.w    r1,lw1(usCriticalNesting)[r2]\r
146     sld.w   4[ep],r1                        ; restore general purpose registers\r
147     sld.w   8[ep],r2\r
148 #if configDATA_MODE == 1                    ; Using Tiny data model\r
149     sld.w   12[ep],r4\r
150     sld.w   16[ep],r5\r
151     sld.w   20[ep],r6\r
152     sld.w   24[ep],r7\r
153     sld.w   28[ep],r8\r
154     sld.w   32[ep],r9\r
155     sld.w   36[ep],r10\r
156     sld.w   40[ep],r11\r
157     sld.w   44[ep],r12\r
158     sld.w   48[ep],r13\r
159     sld.w   52[ep],r14\r
160     sld.w   56[ep],r15\r
161     sld.w   60[ep],r16\r
162     sld.w   64[ep],r17\r
163     sld.w   68[ep],r18\r
164     sld.w   72[ep],r19\r
165     dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}\r
166 #else                                       ; Using Small/Large data model\r
167     sld.w   12[ep],r5\r
168     sld.w   16[ep],r6\r
169     sld.w   20[ep],r7\r
170     sld.w   24[ep],r8\r
171     sld.w   28[ep],r9\r
172     sld.w   32[ep],r10\r
173     sld.w   36[ep],r11\r
174     sld.w   40[ep],r12\r
175     sld.w   44[ep],r13\r
176     sld.w   48[ep],r14\r
177     sld.w   52[ep],r15\r
178     sld.w   56[ep],r16\r
179     sld.w   60[ep],r17\r
180     sld.w   64[ep],r18\r
181     sld.w   68[ep],r19\r
182     dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}\r
183 #endif /* configDATA_MODE */\r
184     ENDM\r
185 ;------------------------------------------------------------------------------\r
186 \r
187 ;------------------------------------------------------------------------------\r
188 ;   Restore the context of the first task that is going to run.\r
189 ;\r
190 ;   Input:  NONE\r
191 ;\r
192 ;   Call:   CALL    vPortStart\r
193 ;\r
194 ;   Output: NONE\r
195 ;------------------------------------------------------------------------------\r
196     RSEG CODE:CODE\r
197 vPortStart:\r
198     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
199     ld.w    0[sp],lp\r
200     ldsr    lp,5                            ; restore PSW\r
201     DI\r
202     ld.w    4[sp],lp                        ; restore LP\r
203     ld.w    8[sp],lp                        ; restore LP\r
204     ADD     0x0C,sp                         ; set SP to right position\r
205     EI\r
206     jmp     [lp]\r
207 ;------------------------------------------------------------------------------\r
208 \r
209 ;------------------------------------------------------------------------------\r
210 ;   Port Yield function to check for a Task switch in the cooperative and\r
211 ;   preemptive mode\r
212 ;\r
213 ;   Input:  NONE\r
214 ;\r
215 ;   Call:   CALL    vPortYield\r
216 ;\r
217 ;   Output: NONE\r
218 ;------------------------------------------------------------------------------\r
219 \r
220         RSEG CODE:CODE\r
221 vPortYield:\r
222 \r
223     add     -0x0C,sp                          ; prepare stack to save necessary values\r
224     st.w    lp,8[sp]                        ; store LP to stack\r
225     stsr    0,r31\r
226     st.w    lp,4[sp]                        ; store EIPC to stack\r
227     stsr    1,lp\r
228     st.w    lp,0[sp]                        ; store EIPSW to stack\r
229     portSAVE_CONTEXT                        ; Save the context of the current task.\r
230     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
231     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
232                                             ; ... scheduler decided should run.\r
233         ld.w    0[sp],lp                        ; restore EIPSW from stack\r
234     ldsr    lp,1\r
235     ld.w    4[sp],lp                        ; restore EIPC from stack\r
236     ldsr    lp,0\r
237     ld.w    8[sp],lp                        ; restore LP from stack\r
238     add     0x0C,sp                         ; set SP to right position\r
239 \r
240     RETI\r
241 \r
242 ;------------------------------------------------------------------------------\r
243 \r
244 ;------------------------------------------------------------------------------\r
245 ;   Perform the necessary steps of the Tick Count Increment and Task Switch\r
246 ;   depending on the chosen kernel configuration\r
247 ;\r
248 ;   Input:  NONE\r
249 ;\r
250 ;   Call:   ISR\r
251 ;\r
252 ;   Output: NONE\r
253 ;------------------------------------------------------------------------------\r
254 #if configUSE_PREEMPTION == 1               ; use preemptive kernel mode\r
255 \r
256 MD_INTTM0EQ0:\r
257 \r
258     add     -0x0C,sp                          ; prepare stack to save necessary values\r
259     st.w    lp,8[sp]                        ; store LP to stack\r
260     stsr    0,r31\r
261     st.w    lp,4[sp]                        ; store EIPC to stack\r
262     stsr    1,lp\r
263     st.w    lp,0[sp]                        ; store EIPSW to stack\r
264     portSAVE_CONTEXT                        ; Save the context of the current task.\r
265     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
266     jarl    vTaskSwitchContext,lp           ; Call the scheduler.\r
267     portRESTORE_CONTEXT                     ; Restore the context of whichever task the ...\r
268                                             ; ... scheduler decided should run.\r
269     ld.w    0[sp],lp                        ; restore EIPSW from stack\r
270     ldsr    lp,1\r
271     ld.w    4[sp],lp                        ; restore EIPC from stack\r
272     ldsr    lp,0\r
273     ld.w    8[sp],lp                        ; restore LP from stack\r
274     add     0x0C,sp                         ; set SP to right position\r
275 \r
276     RETI\r
277 ;------------------------------------------------------------------------------\r
278 #else                                       ; use cooperative kernel mode\r
279 \r
280 MD_INTTM0EQ0:\r
281     prepare {lp,ep},8,sp\r
282     sst.w   r1,4[ep]\r
283     sst.w   r5,0[ep]\r
284     jarl    xTaskIncrementTick,lp           ; Call the timer tick function.\r
285     sld.w   0[ep],r5\r
286     sld.w   4[ep],r1\r
287     dispose 8,{lp,ep}\r
288     RETI\r
289 #endif /* configUSE_PREEMPTION */\r
290 \r
291 ;------------------------------------------------------------------------------\r
292         COMMON INTVEC:CODE:ROOT(2)\r
293         ORG 608\r
294 `??MD_INTTM0EQ0??INTVEC 608`:\r
295         JR MD_INTTM0EQ0\r
296 \r
297         RSEG NEAR_ID:CONST:SORT:NOROOT(2)\r
298 `?<Initializer for usCriticalNesting>`:\r
299         DW 10\r
300 \r
301       COMMON INTVEC:CODE:ROOT(2)\r
302       ORG 40H\r
303 `??vPortYield??INTVEC 40`:\r
304         JR vPortYield\r
305 \r
306 ;------------------------------------------------------------------------------\r
307 ; set microcontroller security ID\r
308 \r
309       COMMON INTVEC:CODE:ROOT(2)\r
310       ORG 70H\r
311 `SECUID`:\r
312       DB CG_SECURITY0\r
313       DB CG_SECURITY1\r
314       DB CG_SECURITY2\r
315       DB CG_SECURITY3\r
316       DB CG_SECURITY4\r
317       DB CG_SECURITY5\r
318       DB CG_SECURITY6\r
319       DB CG_SECURITY7\r
320       DB CG_SECURITY8\r
321       DB CG_SECURITY9\r
322 \r
323 ;------------------------------------------------------------------------------\r
324 ; set microcontroller option bytes\r
325 \r
326       COMMON INTVEC:CODE:ROOT(2)\r
327       ORG 7AH\r
328 `OPTBYTES`:\r
329       DB CG_OPTION7A\r
330       DB CG_OPTION7B\r
331       DB OPT7C\r
332       DB OPT7D\r
333       DB OPT7E\r
334       DB OPT7F\r
335 \r
336       END