2 ; * FreeRTOS Kernel V10.4.4
3 ; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5 ; * SPDX-License-Identifier: MIT
7 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 ; * this software and associated documentation files (the "Software"), to deal in
9 ; * the Software without restriction, including without limitation the rights to
10 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 ; * the Software, and to permit persons to whom the Software is furnished to do so,
12 ; * subject to the following conditions:
14 ; * The above copyright notice and this permission notice shall be included in all
15 ; * copies or substantial portions of the Software.
17 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 ; * https://www.FreeRTOS.org
25 ; * https://github.com/FreeRTOS
31 IMPORT vTaskSwitchContext
32 IMPORT xTaskIncrementTick
34 EXPORT vPortYieldProcessor
35 EXPORT vPortStartFirstTask
36 EXPORT vPreemptiveTick
40 VICVECTADDR EQU 0xFFFFF030
42 T0MATCHBIT EQU 0x00000001
45 AREA PORT_ASM, CODE, READONLY
49 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50 ; Starting the first task is done by just restoring the context
51 ; setup by pxPortInitialiseStack
52 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
66 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
67 ; Interrupt service routine for the SWI interrupt. The vector table is
68 ; configured in the startup.s file.
70 ; vPortYieldProcessor() is used to manually force a context switch. The
71 ; SWI interrupt is generated by a call to taskYIELD() or portYIELD().
72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78 ; Within an IRQ ISR the link register has an offset from the true return
79 ; address, but an SWI ISR does not. Add the offset manually so the same
80 ; ISR return code can be used in both cases.
83 ; Perform the context switch.
84 portSAVE_CONTEXT ; Save current task context
85 LDR R0, =vTaskSwitchContext ; Get the address of the context switch function
86 MOV LR, PC ; Store the return address
87 BX R0 ; Call the contedxt switch function
88 portRESTORE_CONTEXT ; restore the context of the selected task
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93 ; Interrupt service routine for preemptive scheduler tick timer
94 ; Only used if portUSE_PREEMPTION is set to 1 in portmacro.h
96 ; Uses timer 0 of LPC21XX Family
97 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 portSAVE_CONTEXT ; Save the context of the current task.
105 LDR R0, =xTaskIncrementTick ; Increment the tick count.
106 MOV LR, PC ; This may make a delayed task ready
110 BEQ SkipContextSwitch
111 LDR R0, =vTaskSwitchContext ; Find the highest priority task that
112 MOV LR, PC ; is ready to run.
115 MOV R0, #T0MATCHBIT ; Clear the timer event
119 LDR R0, =VICVECTADDR ; Acknowledge the interrupt
122 portRESTORE_CONTEXT ; Restore the context of the highest
123 ; priority task that is ready to run.