mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 02:59:01 +01:00 
			
		
		
		
	New port files for Tern E-Engine.
This commit is contained in:
		
							parent
							
								
									4202a62517
								
							
						
					
					
						commit
						210d5beaae
					
				
							
								
								
									
										220
									
								
								Source/portable/Paradigm/Tern_EE/large_untested/port.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								Source/portable/Paradigm/Tern_EE/large_untested/port.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,220 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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.
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Implementation of functions defined in portable.h for the Tern EE 186
 | 
			
		||||
 * port.
 | 
			
		||||
 *----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Library includes. */
 | 
			
		||||
#include <embedded.h>
 | 
			
		||||
#include <ae.h>
 | 
			
		||||
 | 
			
		||||
/* Scheduler includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "portasm.h"
 | 
			
		||||
 | 
			
		||||
/* The timer increments every four clocks, hence the divide by 4. */
 | 
			
		||||
#define portTIMER_COMPARE ( unsigned portSHORT ) ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) / ( unsigned portLONG ) 4 )
 | 
			
		||||
 | 
			
		||||
/* From the RDC data sheet. */
 | 
			
		||||
#define portENABLE_TIMER_AND_INTERRUPT ( unsigned portSHORT ) 0xe001
 | 
			
		||||
 | 
			
		||||
/* Interrupt control. */
 | 
			
		||||
#define portEIO_REGISTER 0xff22
 | 
			
		||||
#define portCLEAR_INTERRUPT 0x0008
 | 
			
		||||
 | 
			
		||||
/* Setup the hardware to generate the required tick frequency. */
 | 
			
		||||
static void prvSetupTimerInterrupt( void );
 | 
			
		||||
 | 
			
		||||
/* The ISR used depends on whether the preemptive or cooperative scheduler
 | 
			
		||||
is being used. */
 | 
			
		||||
#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
	/* Tick service routine used by the scheduler when preemptive scheduling is
 | 
			
		||||
	being used. */
 | 
			
		||||
	static void __interrupt __far prvPreemptiveTick( void );
 | 
			
		||||
#else
 | 
			
		||||
	/* Tick service routine used by the scheduler when cooperative scheduling is
 | 
			
		||||
	being used. */
 | 
			
		||||
	static void __interrupt __far prvNonPreemptiveTick( void );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Trap routine used by taskYIELD() to manually cause a context switch. */
 | 
			
		||||
static void __interrupt __far prvYieldProcessor( void );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
/* See header file for description. */
 | 
			
		||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
portSTACK_TYPE DS_Reg = 0;
 | 
			
		||||
 | 
			
		||||
	/* Place a few bytes of known values on the bottom of the stack.
 | 
			
		||||
	This is just useful for debugging. */
 | 
			
		||||
 | 
			
		||||
	*pxTopOfStack = 0x1111;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = 0x2222;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = 0x3333;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* We are going to start the scheduler using a return from interrupt
 | 
			
		||||
	instruction to load the program counter, so first there would be the
 | 
			
		||||
	function call with parameters preamble. */
 | 
			
		||||
	
 | 
			
		||||
	*pxTopOfStack = FP_SEG( pvParameters );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pvParameters );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_SEG( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* Next the status register and interrupt return address. */
 | 
			
		||||
	*pxTopOfStack = portINITIAL_SW;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_SEG( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* The remaining registers would be pushed on the stack by our context
 | 
			
		||||
	switch function.  These are loaded with values simply to make debugging
 | 
			
		||||
	easier. */
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xAAAA;	/* AX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xBBBB;	/* BX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xCCCC;	/* CX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xDDDD;	/* DX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xEEEE;	/* ES */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* We need the true data segment. */
 | 
			
		||||
	__asm{	MOV DS_Reg, DS };
 | 
			
		||||
 | 
			
		||||
	*pxTopOfStack = DS_Reg;						/* DS */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0x0123;	/* SI */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xDDDD;	/* DI */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xBBBB;	/* BP */
 | 
			
		||||
 | 
			
		||||
	return pxTopOfStack;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
portBASE_TYPE xPortStartScheduler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* This is called with interrupts already disabled. */
 | 
			
		||||
 | 
			
		||||
	/* Put our manual switch (yield) function on a known
 | 
			
		||||
	vector. */
 | 
			
		||||
	setvect( portSWITCH_INT_NUMBER, prvYieldProcessor );
 | 
			
		||||
 | 
			
		||||
	/* Setup the tick interrupt. */
 | 
			
		||||
	prvSetupTimerInterrupt();
 | 
			
		||||
 | 
			
		||||
	/* Kick off the scheduler by setting up the context of the first task. */
 | 
			
		||||
	portFIRST_CONTEXT();
 | 
			
		||||
 | 
			
		||||
	/* Should not get here! */
 | 
			
		||||
	return pdFALSE;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The ISR used depends on whether the preemptive or cooperative scheduler
 | 
			
		||||
is being used. */
 | 
			
		||||
#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
	static void __interrupt __far prvPreemptiveTick( void )
 | 
			
		||||
	{
 | 
			
		||||
		/* Get the scheduler to update the task states following the tick. */
 | 
			
		||||
		vTaskIncrementTick();
 | 
			
		||||
 | 
			
		||||
		/* Switch in the context of the next task to be run. */
 | 
			
		||||
		portSWITCH_CONTEXT();
 | 
			
		||||
 | 
			
		||||
		/* Reset interrupt. */
 | 
			
		||||
		outport( portEIO_REGISTER, portCLEAR_INTERRUPT );
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	static void __interrupt __far prvNonPreemptiveTick( void )
 | 
			
		||||
	{
 | 
			
		||||
		/* Same as preemptive tick, but the cooperative scheduler is being used
 | 
			
		||||
		so we don't have to switch in the context of the next task. */
 | 
			
		||||
		vTaskIncrementTick();
 | 
			
		||||
		/* Reset interrupt. */
 | 
			
		||||
		outport( portEIO_REGISTER, portCLEAR_INTERRUPT );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void __interrupt __far prvYieldProcessor( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Switch in the context of the next task to be run. */
 | 
			
		||||
	portSWITCH_CONTEXT();
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vPortEndScheduler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Not implemented. */
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvSetupTimerInterrupt( void )
 | 
			
		||||
{
 | 
			
		||||
const unsigned portSHORT usTimerACompare = portTIMER_COMPARE, usTimerAMode = portENABLE_TIMER_AND_INTERRUPT;
 | 
			
		||||
 | 
			
		||||
	#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
		/* Tick service routine used by the scheduler when preemptive scheduling is
 | 
			
		||||
		being used. */
 | 
			
		||||
		t2_init( usTimerAMode, usTimerACompare, prvPreemptiveTick );
 | 
			
		||||
	#else
 | 
			
		||||
		/* Tick service routine used by the scheduler when cooperative scheduling is
 | 
			
		||||
		being used. */
 | 
			
		||||
		t2_init( usTimerAMode, usTimerACompare, prvNonPreemptiveTick );
 | 
			
		||||
	#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										81
									
								
								Source/portable/Paradigm/Tern_EE/large_untested/portasm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								Source/portable/Paradigm/Tern_EE/large_untested/portasm.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,81 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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.
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
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	ax, seg pxCurrentTCB		}
 | 
			
		||||
//							asm { mov	ds, ax						}
 | 
			
		||||
//							asm { les	bx, pxCurrentTCB			}	/* Save the stack pointer into the TCB. */
 | 
			
		||||
//							asm { mov	es:0x2[ bx ], ss			}
 | 
			
		||||
//							asm { mov	es:[ bx ], sp				}
 | 
			
		||||
//							asm { call  far ptr vTaskSwitchContext	}	/* Perform the switch. */
 | 
			
		||||
//							asm { mov	ax, seg pxCurrentTCB		}	/* Restore the stack pointer from the TCB. */
 | 
			
		||||
//							asm { mov	ds, ax						}
 | 
			
		||||
//							asm { les	bx, dword ptr pxCurrentTCB	}
 | 
			
		||||
//							asm { mov	ss, es:[ bx + 2 ]			}	
 | 
			
		||||
//							asm { mov	sp, es:[ bx ]				}
 | 
			
		||||
 | 
			
		||||
#define portFIRST_CONTEXT()												\
 | 
			
		||||
							asm { mov	ax, seg pxCurrentTCB		}	\
 | 
			
		||||
							asm { mov	ds, ax						}	\
 | 
			
		||||
							asm { les	bx, dword ptr pxCurrentTCB	}	\
 | 
			
		||||
							asm { mov	ss, es:[ bx + 2 ]			}	\
 | 
			
		||||
							asm { mov	sp, es:[ bx ]				}	\
 | 
			
		||||
							asm { pop	bx							}	\
 | 
			
		||||
							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								}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										98
									
								
								Source/portable/Paradigm/Tern_EE/large_untested/portmacro.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								Source/portable/Paradigm/Tern_EE/large_untested/portmacro.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,98 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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 PORTMACRO_H
 | 
			
		||||
#define PORTMACRO_H
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Port specific definitions.  
 | 
			
		||||
 *
 | 
			
		||||
 * The settings in this file configure FreeRTOS correctly for the
 | 
			
		||||
 * given hardware and compiler.
 | 
			
		||||
 *
 | 
			
		||||
 * These settings should not be altered.
 | 
			
		||||
 *-----------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Type definitions. */
 | 
			
		||||
#define portCHAR		char
 | 
			
		||||
#define portFLOAT		float
 | 
			
		||||
#define portDOUBLE		long
 | 
			
		||||
#define portLONG		long
 | 
			
		||||
#define portSHORT		int
 | 
			
		||||
#define portSTACK_TYPE	unsigned portSHORT
 | 
			
		||||
#define portBASE_TYPE	portSHORT
 | 
			
		||||
 | 
			
		||||
#if( configUSE_16_BIT_TICKS == 1 )
 | 
			
		||||
	typedef unsigned portSHORT portTickType;
 | 
			
		||||
	#define portMAX_DELAY ( portTickType ) 0xffff
 | 
			
		||||
#else
 | 
			
		||||
	typedef unsigned portLONG portTickType;
 | 
			
		||||
	#define portMAX_DELAY ( portTickType ) 0xffffffff
 | 
			
		||||
#endif
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Critical section handling. */
 | 
			
		||||
#define portENTER_CRITICAL()			__asm{ pushf }  \
 | 
			
		||||
										__asm{ cli 	 }	\
 | 
			
		||||
 | 
			
		||||
#define portEXIT_CRITICAL()				__asm{ popf }
 | 
			
		||||
 | 
			
		||||
#define portDISABLE_INTERRUPTS()		__asm{ cli }
 | 
			
		||||
 | 
			
		||||
#define portENABLE_INTERRUPTS()			__asm{ sti }
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Hardware specifics. */
 | 
			
		||||
#define portNOP()						__asm{ nop }
 | 
			
		||||
#define portSTACK_GROWTH				( -1 )
 | 
			
		||||
#define portSWITCH_INT_NUMBER 			0x80
 | 
			
		||||
#define portYIELD()						__asm{ int portSWITCH_INT_NUMBER } 
 | 
			
		||||
#define portTICK_RATE_MS				( ( portTickType ) 1000 / configTICK_RATE_HZ )		
 | 
			
		||||
#define portBYTE_ALIGNMENT				2
 | 
			
		||||
#define portINITIAL_SW					( ( portSTACK_TYPE ) 0x0202 )	/* Start the tasks with interrupts enabled. */
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Compiler specifics. */
 | 
			
		||||
#define portINPUT_BYTE( xAddr )				inp( xAddr )
 | 
			
		||||
#define portOUTPUT_BYTE( xAddr, ucValue )	outp( xAddr, ucValue )
 | 
			
		||||
#define portINPUT_WORD( xAddr )				inpw( xAddr )
 | 
			
		||||
#define portOUTPUT_WORD( xAddr, usValue )	outpw( xAddr, usValue )
 | 
			
		||||
#define inline
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
 | 
			
		||||
#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters )
 | 
			
		||||
#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters )
 | 
			
		||||
 | 
			
		||||
#endif /* PORTMACRO_H */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										76
									
								
								Source/portable/Paradigm/Tern_EE/small/PORTASM.bak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Source/portable/Paradigm/Tern_EE/small/PORTASM.bak
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,76 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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
 | 
			
		||||
							
								
								
									
										222
									
								
								Source/portable/Paradigm/Tern_EE/small/port.bak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								Source/portable/Paradigm/Tern_EE/small/port.bak
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,222 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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.
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Implementation of functions defined in portable.h for the Tern EE 186
 | 
			
		||||
 * port.
 | 
			
		||||
 *----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Library includes. */
 | 
			
		||||
#include <embedded.h>
 | 
			
		||||
#include <ae.h>
 | 
			
		||||
 | 
			
		||||
/* Scheduler includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "portasm.h"
 | 
			
		||||
 | 
			
		||||
/* The timer increments every four clocks, hence the divide by 4. */
 | 
			
		||||
#define portPRESCALE_VALUE ( 16 )
 | 
			
		||||
#define portTIMER_COMPARE ( configCPU_CLOCK_HZ  / ( configTICK_RATE_HZ * 4UL ) )
 | 
			
		||||
 | 
			
		||||
/* From the RDC data sheet. */
 | 
			
		||||
#define portENABLE_TIMER_AND_INTERRUPT 	( unsigned portSHORT ) 0xe00b
 | 
			
		||||
#define portENABLE_TIMER				( unsigned portSHORT ) 0xC001
 | 
			
		||||
 | 
			
		||||
/* Interrupt control. */
 | 
			
		||||
#define portEIO_REGISTER 0xff22
 | 
			
		||||
#define portCLEAR_INTERRUPT 0x0008
 | 
			
		||||
 | 
			
		||||
/* Setup the hardware to generate the required tick frequency. */
 | 
			
		||||
static void prvSetupTimerInterrupt( void );
 | 
			
		||||
 | 
			
		||||
/* The ISR used depends on whether the preemptive or cooperative scheduler
 | 
			
		||||
is being used. */
 | 
			
		||||
#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
	/* Tick service routine used by the scheduler when preemptive scheduling is
 | 
			
		||||
	being used. */
 | 
			
		||||
	static void __interrupt __far prvPreemptiveTick( void );
 | 
			
		||||
#else
 | 
			
		||||
	/* Tick service routine used by the scheduler when cooperative scheduling is
 | 
			
		||||
	being used. */
 | 
			
		||||
	static void __interrupt __far prvNonPreemptiveTick( void );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Trap routine used by taskYIELD() to manually cause a context switch. */
 | 
			
		||||
static void __interrupt __far prvYieldProcessor( void );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
/* See header file for description. */
 | 
			
		||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
portSTACK_TYPE DS_Reg = 0;
 | 
			
		||||
 | 
			
		||||
	/* We need the true data segment. */
 | 
			
		||||
	__asm{	MOV DS_Reg, DS };
 | 
			
		||||
 | 
			
		||||
	/* Place a few bytes of known values on the bottom of the stack.
 | 
			
		||||
	This is just useful for debugging. */
 | 
			
		||||
 | 
			
		||||
	*pxTopOfStack = 0x1111;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = 0x2222;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = 0x3333;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* We are going to start the scheduler using a return from interrupt
 | 
			
		||||
	instruction to load the program counter, so first there would be the
 | 
			
		||||
	function call with parameters preamble. */
 | 
			
		||||
	
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pvParameters );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* Next the status register and interrupt return address. */
 | 
			
		||||
	*pxTopOfStack = portINITIAL_SW;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_SEG( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* The remaining registers would be pushed on the stack by our context
 | 
			
		||||
	switch function.  These are loaded with values simply to make debugging
 | 
			
		||||
	easier. */
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xAAAA;	/* AX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xBBBB;	/* BX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xCCCC;	/* CX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xDDDD;	/* DX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xEEEE;	/* ES */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	*pxTopOfStack = DS_Reg;						/* DS */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0x0123;	/* SI */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xDDDD;	/* DI */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xBBBB;	/* BP */
 | 
			
		||||
 | 
			
		||||
	return pxTopOfStack;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
portBASE_TYPE xPortStartScheduler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* This is called with interrupts already disabled. */
 | 
			
		||||
 | 
			
		||||
	/* Put our manual switch (yield) function on a known
 | 
			
		||||
	vector. */
 | 
			
		||||
	setvect( portSWITCH_INT_NUMBER, prvYieldProcessor );
 | 
			
		||||
 | 
			
		||||
	/* Setup the tick interrupt. */
 | 
			
		||||
	prvSetupTimerInterrupt();
 | 
			
		||||
 | 
			
		||||
	/* Kick off the scheduler by setting up the context of the first task. */
 | 
			
		||||
	portFIRST_CONTEXT();
 | 
			
		||||
 | 
			
		||||
	/* Should not get here! */
 | 
			
		||||
	return pdFALSE;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The ISR used depends on whether the preemptive or cooperative scheduler
 | 
			
		||||
is being used. */
 | 
			
		||||
#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
	static void __interrupt __far prvPreemptiveTick( void )
 | 
			
		||||
	{
 | 
			
		||||
		/* Get the scheduler to update the task states following the tick. */
 | 
			
		||||
		vTaskIncrementTick();
 | 
			
		||||
 | 
			
		||||
		/* Switch in the context of the next task to be run. */
 | 
			
		||||
		portEND_SWITCHING_ISR();
 | 
			
		||||
 | 
			
		||||
		/* Reset interrupt. */
 | 
			
		||||
		outport( portEIO_REGISTER, portCLEAR_INTERRUPT );
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	static void __interrupt __far prvNonPreemptiveTick( void )
 | 
			
		||||
	{
 | 
			
		||||
		/* Same as preemptive tick, but the cooperative scheduler is being used
 | 
			
		||||
		so we don't have to switch in the context of the next task. */
 | 
			
		||||
		vTaskIncrementTick();
 | 
			
		||||
		/* Reset interrupt. */
 | 
			
		||||
		outport( portEIO_REGISTER, portCLEAR_INTERRUPT );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void __interrupt __far prvYieldProcessor( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Switch in the context of the next task to be run. */
 | 
			
		||||
	portEND_SWITCHING_ISR();
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vPortEndScheduler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Not implemented. */
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvSetupTimerInterrupt( void )
 | 
			
		||||
{
 | 
			
		||||
const unsigned portLONG ulCompareValue = portTIMER_COMPARE;
 | 
			
		||||
unsigned portSHORT usTimerCompare;
 | 
			
		||||
 | 
			
		||||
	usTimerCompare = ( unsigned portSHORT ) ( ulCompareValue >> 4UL );
 | 
			
		||||
    t2_init( portENABLE_TIMER, portPRESCALE_VALUE, NULL );
 | 
			
		||||
 | 
			
		||||
	#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
		/* Tick service routine used by the scheduler when preemptive scheduling is
 | 
			
		||||
		being used. */
 | 
			
		||||
		t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvPreemptiveTick );
 | 
			
		||||
	#else
 | 
			
		||||
		/* Tick service routine used by the scheduler when cooperative scheduling is
 | 
			
		||||
		being used. */
 | 
			
		||||
		t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvNonPreemptiveTick );
 | 
			
		||||
	#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										222
									
								
								Source/portable/Paradigm/Tern_EE/small/port.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								Source/portable/Paradigm/Tern_EE/small/port.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,222 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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.
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Implementation of functions defined in portable.h for the Tern EE 186
 | 
			
		||||
 * port.
 | 
			
		||||
 *----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Library includes. */
 | 
			
		||||
#include <embedded.h>
 | 
			
		||||
#include <ae.h>
 | 
			
		||||
 | 
			
		||||
/* Scheduler includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "portasm.h"
 | 
			
		||||
 | 
			
		||||
/* The timer increments every four clocks, hence the divide by 4. */
 | 
			
		||||
#define portPRESCALE_VALUE ( 16 )
 | 
			
		||||
#define portTIMER_COMPARE ( configCPU_CLOCK_HZ  / ( configTICK_RATE_HZ * 4UL ) )
 | 
			
		||||
 | 
			
		||||
/* From the RDC data sheet. */
 | 
			
		||||
#define portENABLE_TIMER_AND_INTERRUPT 	( unsigned portSHORT ) 0xe00b
 | 
			
		||||
#define portENABLE_TIMER				( unsigned portSHORT ) 0xC001
 | 
			
		||||
 | 
			
		||||
/* Interrupt control. */
 | 
			
		||||
#define portEIO_REGISTER 0xff22
 | 
			
		||||
#define portCLEAR_INTERRUPT 0x0008
 | 
			
		||||
 | 
			
		||||
/* Setup the hardware to generate the required tick frequency. */
 | 
			
		||||
static void prvSetupTimerInterrupt( void );
 | 
			
		||||
 | 
			
		||||
/* The ISR used depends on whether the preemptive or cooperative scheduler
 | 
			
		||||
is being used. */
 | 
			
		||||
#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
	/* Tick service routine used by the scheduler when preemptive scheduling is
 | 
			
		||||
	being used. */
 | 
			
		||||
	static void __interrupt __far prvPreemptiveTick( void );
 | 
			
		||||
#else
 | 
			
		||||
	/* Tick service routine used by the scheduler when cooperative scheduling is
 | 
			
		||||
	being used. */
 | 
			
		||||
	static void __interrupt __far prvNonPreemptiveTick( void );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Trap routine used by taskYIELD() to manually cause a context switch. */
 | 
			
		||||
static void __interrupt __far prvYieldProcessor( void );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
/* See header file for description. */
 | 
			
		||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
portSTACK_TYPE DS_Reg = 0;
 | 
			
		||||
 | 
			
		||||
	/* We need the true data segment. */
 | 
			
		||||
	__asm{	MOV DS_Reg, DS };
 | 
			
		||||
 | 
			
		||||
	/* Place a few bytes of known values on the bottom of the stack.
 | 
			
		||||
	This is just useful for debugging. */
 | 
			
		||||
 | 
			
		||||
	*pxTopOfStack = 0x1111;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = 0x2222;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = 0x3333;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* We are going to start the scheduler using a return from interrupt
 | 
			
		||||
	instruction to load the program counter, so first there would be the
 | 
			
		||||
	function call with parameters preamble. */
 | 
			
		||||
	
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pvParameters );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* Next the status register and interrupt return address. */
 | 
			
		||||
	*pxTopOfStack = portINITIAL_SW;
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_SEG( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = FP_OFF( pxCode );
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	/* The remaining registers would be pushed on the stack by our context
 | 
			
		||||
	switch function.  These are loaded with values simply to make debugging
 | 
			
		||||
	easier. */
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xAAAA;	/* AX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xBBBB;	/* BX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xCCCC;	/* CX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xDDDD;	/* DX */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xEEEE;	/* ES */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
 | 
			
		||||
	*pxTopOfStack = DS_Reg;						/* DS */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0x0123;	/* SI */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xDDDD;	/* DI */
 | 
			
		||||
	pxTopOfStack--;
 | 
			
		||||
	*pxTopOfStack = ( portSTACK_TYPE ) 0xBBBB;	/* BP */
 | 
			
		||||
 | 
			
		||||
	return pxTopOfStack;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
portBASE_TYPE xPortStartScheduler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* This is called with interrupts already disabled. */
 | 
			
		||||
 | 
			
		||||
	/* Put our manual switch (yield) function on a known
 | 
			
		||||
	vector. */
 | 
			
		||||
	setvect( portSWITCH_INT_NUMBER, prvYieldProcessor );
 | 
			
		||||
 | 
			
		||||
	/* Setup the tick interrupt. */
 | 
			
		||||
	prvSetupTimerInterrupt();
 | 
			
		||||
 | 
			
		||||
	/* Kick off the scheduler by setting up the context of the first task. */
 | 
			
		||||
	portFIRST_CONTEXT();
 | 
			
		||||
 | 
			
		||||
	/* Should not get here! */
 | 
			
		||||
	return pdFALSE;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The ISR used depends on whether the preemptive or cooperative scheduler
 | 
			
		||||
is being used. */
 | 
			
		||||
#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
	static void __interrupt __far prvPreemptiveTick( void )
 | 
			
		||||
	{
 | 
			
		||||
		/* Get the scheduler to update the task states following the tick. */
 | 
			
		||||
		vTaskIncrementTick();
 | 
			
		||||
 | 
			
		||||
		/* Switch in the context of the next task to be run. */
 | 
			
		||||
		portEND_SWITCHING_ISR();
 | 
			
		||||
 | 
			
		||||
		/* Reset interrupt. */
 | 
			
		||||
		outport( portEIO_REGISTER, portCLEAR_INTERRUPT );
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	static void __interrupt __far prvNonPreemptiveTick( void )
 | 
			
		||||
	{
 | 
			
		||||
		/* Same as preemptive tick, but the cooperative scheduler is being used
 | 
			
		||||
		so we don't have to switch in the context of the next task. */
 | 
			
		||||
		vTaskIncrementTick();
 | 
			
		||||
		/* Reset interrupt. */
 | 
			
		||||
		outport( portEIO_REGISTER, portCLEAR_INTERRUPT );
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void __interrupt __far prvYieldProcessor( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Switch in the context of the next task to be run. */
 | 
			
		||||
	portEND_SWITCHING_ISR();
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vPortEndScheduler( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Not implemented. */
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvSetupTimerInterrupt( void )
 | 
			
		||||
{
 | 
			
		||||
const unsigned portLONG ulCompareValue = portTIMER_COMPARE;
 | 
			
		||||
unsigned portSHORT usTimerCompare;
 | 
			
		||||
 | 
			
		||||
	usTimerCompare = ( unsigned portSHORT ) ( ulCompareValue >> 4 );
 | 
			
		||||
    t2_init( portENABLE_TIMER, portPRESCALE_VALUE, NULL );
 | 
			
		||||
 | 
			
		||||
	#if( configUSE_PREEMPTION == 1 )
 | 
			
		||||
		/* Tick service routine used by the scheduler when preemptive scheduling is
 | 
			
		||||
		being used. */
 | 
			
		||||
		t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvPreemptiveTick );
 | 
			
		||||
	#else
 | 
			
		||||
		/* Tick service routine used by the scheduler when cooperative scheduling is
 | 
			
		||||
		being used. */
 | 
			
		||||
		t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvNonPreemptiveTick );
 | 
			
		||||
	#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										77
									
								
								Source/portable/Paradigm/Tern_EE/small/portasm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								Source/portable/Paradigm/Tern_EE/small/portasm.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,77 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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 portEND_SWITCHING_ISR( 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 portEND_SWITCHING_ISR()											\
 | 
			
		||||
							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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										100
									
								
								Source/portable/Paradigm/Tern_EE/small/portmacro.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								Source/portable/Paradigm/Tern_EE/small/portmacro.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
			
		||||
/*
 | 
			
		||||
	FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
 | 
			
		||||
 | 
			
		||||
	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 as published by
 | 
			
		||||
	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
	(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	along with FreeRTOS; 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, 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 PORTMACRO_H
 | 
			
		||||
#define PORTMACRO_H
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Port specific definitions.  
 | 
			
		||||
 *
 | 
			
		||||
 * The settings in this file configure FreeRTOS correctly for the
 | 
			
		||||
 * given hardware and compiler.
 | 
			
		||||
 *
 | 
			
		||||
 * These settings should not be altered.
 | 
			
		||||
 *-----------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Type definitions. */
 | 
			
		||||
#define portCHAR		char
 | 
			
		||||
#define portFLOAT		float
 | 
			
		||||
#define portDOUBLE		long
 | 
			
		||||
#define portLONG		long
 | 
			
		||||
#define portSHORT		int
 | 
			
		||||
#define portSTACK_TYPE	unsigned portSHORT
 | 
			
		||||
#define portBASE_TYPE	portSHORT
 | 
			
		||||
 | 
			
		||||
typedef void ( __interrupt __far *pxISR )();
 | 
			
		||||
 | 
			
		||||
#if( configUSE_16_BIT_TICKS == 1 )
 | 
			
		||||
	typedef unsigned portSHORT portTickType;
 | 
			
		||||
	#define portMAX_DELAY ( portTickType ) 0xffff
 | 
			
		||||
#else
 | 
			
		||||
	typedef unsigned portLONG portTickType;
 | 
			
		||||
	#define portMAX_DELAY ( portTickType ) 0xffffffff
 | 
			
		||||
#endif
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Critical section handling. */
 | 
			
		||||
#define portENTER_CRITICAL()			__asm{ pushf }  \
 | 
			
		||||
										__asm{ cli 	 }	\
 | 
			
		||||
 | 
			
		||||
#define portEXIT_CRITICAL()				__asm{ popf }
 | 
			
		||||
 | 
			
		||||
#define portDISABLE_INTERRUPTS()		__asm{ cli }
 | 
			
		||||
 | 
			
		||||
#define portENABLE_INTERRUPTS()			__asm{ sti }
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Hardware specifics. */
 | 
			
		||||
#define portNOP()						__asm{ nop }
 | 
			
		||||
#define portSTACK_GROWTH				( -1 )
 | 
			
		||||
#define portSWITCH_INT_NUMBER 			0x80
 | 
			
		||||
#define portYIELD()						__asm{ int portSWITCH_INT_NUMBER } 
 | 
			
		||||
#define portTICK_RATE_MS				( ( portTickType ) 1000 / configTICK_RATE_HZ )		
 | 
			
		||||
#define portBYTE_ALIGNMENT				2
 | 
			
		||||
#define portINITIAL_SW					( ( portSTACK_TYPE ) 0x0202 )	/* Start the tasks with interrupts enabled. */
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Compiler specifics. */
 | 
			
		||||
#define portINPUT_BYTE( xAddr )				inp( xAddr )
 | 
			
		||||
#define portOUTPUT_BYTE( xAddr, ucValue )	outp( xAddr, ucValue )
 | 
			
		||||
#define portINPUT_WORD( xAddr )				inpw( xAddr )
 | 
			
		||||
#define portOUTPUT_WORD( xAddr, usValue )	outpw( xAddr, usValue )
 | 
			
		||||
#define inline
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
 | 
			
		||||
#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters )
 | 
			
		||||
#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters )
 | 
			
		||||
 | 
			
		||||
#endif /* PORTMACRO_H */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user