123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- ;/*
- ; FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- ; All rights reserved
- ;
- ;
- ; ***************************************************************************
- ; * *
- ; * FreeRTOS tutorial books are available in pdf and paperback. *
- ; * Complete, revised, and edited pdf reference manuals are also *
- ; * available. *
- ; * *
- ; * Purchasing FreeRTOS documentation will not only help you, by *
- ; * ensuring you get running as quickly as possible and with an *
- ; * in-depth knowledge of how to use FreeRTOS, it will also help *
- ; * the FreeRTOS project to continue with its mission of providing *
- ; * professional grade, cross platform, de facto standard solutions *
- ; * for microcontrollers - completely free of charge! *
- ; * *
- ; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
- ; * *
- ; * Thank you for using FreeRTOS, and thank you for your support! *
- ; * *
- ; ***************************************************************************
- ;
- ;
- ; This file is part of the FreeRTOS distribution.
- ;
- ; FreeRTOS is free software; you can redistribute it and/or modify it under
- ; the terms of the GNU General Public License (version 2) as published by the
- ; Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
- ; >>>NOTE<<< The modification to the GPL is included to allow you to
- ; distribute a combined work that includes FreeRTOS without being obliged to
- ; provide the source code for proprietary components outside of the FreeRTOS
- ; kernel. FreeRTOS is distributed in the hope that it will be useful, but
- ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- ; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- ; more details. You should have received a copy of the GNU General Public
- ; License and the FreeRTOS license exception along with FreeRTOS; if not it
- ; can be viewed here: http://www.freertos.org/a00114.html and also obtained
- ; by writing to Richard Barry, contact details for whom are available on the
- ; FreeRTOS WEB site.
- ;
- ; 1 tab == 4 spaces!
- ;
- ; http://www.FreeRTOS.org - Documentation, latest information, license and
- ; contact details.
- ;
- ; http://www.SafeRTOS.com - A version that is certified for use in safety
- ; critical systems.
- ;
- ; http://www.OpenRTOS.com - Commercial support, development, porting,
- ; licensing and training services.
- ;*/
- INCLUDE portmacro.inc
- IMPORT vApplicationIRQHandler
- IMPORT vTaskSwitchContext
- IMPORT ulPortYieldRequired
- IMPORT ulPortInterruptNesting
- IMPORT vTaskSwitchContext
- IMPORT ulICCIAR
- IMPORT ulICCEOIR
- EXPORT FreeRTOS_SWI_Handler
- EXPORT FreeRTOS_IRQ_Handler
- EXPORT vPortRestoreTaskContext
- ARM
- AREA PORT_ASM, CODE, READONLY
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; SVC handler is used to yield a task.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- FreeRTOS_SWI_Handler
- PRESERVE8
- ; Save the context of the current task and select a new task to run.
- portSAVE_CONTEXT
- LDR R0, =vTaskSwitchContext
- BLX R0
- portRESTORE_CONTEXT
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; vPortRestoreTaskContext is used to start the scheduler.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- vPortRestoreTaskContext
- ; Switch to system mode
- CPS #SYS_MODE
- portRESTORE_CONTEXT
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; PL390 GIC interrupt handler
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- FreeRTOS_IRQ_Handler
- ; Return to the interrupted instruction.
- SUB lr, lr, #4
- ; Push the return address and SPSR
- PUSH {lr}
- MRS lr, SPSR
- PUSH {lr}
- ; Change to supervisor mode to allow reentry.
- CPS #SVC_MODE
- ; Push used registers.
- PUSH {r0-r4, r12}
- ; Increment nesting count. r3 holds the address of ulPortInterruptNesting
- ; for future use. r1 holds the original ulPortInterruptNesting value for
- ; future use.
- LDR r3, =ulPortInterruptNesting
- LDR r1, [r3]
- ADD r4, r1, #1
- STR r4, [r3]
- ; Read value from the interrupt acknowledge register, which is stored in r0
- ; for future parameter and interrupt clearing use.
- LDR r2, =ulICCIAR
- LDR r0, [r2]
- ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for
- ; future use.
- MOV r2, sp
- AND r2, r2, #4
- SUB sp, sp, r2
- ; Call the interrupt handler
- PUSH {r0-r3, lr}
- LDR r1, =vApplicationIRQHandler
- BLX r1
- POP {r0-r3, lr}
- ADD sp, sp, r2
- CPSID i
- ; Write the value read from ICCIAR to ICCEOIR
- LDR r4, =ulICCEOIR
- STR r0, [r4]
- ; Restore the old nesting count
- STR r1, [r3]
- ; A context switch is never performed if the nesting count is not 0
- CMP r1, #0
- BNE exit_without_switch
- ; Did the interrupt request a context switch? r1 holds the address of
- ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future
- ; use.
- LDR r1, =ulPortYieldRequired
- LDR r0, [r1]
- CMP r0, #0
- BNE switch_before_exit
- exit_without_switch
- ; No context switch. Restore used registers, LR_irq and SPSR before
- ; returning.
- POP {r0-r4, r12}
- CPS #IRQ_MODE
- POP {LR}
- MSR SPSR_cxsf, LR
- POP {LR}
- MOVS PC, LR
- switch_before_exit
- ; A context swtich is to be performed. Clear the context switch pending
- ; flag.
- MOV r0, #0
- STR r0, [r1]
- ; Restore used registers, LR-irq and SPSR before saving the context
- ; to the task stack.
- POP {r0-r4, r12}
- CPS #IRQ_MODE
- POP {LR}
- MSR SPSR_cxsf, LR
- POP {LR}
- portSAVE_CONTEXT
- ; Call the function that selects the new task to execute.
- ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD
- ; instructions, or 8 byte aligned stack allocated data. LR does not need
- ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway.
- LDR r0, =vTaskSwitchContext
- BLX r0
- ; Restore the context of, and branch to, the task selected to execute next.
- portRESTORE_CONTEXT
- END
|