; /* * ; * FreeRTOS Kernel V10.3.1 * ; * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * ; * * ; * Permission is hereby granted, free of charge, to any person obtaining a copy of * ; * this software and associated documentation files (the "Software"), to deal in * ; * the Software without restriction, including without limitation the rights to * ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * ; * the Software, and to permit persons to whom the Software is furnished to do so, * ; * subject to the following conditions: * ; * * ; * The above copyright notice and this permission notice shall be included in all * ; * copies or substantial portions of the Software. * ; * * ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ; * * ; * http://www.FreeRTOS.org * ; * http://aws.amazon.com/freertos * ; * * ; */ #include "FreeRTOSConfig.h" ; Variables used by scheduler ; ------------------------------------------------------------------------------ EXTERN pxCurrentTCB EXTERN usCriticalNesting ; ------------------------------------------------------------------------------ ; portSAVE_CONTEXT MACRO ; Saves the context of the general purpose registers, CS and ES( only in far ; memory mode ) registers the usCriticalNesting Value and the Stack Pointer ; of the active Task onto the task stack ; ------------------------------------------------------------------------------ portSAVE_CONTEXT MACRO PUSH AX; Save AX Register to stack. PUSH HL MOV A, CS; Save CS register. XCH A, X MOV A, ES; Save ES register. PUSH AX PUSH DE; Save the remaining general purpose registers. PUSH BC MOVW AX, usCriticalNesting; Save the usCriticalNesting value. PUSH AX MOVW AX, pxCurrentTCB; Save the Stack pointer. MOVW HL, AX MOVW AX, SP MOVW[ HL ], AX ENDM ; ------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------ ; portRESTORE_CONTEXT MACRO ; Restores the task Stack Pointer then use this to restore usCriticalNesting, ; general purpose registers and the CS and ES( only in far memory mode ) ; of the selected task from the task stack ; ------------------------------------------------------------------------------ portRESTORE_CONTEXT MACRO MOVW AX, pxCurrentTCB; Restore the Stack pointer. MOVW HL, AX MOVW AX, [ HL ] MOVW SP, AX POP AX; Restore usCriticalNesting value. MOVW usCriticalNesting, AX POP BC; Restore the necessary general purpose registers. POP DE POP AX; Restore the ES register. MOV ES, A XCH A, X; Restore the CS register. MOV CS, A POP HL; Restore general purpose register HL. POP AX; Restore AX. ENDM ; ------------------------------------------------------------------------------