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"
/* Library includes. */
#include "xexception_l.h"
#include "xtime_l.h"
/* Standard includes. */
@ -58,20 +57,17 @@
/*-----------------------------------------------------------*/
#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 14UL )
#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 16UL )
#define portMACHINE_CHECK_ENABLE ( 1UL << 19UL )
#define portCRITICAL_INTERRUPT_ENABLE ( 0UL << 17UL )
#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL )
#define portMACHINE_CHECK_ENABLE ( 0UL << 12UL )
#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE )
/*
*/
static void prvSetupTimerInterrupt( void );
extern void vStartFirstTask( void );
/*-----------------------------------------------------------*/
static void prvTickISR( void );
extern void vPortTickISR( void );
extern void vPortYield( void );
extern void vPortStartFirstTask( void );
/*
* 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 = 0x00000000UL; /* CTR. */
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask; /* LR. */
*pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask; /* LR. */
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* SRR0. */
pxTopOfStack--;
*pxTopOfStack = portINITIAL_MSR;/* SRR1. */
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) vStartFirstTask;/* Next LR. */
*pxTopOfStack = ( portSTACK_TYPE ) vPortStartFirstTask;/* Next LR. */
pxTopOfStack--;
*pxTopOfStack = 0x00000000UL;;/* Backchain. */
// pxTopOfStack--;
@ -178,12 +174,14 @@ extern void *pxCurrentTCB;
XExc_Init();
XExc_mDisableExceptions( XEXC_NON_CRITICAL ) ;
// prvSetupTimerInterrupt();
XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );
XExc_mEnableExceptions( XEXC_NON_CRITICAL ) ;
prvSetupTimerInterrupt();
XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 );
// XExc_mEnableExceptions( XEXC_NON_CRITICAL );
vPortStartFirstTask();
vStartFirstTask();
/* Should not get here as the tasks are now running! */
return pdFALSE;
}
@ -198,11 +196,18 @@ void vPortEndScheduler( void )
/*
* Hardware initialisation to generate the RTOS tick.
*/
static void prvTickISR( void );
static void prvSetupTimerInterrupt( void )
{
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_PITSetInterval( ulInterval );
@ -221,9 +226,6 @@ static unsigned portLONG ulTicks = 0;
ulTicks = 0;
}
XTime_PITClearInterrupt();
#if configUSE_PREEMPTION == 1
#endif
}
/*-----------------------------------------------------------*/

View File

@ -2,9 +2,11 @@
.extern pxCurrentTCB
.extern vTaskSwitchContext
.extern vTaskIncrementTick
.global vStartFirstTask
.global vPortStartFirstTask
.global vPortYield
.global vPortTickISR
.set portCONTEXT_SIZE, 156
.set portR0_OFFSET, 152
@ -196,12 +198,12 @@
.endm
vStartFirstTask:
vPortStartFirstTask:
int_epilogue
rfi
#vStartFirstTask:
#vPortStartFirstTask:
# portRESTORE_CONTEXT
# rfi
@ -214,5 +216,19 @@ vPortYield:
portEXIT_SWITCHING_ISR
blr
NOP
NOP
vPortTickISR:
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
#define PORTMACRO_H
#include "xexception_l.h"
#ifdef __cplusplus
extern "C" {
#endif
@ -75,16 +77,19 @@ extern "C" {
#endif
/*-----------------------------------------------------------*/
#define portCRITICAL_NESTING_IN_TCB 1
/* Interrupt control macros. */
#define portDISABLE_INTERRUPTS()
#define portENABLE_INTERRUPTS()
#define portDISABLE_INTERRUPTS() XExc_mDisableExceptions( XEXC_NON_CRITICAL );
#define portENABLE_INTERRUPTS() XExc_mEnableExceptions( XEXC_NON_CRITICAL );
/*-----------------------------------------------------------*/
/* Critical section macros. */
void vPortEnterCritical( void );
void vPortExitCritical( void );
#define portENTER_CRITICAL()
#define portEXIT_CRITICAL()
void vTaskEnterCritical( void );
void vTaskExitCritical( void );
#define portENTER_CRITICAL() vTaskEnterCritical()
#define portEXIT_CRITICAL() vTaskExitCritical()
/*-----------------------------------------------------------*/