2 ; FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
\r
5 ; ***************************************************************************
\r
7 ; * FreeRTOS tutorial books are available in pdf and paperback. *
\r
8 ; * Complete, revised, and edited pdf reference manuals are also *
\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
18 ; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
\r
20 ; * Thank you for using FreeRTOS, and thank you for your support! *
\r
22 ; ***************************************************************************
\r
25 ; This file is part of the FreeRTOS distribution.
\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
42 ; 1 tab == 4 spaces!
\r
44 ; http://www.FreeRTOS.org - Documentation, latest information, license and
\r
47 ; http://www.SafeRTOS.com - A version that is certified for use in safety
\r
50 ; http://www.OpenRTOS.com - Commercial support, development, porting,
\r
51 ; licensing and training services.
\r
53 ; Note: Select the correct include files for the device used by the application.
\r
54 #include "FreeRTOSConfig.h"
\r
55 ;------------------------------------------------------------------------------
\r
57 ; Functions used by scheduler
\r
58 ;------------------------------------------------------------------------------
\r
59 EXTERN vTaskSwitchContext
\r
60 EXTERN vTaskIncrementTick
\r
62 ; Variables used by scheduler
\r
63 ;------------------------------------------------------------------------------
\r
65 EXTERN usCriticalNesting
\r
67 ; Functions implemented in this file
\r
68 ;------------------------------------------------------------------------------
\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
85 ; Tick ISR Prototype
\r
86 ;------------------------------------------------------------------------------
\r
87 PUBWEAK `??MD_INTTM0EQ0??INTVEC 544`
\r
90 MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0"
\r
91 `??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0
\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
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
135 #endif /* configDATA_MODE */
\r
138 MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack
\r
139 ld.w lw1(usCriticalNesting)[r1],r2
\r
141 MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB
\r
142 ld.w lw1(pxCurrentTCB)[r1],r2
\r
145 ;------------------------------------------------------------------------------
\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
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
164 #if configDATA_MODE == 1 ; Using Tiny data model
\r
181 dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
\r
182 #else ; Using Small/Large data model
\r
198 dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
\r
199 #endif /* configDATA_MODE */
\r
201 ;------------------------------------------------------------------------------
\r
203 ;------------------------------------------------------------------------------
\r
204 ; Restore the context of the first task that is going to run.
\r
208 ; Call: CALL vPortStart
\r
211 ;------------------------------------------------------------------------------
\r
214 portRESTORE_CONTEXT ; Restore the context of whichever task the ...
\r
216 ldsr lp,5 ; restore PSW
\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
223 ;------------------------------------------------------------------------------
\r
225 ;------------------------------------------------------------------------------
\r
226 ; Port Yield function to check for a Task switch in the cooperative and
\r
231 ; Call: CALL vPortYield
\r
234 ;------------------------------------------------------------------------------
\r
239 add -0x0C,sp ; prepare stack to save necessary values
\r
240 st.w lp,8[sp] ; store LP to stack
\r
242 st.w lp,4[sp] ; store EIPC to stack
\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
251 ld.w 4[sp],lp ; restore EIPC from stack
\r
253 ld.w 8[sp],lp ; restore LP from stack
\r
254 add 0x0C,sp ; set SP to right position
\r
258 ;------------------------------------------------------------------------------
\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
269 ;------------------------------------------------------------------------------
\r
270 #if configUSE_PREEMPTION == 1 ; use preemptive kernel mode
\r
274 add -0x0C,sp ; prepare stack to save necessary values
\r
275 st.w lp,8[sp] ; store LP to stack
\r
277 st.w lp,4[sp] ; store EIPC to stack
\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 vTaskIncrementTick,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
287 ld.w 4[sp],lp ; restore EIPC from stack
\r
289 ld.w 8[sp],lp ; restore LP from stack
\r
290 add 0x0C,sp ; set SP to right position
\r
293 ;------------------------------------------------------------------------------
\r
294 #else ; use cooperative kernel mode
\r
297 prepare {lp,ep},8,sp
\r
300 jarl vTaskIncrementTick,lp ; Call the timer tick function.
\r
305 #endif /* configUSE_PREEMPTION */
\r
307 ;------------------------------------------------------------------------------
\r
308 COMMON INTVEC:CODE:ROOT(2)
\r
310 `??MD_INTTM0EQ0??INTVEC 544`:
\r
313 RSEG NEAR_ID:CONST:SORT:NOROOT(2)
\r
314 `?<Initializer for usCriticalNesting>`:
\r
317 COMMON INTVEC:CODE:ROOT(2)
\r
319 `??vPortYield??INTVEC 40`:
\r
322 ;------------------------------------------------------------------------------
\r
323 ; set microcontroller security ID
\r
325 COMMON INTVEC:CODE:ROOT(2)
\r
340 ; set microcontroller Option bytes
\r
342 COMMON INTVEC:CODE:ROOT(2)
\r
352 #if configOCD_USAGE == 1
\r
354 COMMON INTVEC:CODE:ROOT(4)
\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
364 COMMON INTVEC:CODE:ROOT(4)
\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
373 #endif /* configOCD_USAGE */
\r