Allow auto switching between creating tasks in ARM mode and THUMB mode.

This commit is contained in:
Richard Barry 2009-09-29 20:03:09 +00:00
parent b500ab8be2
commit afaa3321ba

View file

@ -72,7 +72,8 @@
#define portRESET_COUNT_ON_MATCH ( ( unsigned portLONG ) 0x02 ) #define portRESET_COUNT_ON_MATCH ( ( unsigned portLONG ) 0x02 )
/* Constants required to setup the initial stack. */ /* Constants required to setup the initial stack. */
#define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */
#define portTHUMB_MODE_BIT ( ( portSTACK_TYPE ) 0x20 )
#define portINSTRUCTION_SIZE ( ( portSTACK_TYPE ) 4 ) #define portINSTRUCTION_SIZE ( ( portSTACK_TYPE ) 4 )
/* Constants required to setup the PIT. */ /* Constants required to setup the PIT. */
@ -165,6 +166,13 @@ portSTACK_TYPE *pxOriginalTOS;
/* The status register is set for system mode, with interrupts enabled. */ /* The status register is set for system mode, with interrupts enabled. */
*pxTopOfStack = ( portSTACK_TYPE ) portINITIAL_SPSR; *pxTopOfStack = ( portSTACK_TYPE ) portINITIAL_SPSR;
if( ( ( unsigned long ) pxCode & 0x01UL ) != 0x00UL )
{
/* We want the task to start in thumb mode. */
*pxTopOfStack |= portTHUMB_MODE_BIT;
}
pxTopOfStack--; pxTopOfStack--;
/* Interrupt flags cannot always be stored on the stack and will /* Interrupt flags cannot always be stored on the stack and will