]> git.sur5r.net Git - freertos/blobdiff - Source/portable/GCC/CORTUS_APS3/portmacro.h
Simplify the Cortus port - removing the interrupt stack and interrupt nesting capability.
[freertos] / Source / portable / GCC / CORTUS_APS3 / portmacro.h
index 975759ce0bd3bfe0377580dac241af6c0cfbcad1..6ee5a7bdfde4074577c6dc2668cb45afed3997e7 100644 (file)
@@ -96,19 +96,13 @@ extern "C" {
 #define portCRITICAL_NESTING_IN_TCB                                    1
 #define portIRQ_TRAP_YIELD                                                     31
 #define portKERNEL_INTERRUPT_PRIORITY_LEVEL                    0
-#define portSYSTEM_INTERRUPT_PRIORITY_LEVEL                    1
+#define portSYSTEM_INTERRUPT_PRIORITY_LEVEL                    0
 /*-----------------------------------------------------------*/
 
 /* Task utilities. */
 
 extern void vPortYield( void );
 
-/**
- * Interrupt Handlers that access RTOS API functions use a separate interrupt stack
- * and so the nesting depth needs to be recorded to know when to switch from the
- * interrupt stack back to the Task stack.
- */
-extern volatile unsigned portBASE_TYPE uxInterruptNestingCount;
 /*---------------------------------------------------------------------------*/
 
 #define portYIELD()            asm __volatile__( " trap #%0 "::"i"(portIRQ_TRAP_YIELD):"memory")
@@ -124,98 +118,39 @@ extern void vTaskExitCritical( void );
 #define portDISABLE_INTERRUPTS() ic->cpl = ( portSYSTEM_INTERRUPT_PRIORITY_LEVEL + 1 )
 #define portENABLE_INTERRUPTS() ic->cpl = portKERNEL_INTERRUPT_PRIORITY_LEVEL
 
-#define portSET_INTERRUPT_MASK_FROM_ISR() ic->cpl; portDISABLE_INTERRUPTS()
-#define portRESTORE_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) ic->cpl = uxSavedInterruptStatus
 /*---------------------------------------------------------------------------*/
 
-#define portYIELD_FROM_ISR()                                                                                                                           \
-       {                                                                                                                                                                               \
-               asm __volatile__(                                                                                                                                       \
-                       " sub           r1, #4                  \n"             /* Make space on the stack. */                          \
-                       " movhi         r2, #16384              \n"             /* Load the pointer to the IC. */                       \
-                       " ldub          r3, [r2]+2              \n"             /* Copy the Current Priority Level. */          \
-                       " st            r3, [r1]                \n"             /* Store it on the stack. */                            \
-                       " mov           r3, #%0                 \n"             /* Load the highest priority level. */          \
-                       " stb           r3, [r2]+2              \n"             /* Set the CPL to the highest level. */         \
-                       " call          vTaskSwitchContext      \n"     /* Select a new pxCurrentTCB. */                        \
-                       " ld            r3, [r1]                \n"             /* Load the previous CPL from the stack. */     \
-                       " movhi         r2, #16384              \n"             /* Load the pointer to the IC. */                       \
-                       " stb           r3, [r2]+2              \n"             /* Set the CPL to the previous CPL. */          \
-                       " add           r1, #4                  "               /* Fix the stack. */                                            \
-                       :                                                                                                                                                               \
-                       :"i"(portSYSTEM_INTERRUPT_PRIORITY_LEVEL+1)                                                                             \
-                       :"r2","r3");                                                                                                                                    \
-       }
+#define portYIELD_FROM_ISR() vTaskSwitchContext()
 
 /*---------------------------------------------------------------------------*/
 
-#define portSAVE_CONTEXT_REDUCED()                             \
-       {                                                                                       \
-               asm __volatile__(                                               \
-                       /* "sub r1, #0x28"              */                      /* Prologue generated by the compiler. */ \
-                       /* "stq r4, [r1]+0x8"   */                      \
-                       /* "mov r6, psr"                */                      \
-                       /* "mov r7, rtt"                */                      \
-                       /* "std r6, [r1]+0x20"  */                      \
-                       /* "std r14, [r1]+0x18" */                      \
-                       /* "std r2, [r1]"       */                              \
-                       /* "mov r14, r1"        */                              \
-                       "sub    r1, #0x1c                               \n"     /* Make space on the stack. */  \
-                       "stq    r8, [r1]                                \n"     /* Store the remaining context registers. */    \
-                       "std    r12, [r1]+0x10                  \n"     \
-                       "movhi  r2, #16384                              \n"     /* Set the pointer to the IC. */        \
-                       "ldub   r3, [r2]+2                              \n"     /* Load the current priority level. */  \
-                       "st             r3, [r1]+0x18                   \n"     /* Store the current priority level on the stack. */ \
-                       "ldub   r3, [r2]+3                              \n"     /* Load the interrupt priority level. */        \
-                       "add    r3, #1                                  \n"     /* Increase the priority by one. */     \
-                       "stb    r3, [r2]+2                              \n" /* Set the current priority level to be above this one. */  \
-                       "ld             r4, [r0]+short(puxInterruptNestingCount)        \n"     /*[r0]+short(puxInterruptNestingCount) */ \
-                       "ld             r5, [r4]                                \n"     \
-                       "add    r5, #1                                  \n"     /* Increment the interrupt nesting count. */    \
-                       "st             r5, [r4]                                \n"     \
-                       "cmp    r5, #1                                  \n"     /* Is this the first interrupt? */      \
-                       "bne.s  12                                              \n" /* If it is then save the stack pointer to the current TCB? */      \
-                       "ld             r2, [r0]+short(pxCurrentTCB)    \n"     /* Load the pointer to the TCB. */      \
-                       "st             r1, [r2]                                \n"     /* Save the stack pointer into the TCB. */      \
-                       "ld             r1, [r0]+short(puxTopOfInterruptStack)          \n"     /* Switch to the dedicated interrupt stack. */  /* [r0]+short(uxInterruptStack) */      \
-                       "mov    r14, r1                                 \n"     /* Compiler expects r14 to be set to the function stack. */     \
-                       "movhi  r2, #3                                  \n"     /* Re-enable interrupts (re-enable breakpoints). */     \
-                       "mov    psr, r2                                 \n"     \
-                       :::"r2","r3","r4","r5","r15"    );      /* Clobber list includes all of the caller saved registers so that they are saved as part of the Interrupt handler pre-amble. */        \
-       }
+#define portSAVE_CONTEXT()                             \
+       asm __volatile__(                                               \
+               "sub    r1, #0x1c                               \n"     /* Make space on the stack. */  \
+               "stq    r8, [r1]                                \n"     /* Store the remaining context registers. */    \
+               "std    r12, [r1]+0x10                  \n"     \
+               "movhi  r2, #16384                              \n"     /* Set the pointer to the IC. */        \
+               "ldub   r3, [r2]+2                              \n"     /* Load the current interrupt mask. */  \
+               "st             r3, [r1]+0x18                   \n"     /* Store the interrupt mask on the stack. */ \
+               "ld             r2, [r0]+short(pxCurrentTCB)    \n"     /* Load the pointer to the TCB. */      \
+               "st             r1, [r2]                                \n"     /* Save the stack pointer into the TCB. */      \
+               "mov    r14, r1                                 \n"     /* Compiler expects r14 to be set to the function stack. */     \
+               :::"r2","r3","r4","r5","r15"    );      /* Clobber list includes all of the caller saved registers so that they are saved as part of the Interrupt handler pre-amble. */
 /*---------------------------------------------------------------------------*/
 
-#define portRESTORE_CONTEXT_REDUCED()                  \
-       {                                                                                       \
-               asm __volatile__(                                               \
-                       "movhi  r2, #2                                  \n"     /* Disable interrupts (disable breakpoints). */ \
-                       "mov    psr, r2                                 \n"     \
-                       "ld             r2, [r0]+short(puxInterruptNestingCount)        \n"     \
-                       "ld             r3, [r2]                                \n"     \
-                       "sub    r3, #1                                  \n"     /* Decrement the interrupt nesting count. */    \
-                       "st             r3, [r2]                                \n"     \
-                       "cmp    r3, r0                                  \n"     /* Is this the first interrupt? */      \
-                       "bne.s  8                                               \n"     /* Are we at the end of unrolling the interrupt nesting? */     \
-                       "ld             r2, [r0]+short(pxCurrentTCB)    \n"     /* Load the TCB to find the stack pointer and context. */       \
-                       "ld             r1, [r2]                                \n"     \
-                       "movhi  r2, #16384                              \n"     /* Set the pointer to the IC. */        \
-                       "ld             r3, [r1]+0x18                   \n"     /* Load the previous current priority level. */ \
-                       "stb    r3, [r2]+2                      \n"     /* Set the current priority level to be the previous. */        \
-                       "ldd    r12, [r1]+0x10                  \n"     /* Restore the callee saved registers. Caller saved registers are restored by the function exit. */     \
-                       "ldq    r8, [r1]                                \n"     \
-                       "add    r1, #0x1c                               \n"     \
-                       "mov    r14, r1                                 \n"     \
-                       /* "mov r1, r14"                */              /* Epilogue generated by the compiler. */       \
-                       /* "ldd r6, [r1]+0x20"  */                      \
-                       /* "mov psr, r6"                */                      \
-                       /* "mov rtt, r7"                */                      \
-                       /* "ldd r14, [r1]+0x18" */                      \
-                       /* "ldq r4, [r1]+0x8"   */                      \
-                       /* "ldd r2, [r1]"               */                      \
-                       /* "add r1, #0x28"              */                      \
-                       /* "rti"                                */                      \
-                       );                                                                      \
-       }
+#define portRESTORE_CONTEXT()          \
+       asm __volatile__(                                               \
+               "ld             r2, [r0]+short(pxCurrentTCB)    \n"     /* Load the TCB to find the stack pointer and context. */       \
+               "ld             r1, [r2]                                \n"     \
+               "movhi  r2, #16384                              \n"     /* Set the pointer to the IC. */        \
+               "ld             r3, [r1]+0x18                   \n"     /* Load the previous interrupt mask. */ \
+               "stb    r3, [r2]+2                      \n"     /* Set the current interrupt mask to be the previous. */        \
+               "ldd    r12, [r1]+0x10                  \n"     /* Restore the callee saved registers. Caller saved registers are restored by the function exit. */     \
+               "ldq    r8, [r1]                                \n"     \
+               "add    r1, #0x1c                               \n"     \
+               "mov    r14, r1                                 \n"     \
+               );
+
 /*---------------------------------------------------------------------------*/
 
 /* Task function macros as described on the FreeRTOS.org WEB site. */