2 ; FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd.
\r
3 ; All rights reserved
\r
6 ; ***************************************************************************
\r
8 ; * FreeRTOS tutorial books are available in pdf and paperback. *
\r
9 ; * Complete, revised, and edited pdf reference manuals are also *
\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
19 ; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
\r
21 ; * Thank you for using FreeRTOS, and thank you for your support! *
\r
23 ; ***************************************************************************
\r
26 ; This file is part of the FreeRTOS distribution.
\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
43 ; 1 tab == 4 spaces!
\r
45 ; http://www.FreeRTOS.org - Documentation, latest information, license and
\r
48 ; http://www.SafeRTOS.com - A version that is certified for use in safety
\r
51 ; http://www.OpenRTOS.com - Commercial support, development, porting,
\r
52 ; licensing and training services.
\r
54 ; Note: Select the correct include files for the device used by the application.
\r
55 #include "FreeRTOSConfig.h"
\r
56 ;------------------------------------------------------------------------------
\r
58 ; Functions used by scheduler
\r
59 ;------------------------------------------------------------------------------
\r
60 EXTERN vTaskSwitchContext
\r
61 EXTERN xTaskIncrementTick
\r
63 ; Variables used by scheduler
\r
64 ;------------------------------------------------------------------------------
\r
66 EXTERN usCriticalNesting
\r
68 ; Functions implemented in this file
\r
69 ;------------------------------------------------------------------------------
\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
86 ; Tick ISR Prototype
\r
87 ;------------------------------------------------------------------------------
\r
88 PUBWEAK `??MD_INTTM0EQ0??INTVEC 544`
\r
91 MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0"
\r
92 `??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0
\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
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
136 #endif /* configDATA_MODE */
\r
139 MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack
\r
140 ld.w lw1(usCriticalNesting)[r1],r2
\r
142 MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB
\r
143 ld.w lw1(pxCurrentTCB)[r1],r2
\r
146 ;------------------------------------------------------------------------------
\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
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
165 #if configDATA_MODE == 1 ; Using Tiny data model
\r
182 dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
\r
183 #else ; Using Small/Large data model
\r
199 dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
\r
200 #endif /* configDATA_MODE */
\r
202 ;------------------------------------------------------------------------------
\r
204 ;------------------------------------------------------------------------------
\r
205 ; Restore the context of the first task that is going to run.
\r
209 ; Call: CALL vPortStart
\r
212 ;------------------------------------------------------------------------------
\r
215 portRESTORE_CONTEXT ; Restore the context of whichever task the ...
\r
217 ldsr lp,5 ; restore PSW
\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
224 ;------------------------------------------------------------------------------
\r
226 ;------------------------------------------------------------------------------
\r
227 ; Port Yield function to check for a Task switch in the cooperative and
\r
232 ; Call: CALL vPortYield
\r
235 ;------------------------------------------------------------------------------
\r
240 add -0x0C,sp ; prepare stack to save necessary values
\r
241 st.w lp,8[sp] ; store LP to stack
\r
243 st.w lp,4[sp] ; store EIPC to stack
\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
252 ld.w 4[sp],lp ; restore EIPC from stack
\r
254 ld.w 8[sp],lp ; restore LP from stack
\r
255 add 0x0C,sp ; set SP to right position
\r
259 ;------------------------------------------------------------------------------
\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
270 ;------------------------------------------------------------------------------
\r
271 #if configUSE_PREEMPTION == 1 ; use preemptive kernel mode
\r
275 add -0x0C,sp ; prepare stack to save necessary values
\r
276 st.w lp,8[sp] ; store LP to stack
\r
278 st.w lp,4[sp] ; store EIPC to stack
\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
288 ld.w 4[sp],lp ; restore EIPC from stack
\r
290 ld.w 8[sp],lp ; restore LP from stack
\r
291 add 0x0C,sp ; set SP to right position
\r
294 ;------------------------------------------------------------------------------
\r
295 #else ; use cooperative kernel mode
\r
298 prepare {lp,ep},8,sp
\r
301 jarl xTaskIncrementTick,lp ; Call the timer tick function.
\r
306 #endif /* configUSE_PREEMPTION */
\r
308 ;------------------------------------------------------------------------------
\r
309 COMMON INTVEC:CODE:ROOT(2)
\r
311 `??MD_INTTM0EQ0??INTVEC 544`:
\r
314 RSEG NEAR_ID:CONST:SORT:NOROOT(2)
\r
315 `?<Initializer for usCriticalNesting>`:
\r
318 COMMON INTVEC:CODE:ROOT(2)
\r
320 `??vPortYield??INTVEC 40`:
\r
323 ;------------------------------------------------------------------------------
\r
324 ; set microcontroller security ID
\r
326 COMMON INTVEC:CODE:ROOT(2)
\r
341 ; set microcontroller Option bytes
\r
343 COMMON INTVEC:CODE:ROOT(2)
\r
353 #if configOCD_USAGE == 1
\r
355 COMMON INTVEC:CODE:ROOT(4)
\r
359 DB 0xff, 0xff, 0xff, 0xff
\r
360 DB 0xff, 0xff, 0xff, 0xff
\r
361 DB 0xff, 0xff, 0xff, 0xff
\r
362 DB 0xff, 0xff, 0xff, 0xff
\r
365 COMMON INTVEC:CODE:ROOT(4)
\r
369 DB 0xff, 0xff, 0xff, 0xff
\r
370 DB 0xff, 0xff, 0xff, 0xff
\r
371 DB 0xff, 0xff, 0xff, 0xff
\r
372 DB 0xff, 0xff, 0xff, 0xff
\r
374 #endif /* configOCD_USAGE */
\r