/* FreeRTOS.org V4.0.4 - Copyright (C) 2003-2006 Richard Barry. This file is part of the FreeRTOS.org distribution. FreeRTOS.org is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. FreeRTOS.org 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 along with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA A special exception to the GPL can be applied should you wish to distribute a combined work that includes FreeRTOS.org, without being obliged to provide the source code for any proprietary components. See the licensing section of http://www.FreeRTOS.org for full details of how and when the exception can be applied. *************************************************************************** See http://www.FreeRTOS.org for documentation, latest information, license and contact details. Please ensure to read the configuration and relevant port sections of the online documentation. *************************************************************************** */ #ifndef PORT_ASM_H #define PORT_ASM_H typedef void tskTCB; extern volatile tskTCB * volatile pxCurrentTCB; extern void vTaskSwitchContext( void ); /* * Saves the stack pointer for one task into its TCB, calls * vTaskSwitchContext() to update the TCB being used, then restores the stack * from the new TCB read to run the task. */ void portSWITCH_CONTEXT( void ); /* * Load the stack pointer from the TCB of the task which is going to be first * to execute. Then force an IRET so the registers and IP are popped off the * stack. */ void portFIRST_CONTEXT( void ); #define portSWITCH_CONTEXT() \ asm { mov bx, [pxCurrentTCB] } \ asm { mov word ptr [bx], sp } \ asm { call far ptr vTaskSwitchContext } \ asm { mov bx, [pxCurrentTCB] } \ asm { mov sp, [bx] } #define portFIRST_CONTEXT() \ asm { mov bx, [pxCurrentTCB] } \ asm { mov sp, [bx] } \ asm { pop bp } \ asm { pop di } \ asm { pop si } \ asm { pop ds } \ asm { pop es } \ asm { pop dx } \ asm { pop cx } \ asm { pop bx } \ asm { pop ax } \ asm { iret } #endif