1;/* 2; * FreeRTOS Kernel V10.6.2 3; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. 4; * 5; * SPDX-License-Identifier: MIT 6; * 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: 13; * 14; * The above copyright notice and this permission notice shall be included in all 15; * copies or substantial portions of the Software. 16; * 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. 23; * 24; * https://www.FreeRTOS.org 25; * https://github.com/FreeRTOS 26; * 27; */ 28 29 INCLUDE portmacro.inc 30 31 IMPORT vTaskSwitchContext 32 IMPORT xTaskIncrementTick 33 34 EXPORT vPortYieldProcessor 35 EXPORT vPortStartFirstTask 36 EXPORT vPreemptiveTick 37 EXPORT vPortYield 38 39 40VICVECTADDR EQU 0xFFFFF030 41T0IR EQU 0xE0004000 42T0MATCHBIT EQU 0x00000001 43 44 ARM 45 AREA PORT_ASM, CODE, READONLY 46 47 48 49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 50; Starting the first task is done by just restoring the context 51; setup by pxPortInitialiseStack 52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 53vPortStartFirstTask 54 55 PRESERVE8 56 57 portRESTORE_CONTEXT 58 59vPortYield 60 61 PRESERVE8 62 63 SVC 0 64 bx lr 65 66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 67; Interrupt service routine for the SWI interrupt. The vector table is 68; configured in the startup.s file. 69; 70; vPortYieldProcessor() is used to manually force a context switch. The 71; SWI interrupt is generated by a call to taskYIELD() or portYIELD(). 72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 73 74vPortYieldProcessor 75 76 PRESERVE8 77 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. 81 ADD LR, LR, #4 82 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 89 90 91 92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 93; Interrupt service routine for preemptive scheduler tick timer 94; Only used if portUSE_PREEMPTION is set to 1 in portmacro.h 95; 96; Uses timer 0 of LPC21XX Family 97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 98 99vPreemptiveTick 100 101 PRESERVE8 102 103 portSAVE_CONTEXT ; Save the context of the current task. 104 105 LDR R0, =xTaskIncrementTick ; Increment the tick count. 106 MOV LR, PC ; This may make a delayed task ready 107 BX R0 ; to run. 108 109 CMP R0, #0 110 BEQ SkipContextSwitch 111 LDR R0, =vTaskSwitchContext ; Find the highest priority task that 112 MOV LR, PC ; is ready to run. 113 BX R0 114SkipContextSwitch 115 MOV R0, #T0MATCHBIT ; Clear the timer event 116 LDR R1, =T0IR 117 STR R0, [R1] 118 119 LDR R0, =VICVECTADDR ; Acknowledge the interrupt 120 STR R0,[R0] 121 122 portRESTORE_CONTEXT ; Restore the context of the highest 123 ; priority task that is ready to run. 124 END 125