mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
More work in progress (PPC).
This commit is contained in:
parent
9a9cd41098
commit
ebf69dab5d
|
@ -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
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
|
Loading…
Reference in a new issue