Convert the CCS4 MSP430X port layer to permit large and small data models, and large and small code models.

This commit is contained in:
Richard Barry 2011-01-03 16:48:59 +00:00
parent 2c894e0f55
commit 9a24d4a37f
4 changed files with 155 additions and 44 deletions

View file

@ -98,6 +98,7 @@ void vPortSetupTimerInterrupt( void );
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
unsigned short *pusTopOfStack;
unsigned long *pulTopOfStack;
/*
Place a few bytes of known values on the bottom of the stack.
@ -111,38 +112,61 @@ unsigned short *pusTopOfStack;
pxTopOfStack--;
*/
*pxTopOfStack = ( portSTACK_TYPE ) pxCode;
pusTopOfStack = ( unsigned short * ) pxTopOfStack;
/* Data types are need either 16 bits or 32 bits depending on the data
and code model used. */
if( sizeof( pxCode ) == sizeof( unsigned short ) )
{
pusTopOfStack = ( unsigned short * ) pxTopOfStack;
*pusTopOfStack = ( unsigned short ) pxCode;
}
else
{
/* Make room for a 20 bit value stored as a 32 bit value. */
pusTopOfStack = ( unsigned short * ) pxTopOfStack;
pusTopOfStack--;
pulTopOfStack = ( unsigned long * ) pusTopOfStack;
*pulTopOfStack = ( unsigned long ) pxCode;
pusTopOfStack = ( unsigned short * ) pulTopOfStack;
}
pusTopOfStack--;
*pusTopOfStack = portFLAGS_INT_ENABLED;
pusTopOfStack -= 2;
pusTopOfStack -= ( sizeof( portSTACK_TYPE ) / 2 );
/* From here on the size of stacked items depends on the memory model. */
pxTopOfStack = ( portSTACK_TYPE * ) pusTopOfStack;
/* Next the general purpose registers. */
*pxTopOfStack = ( portSTACK_TYPE ) 0xffffff;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xeeeeee;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xdddddd;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xbbbbbb;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xaaaaaa;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x999999;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x888888;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x555555;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x666666;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x555555;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x444444;
pxTopOfStack--;
#ifdef PRELOAD_REGISTER_VALUES
*pxTopOfStack = ( portSTACK_TYPE ) 0xffff;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xeeee;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xdddd;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xbbbb;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0xaaaa;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x9999;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x8888;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x5555;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x6666;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x5555;
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x4444;
pxTopOfStack--;
#else
pxTopOfStack -= 3;
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;
pxTopOfStack -= 9;
#endif
/* 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