This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
FreeRTOS-Kernel/FreeRTOS/Source/portable/GCC/ColdFire_V2/port.c

182 lines
6.8 KiB
C
Raw Normal View History

2008-08-08 02:51:34 +08:00
/*
FreeRTOS V7.4.2 - Copyright (C) 2013 Real Time Engineers Ltd.
2012-10-16 20:17:47 +08:00
2013-02-20 02:36:58 +08:00
FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT
2012-10-16 20:17:47 +08:00
http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
2008-08-08 02:51:34 +08:00
2009-10-13 18:54:32 +08:00
***************************************************************************
* *
* FreeRTOS tutorial books are available in pdf and paperback. *
* Complete, revised, and edited pdf reference manuals are also *
* available. *
* *
* Purchasing FreeRTOS documentation will not only help you, by *
* ensuring you get running as quickly as possible and with an *
* in-depth knowledge of how to use FreeRTOS, it will also help *
* the FreeRTOS project to continue with its mission of providing *
* professional grade, cross platform, de facto standard solutions *
* for microcontrollers - completely free of charge! *
* *
* >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
* *
* Thank you for using FreeRTOS, and thank you for your support! *
* *
2009-10-13 18:54:32 +08:00
***************************************************************************
This file is part of the FreeRTOS distribution.
2008-08-08 02:51:34 +08:00
2009-10-13 18:54:32 +08:00
FreeRTOS is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License (version 2) as published by the
2009-10-13 18:54:32 +08:00
Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
2013-02-20 02:36:58 +08:00
>>>>>>NOTE<<<<<< The modification to the GPL is included to allow you to
distribute a combined work that includes FreeRTOS without being obliged to
provide the source code for proprietary components outside of the FreeRTOS
2013-02-20 02:36:58 +08:00
kernel.
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
2013-04-18 20:58:17 +08:00
and the FreeRTOS license exception along with FreeRTOS; if not it can be
2013-02-20 02:36:58 +08:00
viewed here: http://www.freertos.org/a00114.html and also obtained by
writing to Real Time Engineers Ltd., contact details for whom are available
on the FreeRTOS WEB site.
2009-03-15 03:20:12 +08:00
1 tab == 4 spaces!
2013-02-20 02:36:58 +08:00
2012-05-09 00:36:52 +08:00
***************************************************************************
* *
* Having a problem? Start by reading the FAQ "My application does *
2012-10-16 20:17:47 +08:00
* not run, what could be wrong?" *
2012-05-09 00:36:52 +08:00
* *
* http://www.FreeRTOS.org/FAQHelp.html *
* *
***************************************************************************
2008-08-08 02:51:34 +08:00
2013-02-20 02:36:58 +08:00
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
license and Real Time Engineers Ltd. contact details.
2012-05-09 00:36:52 +08:00
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
2013-02-20 02:36:58 +08:00
including FreeRTOS+Trace - an indispensable productivity tool, and our new
fully thread aware and reentrant UDP/IP stack.
2008-08-08 02:51:34 +08:00
2013-02-20 02:36:58 +08:00
http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
Integrity Systems, who sell the code with commercial support,
indemnification and middleware, under the OpenRTOS brand.
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
engineered and independently SIL3 certified version for use in safety and
mission critical applications that require provable dependability.
2008-08-08 02:51:34 +08:00
*/
/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
2008-08-08 17:41:33 +08:00
#define portINITIAL_FORMAT_VECTOR ( ( portSTACK_TYPE ) 0x4000 )
/* Supervisor mode set. */
#define portINITIAL_STATUS_REGISTER ( ( portSTACK_TYPE ) 0x2000)
2008-09-17 23:58:45 +08:00
/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This
will be set to 0 prior to the first task being started. */
static unsigned long ulCriticalNesting = 0x9999UL;
2008-08-08 03:10:25 +08:00
2008-09-17 23:58:45 +08:00
/*-----------------------------------------------------------*/
2008-08-08 02:51:34 +08:00
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE * pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
2008-08-08 17:41:33 +08:00
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
pxTopOfStack--;
*pxTopOfStack = (portSTACK_TYPE) 0xDEADBEEF;
pxTopOfStack--;
/* Exception stack frame starts with the return address. */
*pxTopOfStack = ( portSTACK_TYPE ) pxCode;
pxTopOfStack--;
*pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER );
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x0; /*FP*/
2008-09-17 23:58:45 +08:00
pxTopOfStack -= 14; /* A5 to D0. */
2008-08-08 17:41:33 +08:00
return pxTopOfStack;
2008-08-08 02:51:34 +08:00
}
/*-----------------------------------------------------------*/
portBASE_TYPE xPortStartScheduler( void )
{
2008-08-08 20:50:22 +08:00
extern void vPortStartFirstTask( void );
2008-08-08 03:10:25 +08:00
ulCriticalNesting = 0UL;
2008-08-08 17:41:33 +08:00
2008-09-17 23:58:45 +08:00
/* Configure the interrupts used by this port. */
2008-08-08 17:41:33 +08:00
vApplicationSetupInterrupts();
2008-09-17 23:58:45 +08:00
/* Start the first task executing. */
2008-08-08 20:50:22 +08:00
vPortStartFirstTask();
2008-08-08 17:41:33 +08:00
return pdFALSE;
2008-08-08 02:51:34 +08:00
}
/*-----------------------------------------------------------*/
void vPortEndScheduler( void )
{
2008-09-17 23:58:45 +08:00
/* Not implemented as there is nothing to return to. */
2008-08-08 02:51:34 +08:00
}
2008-08-08 03:10:25 +08:00
/*-----------------------------------------------------------*/
void vPortEnterCritical( void )
{
if( ulCriticalNesting == 0UL )
{
2008-09-17 23:58:45 +08:00
/* Guard against context switches being pended simultaneously with a
critical section being entered. */
do
{
portDISABLE_INTERRUPTS();
2008-09-23 02:08:29 +08:00
if( MCF_INTC0_INTFRCL == 0UL )
{
break;
}
portENABLE_INTERRUPTS();
} while( 1 );
}
2008-08-08 03:10:25 +08:00
ulCriticalNesting++;
}
/*-----------------------------------------------------------*/
void vPortExitCritical( void )
{
ulCriticalNesting--;
if( ulCriticalNesting == 0 )
{
portENABLE_INTERRUPTS();
}
}
/*-----------------------------------------------------------*/
void vPortYieldHandler( void )
2008-08-08 03:10:25 +08:00
{
unsigned long ulSavedInterruptMask;
2008-08-08 03:10:25 +08:00
ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR();
/* Note this will clear all forced interrupts - this is done for speed. */
2008-09-23 02:08:29 +08:00
MCF_INTC0_INTFRCL = 0;
vTaskSwitchContext();
portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask );
2008-08-08 20:50:22 +08:00
}
2008-08-08 03:10:25 +08:00