mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Remove the two separate ports, instead use two demo apps that use a conditional compilation to select the method of interrupt management to use.
This commit is contained in:
parent
eee1043e33
commit
a91c6302e7
|
@ -1,194 +0,0 @@
|
||||||
/*
|
|
||||||
FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 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.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
|
|
||||||
* and even write all or part of your application on your behalf. *
|
|
||||||
* See http://www.OpenRTOS.com for details of the services we provide to *
|
|
||||||
* expedite your project. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Implementation of functions defined in portable.h for the MSP430 port.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants required for hardware setup. The tick ISR runs off the ACLK,
|
|
||||||
not the MCLK. */
|
|
||||||
#define portACLK_FREQUENCY_HZ ( ( portTickType ) 32768 )
|
|
||||||
#define portINITIAL_CRITICAL_NESTING ( ( unsigned portSHORT ) 10 )
|
|
||||||
#define portFLAGS_INT_ENABLED ( ( portSTACK_TYPE ) 0x08 )
|
|
||||||
|
|
||||||
/* We require the address of the pxCurrentTCB variable, but don't want to know
|
|
||||||
any details of its type. */
|
|
||||||
typedef void tskTCB;
|
|
||||||
extern volatile tskTCB * volatile pxCurrentTCB;
|
|
||||||
|
|
||||||
/* Each task maintains a count of the critical section nesting depth. Each
|
|
||||||
time a critical section is entered the count is incremented. Each time a
|
|
||||||
critical section is exited the count is decremented - with interrupts only
|
|
||||||
being re-enabled if the count is zero.
|
|
||||||
|
|
||||||
usCriticalNesting will get set to zero when the scheduler starts, but must
|
|
||||||
not be initialised to zero as this will cause problems during the startup
|
|
||||||
sequence. */
|
|
||||||
volatile unsigned portSHORT usCriticalNesting = portINITIAL_CRITICAL_NESTING;
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but
|
|
||||||
* could have alternatively used the watchdog timer or timer 1.
|
|
||||||
*/
|
|
||||||
void prvSetupTimerInterrupt( void );
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialise the stack of a task to look exactly as if a call to
|
|
||||||
* portSAVE_CONTEXT had been called.
|
|
||||||
*
|
|
||||||
* See the header file portable.h.
|
|
||||||
*/
|
|
||||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Place a few bytes of known values on the bottom of the stack.
|
|
||||||
This is just useful for debugging and can be included if required.
|
|
||||||
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x1111;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x2222;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x3333;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The msp430 automatically pushes the PC then SR onto the stack before
|
|
||||||
executing an ISR. We want the stack to look just as if this has happened
|
|
||||||
so place a pointer to the start of the task on the stack first - followed
|
|
||||||
by the flags we want the task to use when it starts up. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) pxCode;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = portFLAGS_INT_ENABLED;
|
|
||||||
pxTopOfStack--;
|
|
||||||
|
|
||||||
/* Next the general purpose registers. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x4444;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x5555;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x6666;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x7777;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x8888;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x9999;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xaaaa;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xbbbb;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xcccc;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xdddd;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xeeee;
|
|
||||||
pxTopOfStack--;
|
|
||||||
|
|
||||||
/* When the task starts is will expect to find the function parameter in
|
|
||||||
R15. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
|
|
||||||
pxTopOfStack--;
|
|
||||||
|
|
||||||
/* A variable is used to keep track of the critical section nesting.
|
|
||||||
This variable has to be stored as part of the task context and is
|
|
||||||
initially set to zero. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) portNO_CRITICAL_SECTION_NESTING;
|
|
||||||
|
|
||||||
/* Return a pointer to the top of the stack we have generated so this can
|
|
||||||
be stored in the task control block for the task. */
|
|
||||||
return pxTopOfStack;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortEndScheduler( void )
|
|
||||||
{
|
|
||||||
/* It is unlikely that the MSP430 port will get stopped. If required simply
|
|
||||||
disable the tick interrupt here. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hardware initialisation to generate the RTOS tick. This uses timer 0
|
|
||||||
* but could alternatively use the watchdog timer or timer 1.
|
|
||||||
*/
|
|
||||||
void prvSetupTimerInterrupt( void )
|
|
||||||
{
|
|
||||||
/* Ensure the timer is stopped. */
|
|
||||||
TACTL = 0;
|
|
||||||
|
|
||||||
/* Run the timer of the ACLK. */
|
|
||||||
TACTL = TASSEL_1;
|
|
||||||
|
|
||||||
/* Clear everything to start with. */
|
|
||||||
TACTL |= TACLR;
|
|
||||||
|
|
||||||
/* Set the compare match value according to the tick rate we want. */
|
|
||||||
TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ;
|
|
||||||
|
|
||||||
/* Enable the interrupts. */
|
|
||||||
TACCTL0 = CCIE;
|
|
||||||
|
|
||||||
/* Start up clean. */
|
|
||||||
TACTL |= TACLR;
|
|
||||||
|
|
||||||
/* Up mode. */
|
|
||||||
TACTL |= MC_1;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
/*
|
|
||||||
FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 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.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
|
|
||||||
* and even write all or part of your application on your behalf. *
|
|
||||||
* See http://www.OpenRTOS.com for details of the services we provide to *
|
|
||||||
* expedite your project. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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 double
|
|
||||||
#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
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Interrupt control macros. */
|
|
||||||
#define portDISABLE_INTERRUPTS() _DINT();
|
|
||||||
#define portENABLE_INTERRUPTS() _EINT();
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Critical section control macros. */
|
|
||||||
#define portNO_CRITICAL_SECTION_NESTING ( ( unsigned portSHORT ) 0 )
|
|
||||||
|
|
||||||
#define portENTER_CRITICAL() \
|
|
||||||
{ \
|
|
||||||
extern volatile unsigned portSHORT usCriticalNesting; \
|
|
||||||
\
|
|
||||||
portDISABLE_INTERRUPTS(); \
|
|
||||||
\
|
|
||||||
/* Now interrupts are disabled usCriticalNesting can be accessed */ \
|
|
||||||
/* directly. Increment ulCriticalNesting to keep a count of how many */ \
|
|
||||||
/* times portENTER_CRITICAL() has been called. */ \
|
|
||||||
usCriticalNesting++; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define portEXIT_CRITICAL() \
|
|
||||||
{ \
|
|
||||||
extern volatile unsigned portSHORT usCriticalNesting; \
|
|
||||||
\
|
|
||||||
if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \
|
|
||||||
{ \
|
|
||||||
/* Decrement the nesting count as we are leaving a critical section. */ \
|
|
||||||
usCriticalNesting--; \
|
|
||||||
\
|
|
||||||
/* If the nesting level has reached zero then interrupts should be */ \
|
|
||||||
/* re-enabled. */ \
|
|
||||||
if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \
|
|
||||||
{ \
|
|
||||||
portENABLE_INTERRUPTS(); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Task utilities. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Manual context switch called by portYIELD or taskYIELD.
|
|
||||||
*/
|
|
||||||
extern void vPortYield( void );
|
|
||||||
#define portYIELD() vPortYield()
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Hardware specifics. */
|
|
||||||
#define portBYTE_ALIGNMENT 2
|
|
||||||
#define portSTACK_GROWTH ( -1 )
|
|
||||||
#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ )
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel
|
|
||||||
|
|
||||||
|
|
||||||
/* Just used by the demo application to indicate which form of interrupt
|
|
||||||
service routine should be used. See the online port documentation for more
|
|
||||||
information. */
|
|
||||||
#define MSP_ROWLEY_RB_PORT
|
|
||||||
|
|
||||||
#define portNOP()
|
|
||||||
|
|
||||||
#endif /* PORTMACRO_H */
|
|
||||||
|
|
|
@ -1,238 +0,0 @@
|
||||||
/*
|
|
||||||
FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 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.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
|
|
||||||
* and even write all or part of your application on your behalf. *
|
|
||||||
* See http://www.OpenRTOS.com for details of the services we provide to *
|
|
||||||
* expedite your project. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Milos Prokic
|
|
||||||
*
|
|
||||||
* File adopted from the MSP430 GCC port
|
|
||||||
* Interrupt handling, xPortStartScheduler, vPortYield, portSAVE_CONTEXT(), portRESTORE_CONTEXT()
|
|
||||||
/* Standard includes. */
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Implementation of functions defined in portable.h for the MSP430 port.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants required for hardware setup. The tick ISR runs off the ACLK,
|
|
||||||
not the MCLK. */
|
|
||||||
#define portACLK_FREQUENCY_HZ ( ( portTickType ) 32768 )
|
|
||||||
#define portINITIAL_CRITICAL_NESTING ( ( unsigned portSHORT ) 10 )
|
|
||||||
#define portFLAGS_INT_ENABLED ( ( portSTACK_TYPE ) 0x08 )
|
|
||||||
|
|
||||||
/* We require the address of the pxCurrentTCB variable, but don't want to know
|
|
||||||
any details of its type. */
|
|
||||||
typedef void tskTCB;
|
|
||||||
extern volatile tskTCB * volatile pxCurrentTCB;
|
|
||||||
|
|
||||||
unsigned portCHAR ucReschedule;
|
|
||||||
|
|
||||||
/* Each task maintains a count of the critical section nesting depth. Each
|
|
||||||
time a critical section is entered the count is incremented. Each time a
|
|
||||||
critical section is exited the count is decremented - with interrupts only
|
|
||||||
being re-enabled if the count is zero.
|
|
||||||
|
|
||||||
usCriticalNesting will get set to zero when the scheduler starts, but must
|
|
||||||
not be initialised to zero as this will cause problems during the startup
|
|
||||||
sequence. */
|
|
||||||
volatile unsigned portSHORT usCriticalNesting = portINITIAL_CRITICAL_NESTING;
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but
|
|
||||||
* could have alternatively used the watchdog timer or timer 1.
|
|
||||||
*/
|
|
||||||
void prvSetupTimerInterrupt( void );
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialise the stack of a task to look exactly as if a call to
|
|
||||||
* portSAVE_CONTEXT had been called.
|
|
||||||
*
|
|
||||||
* See the header file portable.h.
|
|
||||||
*/
|
|
||||||
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Place a few bytes of known values on the bottom of the stack.
|
|
||||||
This is just useful for debugging and can be included if required.
|
|
||||||
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x1111;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x2222;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x3333;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The msp430 automatically pushes the PC then SR onto the stack before
|
|
||||||
executing an ISR. We want the stack to look just as if this has happened
|
|
||||||
so place a pointer to the start of the task on the stack first - followed
|
|
||||||
by the flags we want the task to use when it starts up. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) pxCode;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = portFLAGS_INT_ENABLED;
|
|
||||||
pxTopOfStack--;
|
|
||||||
|
|
||||||
/* Next the general purpose registers. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x4444;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x5555;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x6666;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x7777;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x8888;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0x9999;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xaaaa;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xbbbb;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xcccc;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xdddd;
|
|
||||||
pxTopOfStack--;
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) 0xeeee;
|
|
||||||
pxTopOfStack--;
|
|
||||||
|
|
||||||
/* When the task starts is will expect to find the function parameter in
|
|
||||||
R15. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
|
|
||||||
pxTopOfStack--;
|
|
||||||
|
|
||||||
/* A variable is used to keep track of the critical section nesting.
|
|
||||||
This variable has to be stored as part of the task context and is
|
|
||||||
initially set to zero. */
|
|
||||||
*pxTopOfStack = ( portSTACK_TYPE ) portNO_CRITICAL_SECTION_NESTING;
|
|
||||||
|
|
||||||
/* Return a pointer to the top of the stack we have generated so this can
|
|
||||||
be stored in the task control block for the task. */
|
|
||||||
return pxTopOfStack;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPortEndScheduler( void )
|
|
||||||
{
|
|
||||||
/* It is unlikely that the MSP430 port will get stopped. If required simply
|
|
||||||
disable the tick interrupt here. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hardware initialisation to generate the RTOS tick. This uses timer 0
|
|
||||||
* but could alternatively use the watchdog timer or timer 1.
|
|
||||||
*/
|
|
||||||
void prvSetupTimerInterrupt( void )
|
|
||||||
{
|
|
||||||
/* Ensure the timer is stopped. */
|
|
||||||
TACTL = 0;
|
|
||||||
|
|
||||||
/* Run the timer of the ACLK. */
|
|
||||||
TACTL = TASSEL_1;
|
|
||||||
|
|
||||||
/* Clear everything to start with. */
|
|
||||||
TACTL |= TACLR;
|
|
||||||
|
|
||||||
/* Set the compare match value according to the tick rate we want. */
|
|
||||||
TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ;
|
|
||||||
|
|
||||||
/* Enable the interrupts. */
|
|
||||||
TACCTL0 = CCIE;
|
|
||||||
|
|
||||||
/* Start up clean. */
|
|
||||||
TACTL |= TACLR;
|
|
||||||
|
|
||||||
/* Up mode. */
|
|
||||||
TACTL |= MC_1;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The interrupt service routine used depends on whether the pre-emptive
|
|
||||||
* scheduler is being used or not.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if configUSE_PREEMPTION == 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tick ISR for preemptive scheduler. We can use a naked attribute as
|
|
||||||
* the context is saved at the start of vPortYieldFromTick(). The tick
|
|
||||||
* count is incremented after the context is saved.
|
|
||||||
*/
|
|
||||||
void ISROsTick( void )
|
|
||||||
{
|
|
||||||
/* Increment the tick count then switch to the highest priority task
|
|
||||||
that is ready to run. */
|
|
||||||
vTaskIncrementTick();
|
|
||||||
vTaskSwitchContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tick ISR for the cooperative scheduler. All this does is increment the
|
|
||||||
* tick count. We don't need to switch context, this can only be done by
|
|
||||||
* manual calls to taskYIELD();
|
|
||||||
*/
|
|
||||||
void ISROsTick( void )
|
|
||||||
{
|
|
||||||
vTaskIncrementTick();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,151 +0,0 @@
|
||||||
#include <msp430x14x.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Milos Prokic
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**********************************************************
|
|
||||||
All Interrupts should follow the naming convention : ISR"name" and declared
|
|
||||||
as a normal function in C.
|
|
||||||
|
|
||||||
One must not forget to allocate interrupts below (see the line "MSPINT OsTick"
|
|
||||||
below for an example).
|
|
||||||
|
|
||||||
By default the ISR will not cause the context switch, but if called in
|
|
||||||
conjunction with portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR(wakeup), where
|
|
||||||
wakeup = TRUE upon exit the ISR will force the context switch via the
|
|
||||||
ucReschedule global variable.
|
|
||||||
**********************************************************/
|
|
||||||
MSPINT macro name
|
|
||||||
_##name::
|
|
||||||
call #_portSAVE_CONTEXT
|
|
||||||
call #_ISR##name
|
|
||||||
br #_portSWITCH_EXIT
|
|
||||||
endm
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************
|
|
||||||
API code
|
|
||||||
**********************************************************/
|
|
||||||
|
|
||||||
.CODE
|
|
||||||
_vPortYield::
|
|
||||||
/* Mimic an INT call by pushing SR. */
|
|
||||||
push SR
|
|
||||||
/* no INTs !! */
|
|
||||||
dint
|
|
||||||
/* Save the context of the current task. */
|
|
||||||
call #_portSAVE_CONTEXT
|
|
||||||
/* Switch to the highest priority task that is ready to run. */
|
|
||||||
call #_vTaskSwitchContext
|
|
||||||
/* Restore the context of the new task. */
|
|
||||||
br #_portSWITCH_EXIT
|
|
||||||
|
|
||||||
_xPortStartScheduler::
|
|
||||||
/* Setup the hardware to generate the tick. Interrupts are disabled when
|
|
||||||
this function is called. */
|
|
||||||
call #_prvSetupTimerInterrupt
|
|
||||||
|
|
||||||
/* Restore the context of the first task that is going to run. */
|
|
||||||
jmp _portRESTORE_CONTEXT
|
|
||||||
|
|
||||||
_portSAVE_CONTEXT::
|
|
||||||
/* Function to save the context. When this function is called the
|
|
||||||
return address will appear on the stack. This does not need to be
|
|
||||||
saved so is overwritten by R4 - hence R4 is not saved initially.
|
|
||||||
|
|
||||||
Save the general purpose registers. */
|
|
||||||
push R5
|
|
||||||
push R6
|
|
||||||
push R7
|
|
||||||
push R8
|
|
||||||
push R9
|
|
||||||
push R10
|
|
||||||
push R11
|
|
||||||
push R12
|
|
||||||
push R13
|
|
||||||
push R14
|
|
||||||
push R15
|
|
||||||
|
|
||||||
/* Now R10 has been saved we can use it to hold the return address,
|
|
||||||
which is about to be overwritten. */
|
|
||||||
mov 22(R1),R10
|
|
||||||
|
|
||||||
/* Store R4 where the return address was on the stack. */
|
|
||||||
mov R4,22(R1)
|
|
||||||
|
|
||||||
/* Save the critical nesting depth. */
|
|
||||||
mov.w &_usCriticalNesting, R14
|
|
||||||
push R14
|
|
||||||
|
|
||||||
/* Finally save the new top of stack. */
|
|
||||||
mov.w &_pxCurrentTCB, R12
|
|
||||||
mov.w R1, @R12
|
|
||||||
|
|
||||||
/* No rescheduling by default. */
|
|
||||||
mov.b #0,&_ucReschedule
|
|
||||||
|
|
||||||
/* Return using the saved return address. */
|
|
||||||
br R10
|
|
||||||
|
|
||||||
|
|
||||||
_portSWITCH_EXIT::
|
|
||||||
/* Check ucReschedule to see if a context switch is required. */
|
|
||||||
tst.b &_ucReschedule
|
|
||||||
jz _portRESTORE_CONTEXT
|
|
||||||
call #_vTaskSwitchContext
|
|
||||||
_portRESTORE_CONTEXT::
|
|
||||||
/* Restore the context in the opposite order to the save. */
|
|
||||||
mov.w &_pxCurrentTCB, R12
|
|
||||||
mov.w @R12, R1
|
|
||||||
pop R15
|
|
||||||
mov.w R15, &_usCriticalNesting
|
|
||||||
pop R15
|
|
||||||
pop R14
|
|
||||||
pop R13
|
|
||||||
pop R12
|
|
||||||
pop R11
|
|
||||||
pop R10
|
|
||||||
pop R9
|
|
||||||
pop R8
|
|
||||||
pop R7
|
|
||||||
pop R6
|
|
||||||
pop R5
|
|
||||||
pop R4
|
|
||||||
|
|
||||||
/* Ensure any low power mode bits are cleared within the status
|
|
||||||
register about to be restored. */
|
|
||||||
bic #(SCG1+SCG0+OSCOFF+CPUOFF),0(SP)
|
|
||||||
reti
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************
|
|
||||||
Allocate Interrupts using the MSPINT macro (defined at the top of this file.
|
|
||||||
ex: MSPINT "name"
|
|
||||||
**********************************************************/
|
|
||||||
|
|
||||||
MSPINT OsTick
|
|
||||||
MSPINT Com1Rx
|
|
||||||
MSPINT Com1Tx
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************
|
|
||||||
Interrupt Vectors
|
|
||||||
Timer_A0
|
|
||||||
ex: PORT1 would look like:
|
|
||||||
ORG PORT1_VECTOR
|
|
||||||
DW _"name"
|
|
||||||
**********************************************************/
|
|
||||||
.VECTORS
|
|
||||||
.KEEP
|
|
||||||
|
|
||||||
ORG TIMERA0_VECTOR
|
|
||||||
DW _OsTick
|
|
||||||
|
|
||||||
ORG UART1RX_VECTOR
|
|
||||||
DW _Com1Rx
|
|
||||||
|
|
||||||
ORG UART1TX_VECTOR
|
|
||||||
DW _Com1Tx
|
|
||||||
|
|
||||||
END
|
|
|
@ -1,160 +0,0 @@
|
||||||
/*
|
|
||||||
FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 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.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
|
|
||||||
* and even write all or part of your application on your behalf. *
|
|
||||||
* See http://www.OpenRTOS.com for details of the services we provide to *
|
|
||||||
* expedite your project. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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 double
|
|
||||||
#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
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Interrupt control macros. */
|
|
||||||
#define portDISABLE_INTERRUPTS() _DINT();
|
|
||||||
#define portENABLE_INTERRUPTS() _EINT();
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Critical section control macros. */
|
|
||||||
#define portNO_CRITICAL_SECTION_NESTING ( ( unsigned portSHORT ) 0 )
|
|
||||||
|
|
||||||
#define portENTER_CRITICAL() \
|
|
||||||
{ \
|
|
||||||
extern volatile unsigned portSHORT usCriticalNesting; \
|
|
||||||
\
|
|
||||||
portDISABLE_INTERRUPTS(); \
|
|
||||||
\
|
|
||||||
/* Now interrupts are disabled ulCriticalNesting can be accessed */ \
|
|
||||||
/* directly. Increment ulCriticalNesting to keep a count of how many */ \
|
|
||||||
/* times portENTER_CRITICAL() has been called. */ \
|
|
||||||
usCriticalNesting++; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define portEXIT_CRITICAL() \
|
|
||||||
{ \
|
|
||||||
extern volatile unsigned portSHORT usCriticalNesting; \
|
|
||||||
\
|
|
||||||
if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \
|
|
||||||
{ \
|
|
||||||
/* Decrement the nesting count as we are leaving a critical section. */ \
|
|
||||||
usCriticalNesting--; \
|
|
||||||
\
|
|
||||||
/* If the nesting level has reached zero then interrupts should be */ \
|
|
||||||
/* re-enabled. */ \
|
|
||||||
if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \
|
|
||||||
{ \
|
|
||||||
portENABLE_INTERRUPTS(); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Task utilities. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Manual context switch called by portYIELD or taskYIELD.
|
|
||||||
*/
|
|
||||||
extern void vPortYield( void );
|
|
||||||
|
|
||||||
#define portYIELD() vPortYield()
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define portENTER_SWITCHING_ISR()
|
|
||||||
#define portEXIT_SWITCHING_ISR( SwitchRequired ) \
|
|
||||||
{ \
|
|
||||||
extern unsigned portCHAR ucReschedule; \
|
|
||||||
if( SwitchRequired ) \
|
|
||||||
{ \
|
|
||||||
ucReschedule = 1; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hardwware specifics. */
|
|
||||||
#define portBYTE_ALIGNMENT 2
|
|
||||||
#define portSTACK_GROWTH ( -1 )
|
|
||||||
#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ )
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel
|
|
||||||
|
|
||||||
/* Compiler specifics. */
|
|
||||||
#define portNOP()
|
|
||||||
|
|
||||||
|
|
||||||
/* Just used by the demo application to indicate which form of interrupt
|
|
||||||
service routine should be used. See the online port documentation for more
|
|
||||||
information. */
|
|
||||||
#define MSP_ROWLEY_MP_PORT
|
|
||||||
|
|
||||||
#endif /* PORTMACRO_H */
|
|
||||||
|
|
|
@ -47,7 +47,8 @@
|
||||||
licensing and training services.
|
licensing and training services.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "FreeRTOSConfig.h"
|
#ifndef PORT_ASM_H
|
||||||
|
#define PORT_ASM_H
|
||||||
|
|
||||||
portSAVE_CONTEXT macro
|
portSAVE_CONTEXT macro
|
||||||
/* Save the remaining registers. */
|
/* Save the remaining registers. */
|
||||||
|
@ -97,76 +98,5 @@ portRESTORE_CONTEXT macro
|
||||||
endm
|
endm
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
.CODE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The RTOS tick ISR.
|
|
||||||
*
|
|
||||||
* If the cooperative scheduler is in use this simply increments the tick
|
|
||||||
* count.
|
|
||||||
*
|
|
||||||
* If the preemptive scheduler is in use a context switch can also occur.
|
|
||||||
*/
|
|
||||||
_vTickISR:
|
|
||||||
portSAVE_CONTEXT
|
|
||||||
|
|
||||||
call #_vTaskIncrementTick
|
|
||||||
|
|
||||||
#if configUSE_PREEMPTION == 1
|
|
||||||
call #_vTaskSwitchContext
|
|
||||||
#endif
|
|
||||||
|
|
||||||
portRESTORE_CONTEXT
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Manual context switch called by the portYIELD() macro.
|
|
||||||
*/
|
|
||||||
_vPortYield::
|
|
||||||
|
|
||||||
/* Mimic an interrupt by pushing the SR. */
|
|
||||||
push SR
|
|
||||||
|
|
||||||
/* Now the SR is stacked we can disable interrupts. */
|
|
||||||
dint
|
|
||||||
|
|
||||||
/* Save the context of the current task. */
|
|
||||||
portSAVE_CONTEXT
|
|
||||||
|
|
||||||
/* Switch to the highest priority task that is ready to run. */
|
|
||||||
call #_vTaskSwitchContext
|
|
||||||
|
|
||||||
/* Restore the context of the new task. */
|
|
||||||
portRESTORE_CONTEXT
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start off the scheduler by initialising the RTOS tick timer, then restoring
|
|
||||||
* the context of the first task.
|
|
||||||
*/
|
|
||||||
_xPortStartScheduler::
|
|
||||||
|
|
||||||
/* Setup the hardware to generate the tick. Interrupts are disabled
|
|
||||||
when this function is called. */
|
|
||||||
call #_prvSetupTimerInterrupt
|
|
||||||
|
|
||||||
/* Restore the context of the first task that is going to run. */
|
|
||||||
portRESTORE_CONTEXT
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Place the tick ISR in the correct vector. */
|
|
||||||
.VECTORS
|
|
||||||
|
|
||||||
.KEEP
|
|
||||||
|
|
||||||
ORG TIMERA0_VECTOR
|
|
||||||
DW _vTickISR
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END
|
|
||||||
|
|
|
@ -48,54 +48,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "FreeRTOSConfig.h"
|
#include "FreeRTOSConfig.h"
|
||||||
|
#include "portasm.h"
|
||||||
portSAVE_CONTEXT macro
|
|
||||||
/* Save the remaining registers. */
|
|
||||||
push r4
|
|
||||||
push r5
|
|
||||||
push r6
|
|
||||||
push r7
|
|
||||||
push r8
|
|
||||||
push r9
|
|
||||||
push r10
|
|
||||||
push r11
|
|
||||||
push r12
|
|
||||||
push r13
|
|
||||||
push r14
|
|
||||||
push r15
|
|
||||||
mov.w &_usCriticalNesting, r14
|
|
||||||
push r14
|
|
||||||
mov.w &_pxCurrentTCB, r12
|
|
||||||
mov.w r1, @r12
|
|
||||||
endm
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
portRESTORE_CONTEXT macro
|
|
||||||
mov.w &_pxCurrentTCB, r12
|
|
||||||
mov.w @r12, r1
|
|
||||||
pop r15
|
|
||||||
mov.w r15, &_usCriticalNesting
|
|
||||||
pop r15
|
|
||||||
pop r14
|
|
||||||
pop r13
|
|
||||||
pop r12
|
|
||||||
pop r11
|
|
||||||
pop r10
|
|
||||||
pop r9
|
|
||||||
pop r8
|
|
||||||
pop r7
|
|
||||||
pop r6
|
|
||||||
pop r5
|
|
||||||
pop r4
|
|
||||||
|
|
||||||
/* The last thing on the stack will be the status register.
|
|
||||||
Ensure the power down bits are clear ready for the next
|
|
||||||
time this power down register is popped from the stack. */
|
|
||||||
bic.w #0xf0,0(SP)
|
|
||||||
|
|
||||||
reti
|
|
||||||
endm
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
.CODE
|
.CODE
|
||||||
|
|
|
@ -138,11 +138,12 @@ extern void vPortYield( void );
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel
|
||||||
|
|
||||||
|
#if configINTERRUPT_EXAMPLE_METHOD == 2
|
||||||
|
|
||||||
/* Just used by the demo application to indicate which form of interrupt
|
extern void vTaskSwitchContext( void );
|
||||||
service routine should be used. See the online port documentation for more
|
#define portYIELD_FROM_ISR( x ) if( x ) vTaskSwitchContext()
|
||||||
information. */
|
|
||||||
#define MSP_ROWLEY_RB_PORT
|
#endif
|
||||||
|
|
||||||
#endif /* PORTMACRO_H */
|
#endif /* PORTMACRO_H */
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
To use Port1, copy the three files from the Port1 directory into this directory.
|
|
||||||
|
|
||||||
To use Port2, copy the three files from the Port2 directory into this directory.
|
|
||||||
|
|
||||||
Ensure to perform a complete rebuild.
|
|
Loading…
Reference in a new issue