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"
|
#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,12 +174,14 @@ 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 ) ;
|
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! */
|
/* 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
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue