From: richardbarry Date: Wed, 29 Dec 2010 18:46:02 +0000 (+0000) Subject: Tidy up the port layer for the MSP430X IAR port - still a work in progress. X-Git-Tag: V6.1.1~67 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=bb365559cbe2ac3feb9c90e79a8fce01e05e231c;p=freertos Tidy up the port layer for the MSP430X IAR port - still a work in progress. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1190 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/Source/portable/IAR/MSP430X/port.c b/Source/portable/IAR/MSP430X/port.c index 669561cb6..5c44aa113 100644 --- a/Source/portable/IAR/MSP430X/port.c +++ b/Source/portable/IAR/MSP430X/port.c @@ -97,8 +97,6 @@ void vPortSetupTimerInterrupt( void ); */ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) { -unsigned short usNibble; -unsigned long ulSP_PC_Combined; unsigned short *pusTopOfStack; /* @@ -113,30 +111,13 @@ unsigned short *pusTopOfStack; pxTopOfStack--; */ - /* The msp430x 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. */ - - /* When placed on the stack, the top four bits of the status register - contain bits 19:16 of the 20 bit return address (pxCode). */ -#ifdef GENERATE_ISR_STACK_FRAME - usNibble = ( unsigned short ) ( ( ( unsigned long ) pxCode >> 15UL ) & 0x0fUL ); - - ulSP_PC_Combined = ( unsigned long ) pxCode; - ulSP_PC_Combined <<= 16; - ulSP_PC_Combined |= ( usNibble << 12 ); - ulSP_PC_Combined |= portFLAGS_INT_ENABLED; - *pxTopOfStack = ulSP_PC_Combined; - pxTopOfStack--; -#else *pxTopOfStack = ( portSTACK_TYPE ) pxCode; pusTopOfStack = ( unsigned short * ) pxTopOfStack; pusTopOfStack--; *pusTopOfStack = portFLAGS_INT_ENABLED; pusTopOfStack -= 2; pxTopOfStack = ( portSTACK_TYPE * ) pusTopOfStack; -#endif + /* Next the general purpose registers. */ *pxTopOfStack = ( portSTACK_TYPE ) 0xffffff; pxTopOfStack--; @@ -154,12 +135,8 @@ unsigned short *pusTopOfStack; pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x888888; pxTopOfStack--; - - /* When the task starts is will expect to find the function parameter in - R15. */ *pxTopOfStack = ( portSTACK_TYPE ) 0x555555; pxTopOfStack--; - *pxTopOfStack = ( portSTACK_TYPE ) 0x666666; pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x555555; diff --git a/Source/portable/IAR/MSP430X/portext.s43 b/Source/portable/IAR/MSP430X/portext.s43 index ee2daeb74..fe4e90714 100644 --- a/Source/portable/IAR/MSP430X/portext.s43 +++ b/Source/portable/IAR/MSP430X/portext.s43 @@ -71,8 +71,13 @@ * * If the preemptive scheduler is in use a context switch can also occur. */ + RSEG ISR_CODE + vTickISR: + + /* The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + to save it manually before it gets modified (interrupts get disabled). */ push.w sr portSAVE_CONTEXT @@ -92,15 +97,9 @@ vTickISR: */ vPortYield: - /* Mimic an interrupt by combining the SR and the PC, the latter having - already been pushed onto the stack. R14 is a scratch registers. */ -// popx.a r14 /* r14 will hold the 20 bit PC. */ -// push.w r14 /* Push just 16 bits of the 20bit PC back onto the stack. */ -// rram.a #4, r14 /* Move the top 4 bits of the PC down ready to be combined with the SP. */ -// and.w #0xf000, r14/* Ensure other bits are clear. */ -// add.w sr, r14 /* Combine the top 4 bits of the PC with the SR. */ -// push.w r14 /* Push the generated combined value onto the stack. */ + /* The sr needs saving before it is modified. */ push.w sr + /* Now the SR is stacked we can disable interrupts. */ dint nop @@ -130,15 +129,5 @@ xPortStartScheduler: portRESTORE_CONTEXT /*-----------------------------------------------------------*/ - - /* Install vTickISR as the interrupt on the vector specified by the - application code. */ - /*COMMON INTVEC *./ - /*ORG 0xFF80 + configTICK_INTERRUPT_VECTOR - ORG 0xFFEC - - __vTickISR__: DC16 0xabcd*/ - - END