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
44 ***************************************************************************
\r
46 * Having a problem? Start by reading the FAQ "My application does *
\r
47 * not run, what could be wrong? *
\r
49 * http://www.FreeRTOS.org/FAQHelp.html *
\r
51 ***************************************************************************
\r
54 http://www.FreeRTOS.org - Documentation, training, latest information,
\r
55 license and contact details.
\r
57 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
\r
58 including FreeRTOS+Trace - an indispensable productivity tool.
\r
60 Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
\r
61 the code with commercial support, indemnification, and middleware, under
\r
62 the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
\r
63 provide a safety engineered and independently SIL3 certified version under
\r
64 the SafeRTOS brand: http://www.SafeRTOS.com.
\r
67 .extern vTaskSwitchContext
\r
71 # Exported to start the first task.
\r
72 .globl restore_sp_from_pxCurrentTCB
\r
74 # Entry point for exceptions.
\r
75 .section .exceptions.entry, "xa"
\r
77 # Save the entire context of a task.
\r
79 addi ea, ea, -4 # Point to the next instruction.
\r
80 addi sp, sp, -116 # Create space on the stack.
\r
82 # Leave a gap for muldiv 0
\r
98 rdctl r5, estatus # Save the eStatus
\r
100 stw ea, 72(sp) # Save the PC
\r
101 stw r16, 76(sp) # Save the remaining registers
\r
112 save_sp_to_pxCurrentTCB:
\r
113 movia et, pxCurrentTCB # Load the address of the pxCurrentTCB pointer
\r
114 ldw et, (et) # Load the value of the pxCurrentTCB pointer
\r
115 stw sp, (et) # Store the stack pointer into the top of the TCB
\r
117 .section .exceptions.irqtest, "xa"
\r
120 * Test to see if the exception was a software exception or caused
\r
121 * by an external interrupt, and vector accordingly.
\r
123 rdctl r4, ipending # Load the Pending Interrupts indication
\r
124 rdctl r5, estatus # Load the eStatus (enabled interrupts).
\r
125 andi r2, r5, 1 # Are interrupts enabled globally.
\r
126 beq r2, zero, soft_exceptions # Interrupts are not enabled.
\r
127 beq r4, zero, soft_exceptions # There are no interrupts triggered.
\r
129 .section .exceptions.irqhandler, "xa"
\r
131 call alt_irq_handler # Call the alt_irq_handler to deliver to the registered interrupt handler.
\r
133 .section .exceptions.irqreturn, "xa"
\r
134 restore_sp_from_pxCurrentTCB:
\r
135 movia et, pxCurrentTCB # Load the address of the pxCurrentTCB pointer
\r
136 ldw et, (et) # Load the value of the pxCurrentTCB pointer
\r
137 ldw sp, (et) # Load the stack pointer with the top value of the TCB
\r
140 ldw ra, 0(sp) # Restore the registers.
\r
141 # Leave a gap for muldiv 0.
\r
157 ldw et, 68(sp) # Load the eStatus
\r
158 wrctl estatus, et # Write the eStatus
\r
159 ldw ea, 72(sp) # Load the Program Counter
\r
170 addi sp, sp, 116 # Release stack space
\r
172 eret # Return to address ea, loading eStatus into Status.
\r
174 .section .exceptions.soft, "xa"
\r
176 ldw et, 0(ea) # Load the instruction where the interrupt occured.
\r
177 movhi at, %hi(0x003B683A) # Load the registers with the trap instruction code
\r
178 ori at, at, %lo(0x003B683A)
\r
179 cmpne et, et, at # Compare the trap instruction code to the last excuted instruction
\r
180 beq et, r0, call_scheduler # its a trap so switchcontext
\r
181 break # This is an un-implemented instruction or muldiv problem.
\r
182 br restore_context # its something else
\r
185 addi ea, ea, 4 # A trap was called, increment the program counter so it is not called again.
\r
186 stw ea, 72(sp) # Save the new program counter to the context.
\r
187 call vTaskSwitchContext # Pick the next context.
\r
188 br restore_sp_from_pxCurrentTCB # Switch in the task context and restore.
\r