]> git.sur5r.net Git - freertos/commitdiff
Continue work on MicroBlaze port - still very much a work in progress.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 3 Jun 2011 19:22:17 +0000 (19:22 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 3 Jun 2011 19:22:17 +0000 (19:22 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1444 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Demo/MicroBlaze_Spartan-6_EthernetLite/SDKProjects/RTOSDemoBSP/system.mss
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
Demo/MicroBlaze_Spartan-6_EthernetLite/SDKProjects/RTOSDemoSource/main-blinky.c

index 2369c83b34d779174d03483fd983213a7c8b367a..cad7773145ebcd0360425ffc952dff3c5cdaba44 100644 (file)
@@ -15,6 +15,7 @@ BEGIN PROCESSOR
  PARAMETER DRIVER_NAME = cpu\r
  PARAMETER DRIVER_VER = 1.13.a\r
  PARAMETER HW_INSTANCE = microblaze_0\r
  PARAMETER DRIVER_NAME = cpu\r
  PARAMETER DRIVER_VER = 1.13.a\r
  PARAMETER HW_INSTANCE = microblaze_0\r
+ PARAMETER EXTRA_COMPILER_FLAGS = -O0 -g\r
 END\r
 \r
 \r
 END\r
 \r
 \r
index e2731f8d14d4241230b5ca920bca934341ca557b..db59278a7130d54da93c1eceb0d97ee34deeccbf 100644 (file)
@@ -126,6 +126,7 @@ const unsigned long ulR2 = ( unsigned long ) &_SDA2_BASE_;
 const unsigned long ulR13 = ( unsigned long ) &_SDA_BASE_;\r
 \r
 #if 0\r
 const unsigned long ulR13 = ( unsigned long ) &_SDA_BASE_;\r
 \r
 #if 0\r
+//_RB_\r
        #ifdef XPAR_MICROBLAZE_USE_ICACHE\r
                microblaze_invalidate_icache();\r
                microblaze_enable_icache();\r
        #ifdef XPAR_MICROBLAZE_USE_ICACHE\r
                microblaze_invalidate_icache();\r
                microblaze_enable_icache();\r
@@ -150,74 +151,76 @@ const unsigned long ulR13 = ( unsigned long ) &_SDA_BASE_;
 \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
 \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. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x00;        /* R0 is always zero. */\r
+       \r
+       /* R1 is the SP. */\r
 \r
        /* Place an initial value for all the general purpose registers. */\r
        pxTopOfStack--;\r
 \r
        /* Place an initial value for all the general purpose registers. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) ulR2;        /* R2 - small data area. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) ulR2;        /* R2 - read only small data area. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x03;        /* R3. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x03;        /* R3 - return values and temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x04;        /* R4. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x04;        /* R4 - return values and temporaries. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) pvParameters;/* R5 contains the function call parameters. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) pvParameters;/* R5 contains the function call parameters. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x06;        /* R6. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x06;        /* R6 - other parameters and temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x07;        /* R7. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x07;        /* R7 - other parameters and temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x08;        /* R8. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x08;        /* R8 - other parameters and temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x09;        /* R9. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x09;        /* R9 - other parameters and temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x0a;        /* R10. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x0a;        /* R10 - other parameters and temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x0b;        /* R11. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x0b;        /* R11 - temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x0c;        /* R12. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x0c;        /* R12 - temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) ulR13;       /* R13 - small data read write area. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) ulR13;       /* R13 - read/write small data area. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) pxCode;      /* R14. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) pxCode;      /* R14 - return address for interrupt. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x0f;        /* R15. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x0f;        /* R15 - return address for subroutine. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x10;        /* R16. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x10;        /* R16 - return address for trap (debugger). */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x11;        /* R17. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x11;        /* R17 - return address for exceptions, if configured. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x12;        /* R18. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x12;        /* R18 - reserved for assembler and compiler temporaries. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x13;        /* R19. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x13;        /* R19 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x14;        /* R20. */\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
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x15;        /* R21. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x15;        /* R21 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x16;        /* R22. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x16;        /* R22 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x17;        /* R23. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x17;        /* R23 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x18;        /* R24. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x18;        /* R24 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x19;        /* R25. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x19;        /* R25 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x1a;        /* R26. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x1a;        /* R26 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x1b;        /* R27. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x1b;        /* R27 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x1c;        /* R28. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x1c;        /* R28 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x1d;        /* R29. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x1d;        /* R29 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x1e;        /* R30. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x1e;        /* R30 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
 \r
        /* The MSR is stacked between R30 and R31. */\r
        *pxTopOfStack = portINITIAL_MSR_STATE;\r
        pxTopOfStack--;\r
 \r
        pxTopOfStack--;\r
 \r
        /* The MSR is stacked between R30 and R31. */\r
        *pxTopOfStack = portINITIAL_MSR_STATE;\r
        pxTopOfStack--;\r
 \r
-       *pxTopOfStack = ( portSTACK_TYPE ) 0x1f;        /* R31. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) 0x1f;        /* R31 - must be saved across function calls. Callee-save. */\r
        pxTopOfStack--;\r
 \r
        /* Return a pointer to the top of the stack we have generated so this can\r
        pxTopOfStack--;\r
 \r
        /* Return a pointer to the top of the stack we have generated so this can\r
@@ -359,9 +362,13 @@ portBASE_TYPE xReturn = XST_SUCCESS;
  */\r
 void vTickISR( void *pvUnused )\r
 {\r
  */\r
 void vTickISR( void *pvUnused )\r
 {\r
+extern void vApplicationClearTimerInterrupt();\r
+\r
        /* Ensure the unused parameter does not generate a compiler warning. */\r
        ( void ) pvUnused;\r
 \r
        /* Ensure the unused parameter does not generate a compiler warning. */\r
        ( void ) pvUnused;\r
 \r
+       vApplicationClearTimerInterrupt();\r
+\r
        /* Increment the RTOS tick - this might cause a task to unblock. */\r
        vTaskIncrementTick();\r
 \r
        /* Increment the RTOS tick - this might cause a task to unblock. */\r
        vTaskIncrementTick();\r
 \r
@@ -387,7 +394,7 @@ extern Xil_ExceptionHandler vPortFreeRTOSInterruptHandler;
 \r
                /* Register the interrupt controller handle that uses the exception\r
                table. */\r
 \r
                /* Register the interrupt controller handle that uses the exception\r
                table. */\r
-               Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_INT,     vPortFreeRTOSInterruptHandler, NULL );\r
+//_RB_         Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_INT,     vPortFreeRTOSInterruptHandler, NULL );\r
 \r
            /* Service all pending interrupts each time the handler is entered. */\r
            XIntc_SetIntrSvcOption( xInterruptControllerInstance.BaseAddress, XIN_SVC_ALL_ISRS_OPTION );\r
 \r
            /* Service all pending interrupts each time the handler is entered. */\r
            XIntc_SetIntrSvcOption( xInterruptControllerInstance.BaseAddress, XIN_SVC_ALL_ISRS_OPTION );\r
index ea597dca2cbfff9bace0e97852462dae9f98bbba..c015eed06628ffd3c7307972fae7db6bfeb6504c 100644 (file)
@@ -63,7 +63,8 @@
        .extern uxCriticalNesting\r
        .extern pulISRStack\r
 \r
        .extern uxCriticalNesting\r
        .extern pulISRStack\r
 \r
-       .global vPortFreeRTOSInterruptHandler\r
+/*     .global vPortFreeRTOSInterruptHandler */\r
+       .global _interrupt_handler\r
        .global VPortYieldASM\r
        .global vStartFirstTask\r
 \r
        .global VPortYieldASM\r
        .global vStartFirstTask\r
 \r
        .align  2\r
 \r
 \r
        .align  2\r
 \r
 \r
-vPortFreeRTOSInterruptHandler:\r
+/*vPortFreeRTOSInterruptHandler:*/\r
+_interrupt_handler:\r
        portSAVE_CONTEXT\r
        /* Entered via an interrupt so interrupts must be enabled in msr. */\r
        ori r31, r31, 2\r
        portSAVE_CONTEXT\r
        /* Entered via an interrupt so interrupts must be enabled in msr. */\r
        ori r31, r31, 2\r
index 649754b2f7051e38a0ea56ffcf4047e6fb112df6..18fcc1019b8f2acc6a60cb8b77f2a8b0e73a5da0 100644 (file)
@@ -172,6 +172,41 @@ static volatile unsigned long ulGPIOState = 0UL;
 static XTmrCtr xTimer0Instance;\r
 \r
 /*-----------------------------------------------------------*/\r
 static XTmrCtr xTimer0Instance;\r
 \r
 /*-----------------------------------------------------------*/\r
+#define JUST_TESTING\r
+#ifdef JUST_TESTING\r
+volatile unsigned long ul1 = 0, ul2 = 0;\r
+\r
+void vTemp1( void *pvParameters )\r
+{\r
+       for( ;; )\r
+       {\r
+               ul1++;\r
+               //taskYIELD();\r
+       }\r
+}\r
+\r
+void vTemp2( void *pvParameters )\r
+{\r
+       for( ;; )\r
+       {\r
+               ul2++;\r
+               //taskYIELD();\r
+       }\r
+}\r
+\r
+void main( void )\r
+{\r
+       prvSetupHardware();\r
+\r
+       xTaskCreate( vTemp1, ( signed char * ) "Test1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL );\r
+       xTaskCreate( vTemp2, ( signed char * ) "Test2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL );\r
+\r
+       vTaskStartScheduler();\r
+       for( ;; );\r
+}\r
+\r
+\r
+#else /* JUST_TESTING */\r
 \r
 int main(void)\r
 {\r
 \r
 int main(void)\r
 {\r
@@ -210,7 +245,7 @@ int main(void)
        for( ;; );\r
 }\r
 /*-----------------------------------------------------------*/\r
        for( ;; );\r
 }\r
 /*-----------------------------------------------------------*/\r
-\r
+#endif /* JUST_TESTING */\r
 static void vLEDTimerCallback( xTimerHandle xTimer )\r
 {\r
        /* The timer has expired - so no button pushes have occurred in the last\r
 static void vLEDTimerCallback( xTimerHandle xTimer )\r
 {\r
        /* The timer has expired - so no button pushes have occurred in the last\r
@@ -416,3 +451,15 @@ extern void vTickISR( void *pvUnused );
 }\r
 \r
 \r
 }\r
 \r
 \r
+void vApplicationClearTimerInterrupt( void )\r
+{\r
+unsigned long ulCSR;\r
+\r
+       /* Increment the RTOS tick - this might cause a task to unblock. */\r
+       vTaskIncrementTick();\r
+\r
+       /* Clear the timer interrupt */\r
+       ulCSR = XTmrCtr_GetControlStatusReg( XPAR_AXI_TIMER_0_BASEADDR, 0 );\r
+       XTmrCtr_SetControlStatusReg( XPAR_AXI_TIMER_0_BASEADDR, 0, ulCSR );\r
+}\r
+\r