More work in progress (PPC).

This commit is contained in:
Richard Barry 2008-02-25 18:53:23 +00:00
parent 9a9cd41098
commit ebf69dab5d
3 changed files with 55 additions and 32 deletions

View file

@ -41,7 +41,7 @@
*/ */
/*----------------------------------------------------------- /*-----------------------------------------------------------
* Implementation of functions defined in portable.h for the MicroBlaze port. * Implementation of functions defined in portable.h for the PPC405 port.
*----------------------------------------------------------*/ *----------------------------------------------------------*/
@ -50,7 +50,6 @@
#include "task.h" #include "task.h"
/* Library includes. */ /* Library includes. */
#include "xexception_l.h"
#include "xtime_l.h" #include "xtime_l.h"
/* Standard includes. */ /* Standard includes. */
@ -58,20 +57,17 @@
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 14UL ) #define portCRITICAL_INTERRUPT_ENABLE ( 0UL << 17UL )
#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 16UL ) #define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL )
#define portMACHINE_CHECK_ENABLE ( 1UL << 19UL ) #define portMACHINE_CHECK_ENABLE ( 0UL << 12UL )
#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE ) #define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE )
/* /*
*/ */
static void prvSetupTimerInterrupt( void ); static void prvSetupTimerInterrupt( void );
extern void vStartFirstTask( void ); extern void vPortTickISR( void );
/*-----------------------------------------------------------*/
static void prvTickISR( void );
extern void vPortYield( void ); extern void vPortYield( void );
extern void vPortStartFirstTask( void );
/* /*
* Initialise the stack of a task to look exactly as if a call to * Initialise the stack of a task to look exactly as if a call to
@ -156,13 +152,13 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE
pxTopOfStack--; pxTopOfStack--;
*pxTopOfStack = 0x00000000UL; /* CTR. */ *pxTopOfStack = 0x00000000UL; /* CTR. */
pxTopOfStack--; pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask; /* LR. */ *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask; /* LR. */
pxTopOfStack--; pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */ *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */
pxTopOfStack--; pxTopOfStack--;
*pxTopOfStack = portINITIAL_MSR;/* SRR1. */ *pxTopOfStack = portINITIAL_MSR;/* SRR1. */
pxTopOfStack--; pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask;/* Next LR. */ *pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask;/* Next LR. */
pxTopOfStack--; pxTopOfStack--;
*pxTopOfStack = 0x00000000UL;;/* Backchain. */ *pxTopOfStack = 0x00000000UL;;/* Backchain. */
// pxTopOfStack--; // pxTopOfStack--;
@ -178,11 +174,13 @@ extern void *pxCurrentTCB;
XExc_Init(); XExc_Init();
XExc_mDisableExceptions( XEXC_NON_CRITICAL ) ; XExc_mDisableExceptions( XEXC_NON_CRITICAL ) ;
// prvSetupTimerInterrupt(); prvSetupTimerInterrupt();
XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );
XExc_mEnableExceptions( XEXC_NON_CRITICAL ) ;
vStartFirstTask(); XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );
// XExc_mEnableExceptions( XEXC_NON_CRITICAL );
vPortStartFirstTask();
/* Should not get here as the tasks are now running! */ /* Should not get here as the tasks are now running! */
return pdFALSE; return pdFALSE;
@ -198,11 +196,18 @@ void vPortEndScheduler( void )
/* /*
* Hardware initialisation to generate the RTOS tick. * Hardware initialisation to generate the RTOS tick.
*/ */
static void prvTickISR( void );
static void prvSetupTimerInterrupt( void ) static void prvSetupTimerInterrupt( void )
{ {
const unsigned portLONG ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); const unsigned portLONG ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL );
XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) prvTickISR, ( void * ) 0 ); XTime_PITClearInterrupt();
XTime_FITClearInterrupt();
XTime_WDTClearInterrupt();
XTime_WDTDisableInterrupt();
XTime_FITDisableInterrupt();
XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 );
XTime_PITEnableAutoReload(); XTime_PITEnableAutoReload();
XTime_PITSetInterval( ulInterval ); XTime_PITSetInterval( ulInterval );
@ -221,9 +226,6 @@ static unsigned portLONG ulTicks = 0;
ulTicks = 0; ulTicks = 0;
} }
XTime_PITClearInterrupt(); XTime_PITClearInterrupt();
#if configUSE_PREEMPTION == 1
#endif
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/

View file

@ -2,9 +2,11 @@
.extern pxCurrentTCB .extern pxCurrentTCB
.extern vTaskSwitchContext .extern vTaskSwitchContext
.extern vTaskIncrementTick
.global vStartFirstTask .global vPortStartFirstTask
.global vPortYield .global vPortYield
.global vPortTickISR
.set portCONTEXT_SIZE, 156 .set portCONTEXT_SIZE, 156
.set portR0_OFFSET, 152 .set portR0_OFFSET, 152
@ -196,12 +198,12 @@
.endm .endm
vStartFirstTask: vPortStartFirstTask:
int_epilogue int_epilogue
rfi rfi
#vStartFirstTask: #vPortStartFirstTask:
# portRESTORE_CONTEXT # portRESTORE_CONTEXT
# rfi # rfi
@ -214,5 +216,19 @@ vPortYield:
portEXIT_SWITCHING_ISR portEXIT_SWITCHING_ISR
blr blr
NOP vPortTickISR:
NOP
portENTER_SWITCHING_ISR
bl vTaskIncrementTick
#if configUSE_PREEMPTION == 1
bl vTaskSwitchContext
#endif
# Clear the interrupt
lis R0, 2048
mttsr R0
portEXIT_SWITCHING_ISR
blr

View file

@ -43,6 +43,8 @@
#ifndef PORTMACRO_H #ifndef PORTMACRO_H
#define PORTMACRO_H #define PORTMACRO_H
#include "xexception_l.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -75,16 +77,19 @@ extern "C" {
#endif #endif
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
#define portCRITICAL_NESTING_IN_TCB 1
/* Interrupt control macros. */ /* Interrupt control macros. */
#define portDISABLE_INTERRUPTS() #define portDISABLE_INTERRUPTS() XExc_mDisableExceptions( XEXC_NON_CRITICAL );
#define portENABLE_INTERRUPTS() #define portENABLE_INTERRUPTS() XExc_mEnableExceptions( XEXC_NON_CRITICAL );
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* Critical section macros. */ /* Critical section macros. */
void vPortEnterCritical( void ); void vTaskEnterCritical( void );
void vPortExitCritical( void ); void vTaskExitCritical( void );
#define portENTER_CRITICAL() #define portENTER_CRITICAL() vTaskEnterCritical()
#define portEXIT_CRITICAL() #define portEXIT_CRITICAL() vTaskExitCritical()
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/