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