]> git.sur5r.net Git - freertos/commitdiff
First pass changes to new MicroBlaze port layer done. No new functionality has yet...
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 13 Jun 2011 14:37:32 +0000 (14:37 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 13 Jun 2011 14:37:32 +0000 (14:37 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1454 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Demo/MicroBlaze_Spartan-6_EthernetLite/SDKProjects/RTOSDemoSource/FreeRTOS_Source/portable/GCC/MicroBlaze/port.c
Demo/MicroBlaze_Spartan-6_EthernetLite/SDKProjects/RTOSDemoSource/FreeRTOS_Source/portable/GCC/MicroBlaze/portasm.S

index c91813c0c26b362063bc88f5badf46b97679f494..05710e90b626756ded853cb15247b198dcd8f5ad 100644 (file)
@@ -69,8 +69,9 @@
 #include <xtmrctr.h>\r
 #include <xil_exception.h>\r
 \r
-/* Tasks are started with interrupts enabled. */\r
-#define portINITIAL_MSR_STATE          ( ( portSTACK_TYPE ) 0x02 )\r
+/* Tasks are started with interrupts disabled as they will have their interrupts\r
+enabled as the task starts (when its context is restored for the first time). */\r
+#define portINITIAL_MSR_STATE          ( ( portSTACK_TYPE ) 0x00 )\r
 \r
 /* Tasks are started with a critical section nesting of 0 - however prior\r
 to the scheduler being commenced we don't want the critical nesting level\r
@@ -99,8 +100,7 @@ volatile unsigned portBASE_TYPE uxCriticalNesting = portINITIAL_NESTING_VALUE;
 \r
 /* To limit the amount of stack required by each task, this port uses a\r
 separate stack for interrupts. */\r
-unsigned long ulISRStack;\r
-unsigned long *pulISRStack = &ulISRStack;\r
+unsigned long *pulISRStack;\r
 \r
 /* The instance of the interrupt controller used by this port. */\r
 static XIntc xInterruptControllerInstance;\r
@@ -143,10 +143,19 @@ const unsigned long ulR13 = ( unsigned long ) &_SDA_BASE_;
        *pxTopOfStack = ( portSTACK_TYPE ) 0x33333333;\r
        pxTopOfStack--; \r
 \r
+       /* The debugger will look at the previous stack frame. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x00000000;\r
+       pxTopOfStack--;\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x00000000;\r
+       pxTopOfStack--;\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x00000000;\r
+       pxTopOfStack--;\r
+\r
        /* First stack an initial value for the critical section nesting.  This\r
-       is initialised to zero as tasks are started with interrupts enabled. */\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x00;        /* R0 is always zero. */\r
+       is initialised to zero. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x00;\r
        \r
+       /* R0 is always zero. */\r
        /* R1 is the SP. */\r
 \r
        /* Place an initial value for all the general purpose registers. */\r
@@ -159,7 +168,7 @@ const unsigned long ulR13 = ( unsigned long ) &_SDA_BASE_;
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) pvParameters;/* R5 contains the function call parameters. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x06;        /* R6 - other parameters and temporaries. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x06;        /* R6 - other parameters and temporaries.  Used as the return address from vPortTaskEntryPoint. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) 0x07;        /* R7 - other parameters and temporaries. */\r
        pxTopOfStack--;\r
@@ -185,7 +194,7 @@ const unsigned long ulR13 = ( unsigned long ) &_SDA_BASE_;
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) 0x12;        /* R18 - reserved for assembler and compiler temporaries. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x13;        /* R19 - must be saved across function calls. Callee-save. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x00;        /* R19 - must be saved across function calls. Callee-save.  Seems to be interpreted as the frame pointer. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) 0x14;        /* R20 - reserved for storing a pointer to the Global Offset Table (GOT) in Position Independent Code (PIC). Non-volatile in non-PIC code. Must be saved across function calls. Callee-save.  Not used by FreeRTOS. */\r
        pxTopOfStack--;\r
@@ -232,9 +241,12 @@ extern unsigned long _stack[];
        this function is called. */\r
        vApplicationSetupTimerInterrupt();\r
 \r
-       /* Allocate the stack to be used by the interrupt handler. */\r
+       /* Reuse the stack from main as the stack for the interrupts/exceptions.\r
+       The value is adjusted slightly to allow functions called from the\r
+       interrupts/exceptions to write back into the stack of the interrupt/\r
+       exception function itself. */\r
        pulISRStack = ( unsigned long * ) _stack;\r
-       pulISRStack--;\r
+       pulISRStack -= 2;\r
 \r
        /* Restore the context of the first task that is going to run.  From here\r
        on, the created tasks will be executing. */\r
index c1ad4fe6edd4440646a5c8362b8277266038f316..ed32a5b2855cac490785615812c12f4b8ac1f688 100644 (file)
@@ -216,7 +216,9 @@ _interrupt_handler:
        /* Stack the return address. */\r
        swi r14, r1, 76\r
 \r
-       /* Switch to the ISR stack. */\r
+       /* Switch to the ISR stack.  The pulISRStack value has already been set to\r
+       leave space for the caller function to write back into the stack of this\r
+       function. */\r
        lwi r1, r0, pulISRStack\r
 \r
        /* The parameter to the interrupt handler. */\r