From 314f281a9a4168c9efba12e06d9cfbb16f6be68c Mon Sep 17 00:00:00 2001 From: richardbarry Date: Thu, 23 Oct 2008 19:14:45 +0000 Subject: [PATCH] Remove the two separate ports, instead use two demo apps that use a conditional compilation to select the method of interrupt management to use. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@518 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../portable/Rowley/MSP430F449/Port1/port.c | 194 -------------- .../Rowley/MSP430F449/Port1/portmacro.h | 149 ----------- .../portable/Rowley/MSP430F449/Port2/port.c | 238 ------------------ .../Rowley/MSP430F449/Port2/portext.asm | 151 ----------- .../Rowley/MSP430F449/Port2/portmacro.h | 160 ------------ .../{Port1/portext.asm => portasm.h} | 76 +----- Source/portable/Rowley/MSP430F449/portext.asm | 49 +--- Source/portable/Rowley/MSP430F449/portmacro.h | 9 +- Source/portable/Rowley/MSP430F449/readme.txt | 5 - 9 files changed, 9 insertions(+), 1022 deletions(-) delete mode 100644 Source/portable/Rowley/MSP430F449/Port1/port.c delete mode 100644 Source/portable/Rowley/MSP430F449/Port1/portmacro.h delete mode 100644 Source/portable/Rowley/MSP430F449/Port2/port.c delete mode 100644 Source/portable/Rowley/MSP430F449/Port2/portext.asm delete mode 100644 Source/portable/Rowley/MSP430F449/Port2/portmacro.h rename Source/portable/Rowley/MSP430F449/{Port1/portext.asm => portasm.h} (65%) delete mode 100644 Source/portable/Rowley/MSP430F449/readme.txt diff --git a/Source/portable/Rowley/MSP430F449/Port1/port.c b/Source/portable/Rowley/MSP430F449/Port1/port.c deleted file mode 100644 index 3138a949a..000000000 --- a/Source/portable/Rowley/MSP430F449/Port1/port.c +++ /dev/null @@ -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; -} -/*-----------------------------------------------------------*/ - - - diff --git a/Source/portable/Rowley/MSP430F449/Port1/portmacro.h b/Source/portable/Rowley/MSP430F449/Port1/portmacro.h deleted file mode 100644 index 5ba0073df..000000000 --- a/Source/portable/Rowley/MSP430F449/Port1/portmacro.h +++ /dev/null @@ -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 */ - diff --git a/Source/portable/Rowley/MSP430F449/Port2/port.c b/Source/portable/Rowley/MSP430F449/Port2/port.c deleted file mode 100644 index a882d6498..000000000 --- a/Source/portable/Rowley/MSP430F449/Port2/port.c +++ /dev/null @@ -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 - -/* 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 - - - diff --git a/Source/portable/Rowley/MSP430F449/Port2/portext.asm b/Source/portable/Rowley/MSP430F449/Port2/portext.asm deleted file mode 100644 index e72039f8d..000000000 --- a/Source/portable/Rowley/MSP430F449/Port2/portext.asm +++ /dev/null @@ -1,151 +0,0 @@ -#include - -/* - * 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 diff --git a/Source/portable/Rowley/MSP430F449/Port2/portmacro.h b/Source/portable/Rowley/MSP430F449/Port2/portmacro.h deleted file mode 100644 index caeda43e1..000000000 --- a/Source/portable/Rowley/MSP430F449/Port2/portmacro.h +++ /dev/null @@ -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 */ - diff --git a/Source/portable/Rowley/MSP430F449/Port1/portext.asm b/Source/portable/Rowley/MSP430F449/portasm.h similarity index 65% rename from Source/portable/Rowley/MSP430F449/Port1/portext.asm rename to Source/portable/Rowley/MSP430F449/portasm.h index aa616ad1d..fd0d8c28a 100644 --- a/Source/portable/Rowley/MSP430F449/Port1/portext.asm +++ b/Source/portable/Rowley/MSP430F449/portasm.h @@ -47,7 +47,8 @@ licensing and training services. */ -#include "FreeRTOSConfig.h" +#ifndef PORT_ASM_H +#define PORT_ASM_H portSAVE_CONTEXT macro /* Save the remaining registers. */ @@ -97,76 +98,5 @@ portRESTORE_CONTEXT macro 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 - diff --git a/Source/portable/Rowley/MSP430F449/portext.asm b/Source/portable/Rowley/MSP430F449/portext.asm index aa616ad1d..3e465a7f5 100644 --- a/Source/portable/Rowley/MSP430F449/portext.asm +++ b/Source/portable/Rowley/MSP430F449/portext.asm @@ -48,54 +48,7 @@ */ #include "FreeRTOSConfig.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 -/*-----------------------------------------------------------*/ +#include "portasm.h" .CODE diff --git a/Source/portable/Rowley/MSP430F449/portmacro.h b/Source/portable/Rowley/MSP430F449/portmacro.h index 4835d278a..58b402822 100644 --- a/Source/portable/Rowley/MSP430F449/portmacro.h +++ b/Source/portable/Rowley/MSP430F449/portmacro.h @@ -138,11 +138,12 @@ extern void vPortYield( void ); #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) #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 -service routine should be used. See the online port documentation for more -information. */ -#define MSP_ROWLEY_RB_PORT +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) if( x ) vTaskSwitchContext() + +#endif #endif /* PORTMACRO_H */ diff --git a/Source/portable/Rowley/MSP430F449/readme.txt b/Source/portable/Rowley/MSP430F449/readme.txt deleted file mode 100644 index f438b3642..000000000 --- a/Source/portable/Rowley/MSP430F449/readme.txt +++ /dev/null @@ -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. \ No newline at end of file -- 2.39.2