]> git.sur5r.net Git - freertos/commitdiff
More work in progress (PPC).
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 25 Feb 2008 18:53:23 +0000 (18:53 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 25 Feb 2008 18:53:23 +0000 (18:53 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@220 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Source/portable/GCC/PPC405/port.c
Source/portable/GCC/PPC405/portasm.s
Source/portable/GCC/PPC405/portmacro.h

index 774ad92854f3cf9eda36bfbcd72581874b1c2b61..07b90fea5fa7ed10707726adad56e350d627dc46 100644 (file)
@@ -41,7 +41,7 @@
 */\r
 \r
 /*-----------------------------------------------------------\r
- * Implementation of functions defined in portable.h for the MicroBlaze port.\r
+ * Implementation of functions defined in portable.h for the PPC405 port.\r
  *----------------------------------------------------------*/\r
 \r
 \r
@@ -50,7 +50,6 @@
 #include "task.h"\r
 \r
 /* Library includes. */\r
-#include "xexception_l.h"\r
 #include "xtime_l.h"\r
 \r
 /* Standard includes. */\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
-#define portCRITICAL_INTERRUPT_ENABLE  ( 1UL << 14UL )\r
-#define portEXTERNAL_INTERRUPT_ENABLE  ( 1UL << 16UL )\r
-#define portMACHINE_CHECK_ENABLE               ( 1UL << 19UL )\r
+#define portCRITICAL_INTERRUPT_ENABLE  ( 0UL << 17UL )\r
+#define portEXTERNAL_INTERRUPT_ENABLE  ( 1UL << 15UL )\r
+#define portMACHINE_CHECK_ENABLE               ( 0UL << 12UL )\r
 #define portINITIAL_MSR                ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE )\r
 \r
-\r
 /*\r
  */\r
 static void prvSetupTimerInterrupt( void );\r
-extern void vStartFirstTask( void );\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvTickISR( void );\r
+extern void vPortTickISR( void );\r
 extern void vPortYield( void );\r
+extern void vPortStartFirstTask( void );\r
 \r
 /* \r
  * Initialise the stack of a task to look exactly as if a call to \r
@@ -156,13 +152,13 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE
        pxTopOfStack--;\r
        *pxTopOfStack = 0x00000000UL;   /* CTR. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask;     /* LR. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask; /* LR. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = portINITIAL_MSR;/* SRR1. */\r
        pxTopOfStack--;\r
-       *pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask;/* Next LR. */\r
+       *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask;/* Next LR. */\r
        pxTopOfStack--;\r
        *pxTopOfStack = 0x00000000UL;;/* Backchain. */\r
 //     pxTopOfStack--;\r
@@ -178,12 +174,14 @@ extern void *pxCurrentTCB;
        XExc_Init();\r
        XExc_mDisableExceptions( XEXC_NON_CRITICAL ) ;  \r
 \r
-//     prvSetupTimerInterrupt();\r
+       prvSetupTimerInterrupt();\r
+\r
        XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );\r
-       XExc_mEnableExceptions( XEXC_NON_CRITICAL ) ;\r
 \r
-       vStartFirstTask();\r
-       \r
+//     XExc_mEnableExceptions( XEXC_NON_CRITICAL );\r
+\r
+       vPortStartFirstTask();\r
+\r
        /* Should not get here as the tasks are now running! */\r
        return pdFALSE;\r
 }\r
@@ -198,11 +196,18 @@ void vPortEndScheduler( void )
 /*\r
  * Hardware initialisation to generate the RTOS tick.   \r
  */\r
+static void prvTickISR( void );\r
 static void prvSetupTimerInterrupt( void )\r
 {\r
 const unsigned portLONG ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );\r
 \r
-       XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) prvTickISR, ( void * ) 0 );\r
+       XTime_PITClearInterrupt();\r
+       XTime_FITClearInterrupt();\r
+       XTime_WDTClearInterrupt();\r
+       XTime_WDTDisableInterrupt();\r
+       XTime_FITDisableInterrupt();\r
+\r
+       XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 );\r
 \r
        XTime_PITEnableAutoReload();\r
        XTime_PITSetInterval( ulInterval );\r
@@ -221,9 +226,6 @@ static unsigned portLONG ulTicks = 0;
                ulTicks = 0;\r
        }\r
        XTime_PITClearInterrupt();\r
-       \r
-       #if configUSE_PREEMPTION == 1\r
-       #endif\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
index da8d9f6d7942204aa498412097bfd9ef9b52e483..3810a881159b8d8ab7d1f4786c1199aee67d1877 100644 (file)
@@ -2,9 +2,11 @@
 \r
        .extern pxCurrentTCB\r
        .extern vTaskSwitchContext\r
+       .extern vTaskIncrementTick\r
 \r
-       .global vStartFirstTask\r
+       .global vPortStartFirstTask\r
        .global vPortYield\r
+       .global vPortTickISR\r
 \r
 .set portCONTEXT_SIZE, 156\r
 .set portR0_OFFSET, 152\r
 .endm\r
 \r
 \r
-vStartFirstTask:\r
+vPortStartFirstTask:\r
 \r
        int_epilogue\r
        rfi\r
 \r
-#vStartFirstTask:\r
+#vPortStartFirstTask:\r
 #      portRESTORE_CONTEXT\r
 #      rfi\r
 \r
@@ -214,5 +216,19 @@ vPortYield:
        portEXIT_SWITCHING_ISR\r
        blr\r
 \r
-       NOP\r
-       NOP\r
+vPortTickISR:\r
+\r
+       portENTER_SWITCHING_ISR\r
+       bl vTaskIncrementTick\r
+       #if configUSE_PREEMPTION == 1\r
+               bl vTaskSwitchContext\r
+       #endif\r
+\r
+       # Clear the interrupt\r
+       lis             R0, 2048\r
+       mttsr   R0\r
+\r
+       portEXIT_SWITCHING_ISR\r
+       blr\r
+\r
+\r
index dc895d215db82ceadecd538d3557697b2c75f8d0..5b6be119ae65565c1894557906782d24364859a2 100644 (file)
@@ -43,6 +43,8 @@
 #ifndef PORTMACRO_H\r
 #define PORTMACRO_H\r
 \r
+#include "xexception_l.h"\r
+\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
@@ -75,16 +77,19 @@ extern "C" {
 #endif\r
 /*-----------------------------------------------------------*/        \r
 \r
+#define portCRITICAL_NESTING_IN_TCB            1\r
+\r
 /* Interrupt control macros. */\r
-#define portDISABLE_INTERRUPTS()       \r
-#define portENABLE_INTERRUPTS()                \r
+#define portDISABLE_INTERRUPTS()               XExc_mDisableExceptions( XEXC_NON_CRITICAL );\r
+#define portENABLE_INTERRUPTS()                        XExc_mEnableExceptions( XEXC_NON_CRITICAL );\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /* Critical section macros. */\r
-void vPortEnterCritical( void );\r
-void vPortExitCritical( void );\r
-#define portENTER_CRITICAL()                                                                   \r
-#define portEXIT_CRITICAL()\r
+void vTaskEnterCritical( void );\r
+void vTaskExitCritical( void );\r
+#define portENTER_CRITICAL()                   vTaskEnterCritical()\r
+#define portEXIT_CRITICAL()                            vTaskExitCritical()\r
 \r
 /*-----------------------------------------------------------*/\r
 \r