Replace the CLZ function with a CLZ intrinsic in the Cortex-R4 port layer.

Add EDS support in the PIC24 port layer.
Remove unnecessary EHB instructions from PIC32 port.
In the PIC32 port assembly code, replace the &= code with a single ins instruction.
This commit is contained in:
Richard Barry 2013-01-23 16:06:45 +00:00
parent b5cf299df1
commit 4e7b460eaf
6 changed files with 107 additions and 83 deletions

View file

@ -233,15 +233,6 @@ vPortPreemptiveTick:
; Restore the context of the task selected to execute. ; Restore the context of the task selected to execute.
portRESTORE_CONTEXT portRESTORE_CONTEXT
;-------------------------------------------------------------------------------
.def ulPortCountLeadingZeros
ulPortCountLeadingZeros:
CLZ R0, R0
BX LR
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
.if (__TI_VFP_SUPPORT__) .if (__TI_VFP_SUPPORT__)

View file

@ -122,9 +122,6 @@ extern void vPortYield( void );
/* Architecture specific optimisations. */ /* Architecture specific optimisations. */
#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
/* Generic helper function. */
unsigned long ulPortCountLeadingZeros( unsigned long ulBitmap );
/* Check the configuration. */ /* Check the configuration. */
#if( configMAX_PRIORITIES > 32 ) #if( configMAX_PRIORITIES > 32 )
#error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice.
@ -136,7 +133,7 @@ extern void vPortYield( void );
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - ulPortCountLeadingZeros( ( uxReadyPriorities ) ) ) #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )
#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */

View file

@ -103,6 +103,27 @@ unsigned portBASE_TYPE uxCriticalNesting = 0xef;
#ifdef MPLAB_PIC24_PORT #ifdef MPLAB_PIC24_PORT
#ifdef __HAS_EDS__
#define portRESTORE_CONTEXT() \
asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \
"MOV [W0], W15 \n" \
"POP W0 \n" /* Restore the critical nesting counter for the task. */ \
"MOV W0, _uxCriticalNesting \n" \
"POP DSWPAG \n" \
"POP DSRPAG \n" \
"POP CORCON \n" \
"POP TBLPAG \n" \
"POP RCOUNT \n" /* Restore the registers from the stack. */ \
"POP W14 \n" \
"POP.D W12 \n" \
"POP.D W10 \n" \
"POP.D W8 \n" \
"POP.D W6 \n" \
"POP.D W4 \n" \
"POP.D W2 \n" \
"POP.D W0 \n" \
"POP SR " );
#else /* __HAS_EDS__ */
#define portRESTORE_CONTEXT() \ #define portRESTORE_CONTEXT() \
asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \
"MOV [W0], W15 \n" \ "MOV [W0], W15 \n" \
@ -121,7 +142,7 @@ unsigned portBASE_TYPE uxCriticalNesting = 0xef;
"POP.D W2 \n" \ "POP.D W2 \n" \
"POP.D W0 \n" \ "POP.D W0 \n" \
"POP SR " ); "POP SR " );
#endif /* __HAS_EDS__ */
#endif /* MPLAB_PIC24_PORT */ #endif /* MPLAB_PIC24_PORT */
#ifdef MPLAB_DSPIC_PORT #ifdef MPLAB_DSPIC_PORT
@ -235,8 +256,16 @@ const portSTACK_TYPE xInitialStack[] =
*pxTopOfStack = CORCON; *pxTopOfStack = CORCON;
pxTopOfStack++; pxTopOfStack++;
#if defined(__HAS_EDS__)
*pxTopOfStack = DSRPAG;
pxTopOfStack++;
*pxTopOfStack = DSWPAG;
pxTopOfStack++;
#else /* __HAS_EDS__ */
*pxTopOfStack = PSVPAG; *pxTopOfStack = PSVPAG;
pxTopOfStack++; pxTopOfStack++;
#endif /* __HAS_EDS__ */
/* Finally the critical nesting depth. */ /* Finally the critical nesting depth. */
*pxTopOfStack = 0x00; *pxTopOfStack = 0x00;

View file

@ -88,7 +88,12 @@ _vPortYield:
PUSH TBLPAG PUSH TBLPAG
PUSH CORCON PUSH CORCON
#ifdef __HAS_EDS__
PUSH DSRPAG
PUSH DSWPAG
#else
PUSH PSVPAG PUSH PSVPAG
#endif /* __HAS_EDS__ */
MOV _uxCriticalNesting, W0 /* Save the critical nesting counter for the task. */ MOV _uxCriticalNesting, W0 /* Save the critical nesting counter for the task. */
PUSH W0 PUSH W0
MOV _pxCurrentTCB, W0 /* Save the new top of stack into the TCB. */ MOV _pxCurrentTCB, W0 /* Save the new top of stack into the TCB. */
@ -100,7 +105,12 @@ _vPortYield:
MOV [W0], W15 MOV [W0], W15
POP W0 /* Restore the critical nesting counter for the task. */ POP W0 /* Restore the critical nesting counter for the task. */
MOV W0, _uxCriticalNesting MOV W0, _uxCriticalNesting
#ifdef __HAS_EDS__
POP DSWPAG
POP DSRPAG
#else
POP PSVPAG POP PSVPAG
#endif /* __HAS_EDS__ */
POP CORCON POP CORCON
POP TBLPAG POP TBLPAG
POP RCOUNT /* Restore the registers from the stack. */ POP RCOUNT /* Restore the registers from the stack. */

View file

@ -224,7 +224,6 @@
mtc0 k0, _CP0_STATUS mtc0 k0, _CP0_STATUS
mtc0 k1, _CP0_EPC mtc0 k1, _CP0_EPC
ehb
eret eret
nop nop

View file

@ -222,8 +222,7 @@ vPortYieldISR:
/* Clear the software interrupt in the core. */ /* Clear the software interrupt in the core. */
mfc0 s6, _CP0_CAUSE mfc0 s6, _CP0_CAUSE
addiu s4,zero,-257 ins s6, zero, 8, 1
and s6, s6, s4
mtc0 s6, _CP0_CAUSE mtc0 s6, _CP0_CAUSE
/* Clear the interrupt in the interrupt controller. */ /* Clear the interrupt in the interrupt controller. */
@ -298,7 +297,6 @@ vPortYieldISR:
mtc0 k1, _CP0_STATUS mtc0 k1, _CP0_STATUS
mtc0 k0, _CP0_EPC mtc0 k0, _CP0_EPC
ehb
eret eret
nop nop