diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject
index 24b21be6d3..f3fd43ab25 100644
--- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject
+++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject
@@ -36,7 +36,7 @@
-
+
@@ -55,8 +55,8 @@
-
-
+
diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h
index 52b21ac9a0..8b4eb3c9cb 100644
--- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h
+++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h
@@ -151,7 +151,7 @@ to exclude the API function. */
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_eTaskGetState 1
-#define INCLUDE_xTimerPendFunctionCallFromISR 1
+#define INCLUDE_xTimerPendFunctionCall 1
/* This demo makes use of one or more example stats formatting functions. These
format the raw data provided by the uxTaskGetSystemState() function in to human
diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c
index 7752a211ff..57d52db06b 100644
--- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c
+++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOS_tick_config.c
@@ -71,73 +71,57 @@
#include "xscutimer.h"
#include "xscugic.h"
-#define XSCUTIMER_CLOCK_HZ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ/2
-
-static XScuTimer Timer; /* A9 timer counter */
+#define XSCUTIMER_CLOCK_HZ ( XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 2UL )
/*
* The application must provide a function that configures a peripheral to
* create the FreeRTOS tick interrupt, then define configSETUP_TICK_INTERRUPT()
* in FreeRTOSConfig.h to call the function. This file contains a function
- * that is suitable for use on the Renesas RZ MPU.
+ * that is suitable for use on the Zynq SoC.
*/
void vConfigureTickInterrupt( void )
{
-static XScuGic InterruptController; /* Interrupt controller instance */
-int Status;
+static XScuGic xInterruptController; /* Interrupt controller instance */
+BaseType_t xStatus;
extern void FreeRTOS_Tick_Handler( void );
-XScuTimer_Config *ScuConfig;
-XScuGic_Config *IntcConfig;
-
- IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
- Status = XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress );
- configASSERT( Status == XST_SUCCESS );
-
- /*
- * Connect to the interrupt controller
- */
- Status = XScuGic_Connect(&InterruptController, XPAR_SCUTIMER_INTR, (Xil_ExceptionHandler) FreeRTOS_Tick_Handler, (void *)&Timer);
- configASSERT( Status == XST_SUCCESS );
-
- /*
- * Initialize the A9Timer driver.
- */
- ScuConfig = XScuTimer_LookupConfig(XPAR_SCUTIMER_DEVICE_ID);
-
- Status = XScuTimer_CfgInitialize(&Timer, ScuConfig, ScuConfig->BaseAddr);
-
- configASSERT( Status == XST_SUCCESS );
-
- /*
- * Enable Auto reload mode.
- */
- XScuTimer_EnableAutoReload(&Timer);
-
- /*
- * Load the timer counter register.
- */
- XScuTimer_LoadTimer(&Timer, XSCUTIMER_CLOCK_HZ / configTICK_RATE_HZ);
-
- /*
- * Start the timer counter and then wait for it
- * to timeout a number of times.
- */
- XScuTimer_Start(&Timer);
-
- /*
- * Enable the interrupt for the Timer in the interrupt controller
- */
- XScuGic_Enable(&InterruptController, XPAR_SCUTIMER_INTR);
-
- /*
- * Enable the timer interrupts for timer mode.
- */
- XScuTimer_EnableInterrupt(&Timer);
-
- /*
- * Do NOT enable interrupts in the ARM processor here.
- * This happens when the scheduler is started.
- */
+XScuTimer_Config *pxTimerConfig;
+XScuGic_Config *pxGICConfig;
+XScuTimer xTimer;
+
+ /* This function is called with the IRQ interrupt disabled, and the IRQ
+ interrupt should be left disabled. It is enabled automatically when the
+ scheduler is started. */
+
+ /* Ensure XScuGic_CfgInitialize() has been called. In this demo it has
+ already been called from prvSetupHardware() in main(). */
+ pxGICConfig = XScuGic_LookupConfig( XPAR_SCUGIC_SINGLE_DEVICE_ID );
+ xStatus = XScuGic_CfgInitialize( &xInterruptController, pxGICConfig, pxGICConfig->CpuBaseAddress );
+ configASSERT( xStatus == XST_SUCCESS );
+
+ /* Install the FreeRTOS tick handler. */
+ xStatus = XScuGic_Connect(&xInterruptController, XPAR_SCUTIMER_INTR, (Xil_ExceptionHandler) FreeRTOS_Tick_Handler, (void *)&xTimer);
+ configASSERT( xStatus == XST_SUCCESS );
+
+ /* Initialise the timer. */
+ pxTimerConfig = XScuTimer_LookupConfig( XPAR_SCUTIMER_DEVICE_ID );
+ xStatus = XScuTimer_CfgInitialize( &xTimer, pxTimerConfig, pxTimerConfig->BaseAddr );
+ configASSERT( xStatus == XST_SUCCESS );
+
+ /* Enable Auto reload mode. */
+ XScuTimer_EnableAutoReload( &xTimer );
+
+ /* Load the timer counter register. */
+ XScuTimer_LoadTimer( &xTimer, XSCUTIMER_CLOCK_HZ / configTICK_RATE_HZ );
+
+ /* Start the timer counter and then wait for it to timeout a number of
+ times. */
+ XScuTimer_Start( &xTimer );
+
+ /* Enable the interrupt for the xTimer in the interrupt controller. */
+ XScuGic_Enable( &xInterruptController, XPAR_SCUTIMER_INTR );
+
+ /* Enable the interrupt in the xTimer itself. */
+ XScuTimer_EnableInterrupt( &xTimer );
}
/*-----------------------------------------------------------*/
@@ -156,30 +140,24 @@ void vInitialiseRunTimeStats( void )
}
/*-----------------------------------------------------------*/
-extern XScuGic_Config XScuGic_ConfigTable[];
-static const XScuGic_Config *CfgPtr = &XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ];
void vApplicationIRQHandler( uint32_t ulICCIAR )
{
+extern const XScuGic_Config XScuGic_ConfigTable[];
+static const XScuGic_VectorTableEntry *pxVectorTable = XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ].HandlerTable;
uint32_t ulInterruptID;
-XScuGic_VectorTableEntry *TablePtr;
-//XScuGic_Config *CfgPtr;
-//extern XScuGic_Config XScuGic_ConfigTable[];
-
-// CfgPtr = &XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ];
+const XScuGic_VectorTableEntry *pxVectorEntry;
/* Re-enable interrupts. */
__asm ( "cpsie i" );
- /* The ID of the interrupt can be obtained by bitwise anding the ICCIAR value
+ /* The ID of the interrupt is obtained by bitwise anding the ICCIAR value
with 0x3FF. */
ulInterruptID = ulICCIAR & 0x3FFUL;
-
configASSERT( ulInterruptID < XSCUGIC_MAX_NUM_INTR_INPUTS );
- /* Call the function installed in the array of installed handler functions. */
- TablePtr = &(CfgPtr->HandlerTable[ ulInterruptID ]);
- TablePtr->Handler(TablePtr->CallBackRef);
-// intc_func_table[ ulInterruptID ]( 0 );
+ /* Call the function installed in the array of installed handler functions. */
+ pxVectorEntry = &( pxVectorTable[ ulInterruptID ] );
+ pxVectorEntry->Handler( pxVectorEntry->CallBackRef );
}
diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c
index 9e11bd544a..54753a43ef 100644
--- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c
+++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c
@@ -76,20 +76,52 @@
/* Demo includes. */
#include "partest.h"
+/* Xilinx includes. */
+#include "xgpiops.h"
+
+#define partstNUM_LEDS ( 1 )
+#define partstDIRECTION_OUTPUT ( 1 )
+#define partstOUTPUT_ENABLED ( 1 )
+#define partstLED_OUTPUT ( 10 )
+
+/*-----------------------------------------------------------*/
+
+static XGpioPs xGpio;
+
/*-----------------------------------------------------------*/
void vParTestInitialise( void )
{
+XGpioPs_Config *pxConfigPtr;
+BaseType_t xStatus;
+
+ /* Initialise the GPIO driver. */
+ pxConfigPtr = XGpioPs_LookupConfig( XPAR_XGPIOPS_0_DEVICE_ID );
+ xStatus = XGpioPs_CfgInitialize( &xGpio, pxConfigPtr, pxConfigPtr->BaseAddr );
+ configASSERT( xStatus == XST_SUCCESS );
+
+ /* Enable outputs and set low. */
+ XGpioPs_SetDirectionPin( &xGpio, partstLED_OUTPUT, partstDIRECTION_OUTPUT );
+ XGpioPs_SetOutputEnablePin( &xGpio, partstLED_OUTPUT, partstOUTPUT_ENABLED );
+ XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, 0x0 );
}
/*-----------------------------------------------------------*/
-void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
+void vParTestSetLED( UBaseType_t uxLED, BaseType_t xValue )
{
+ ( void ) uxLED;
+ XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, xValue );
}
/*-----------------------------------------------------------*/
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
{
+BaseType_t xLEDState;
+
+ ( void ) uxLED;
+
+ xLEDState = XGpioPs_ReadPin( &xGpio, partstLED_OUTPUT );
+ XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, !xLEDState );
}
diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c
index 1a266fe150..4ff8d28ed7 100644
--- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c
+++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c
@@ -128,12 +128,6 @@ void vApplicationIdleHook( void );
void vApplicationStackOverflowHook( xTaskHandle pxTask, char *pcTaskName );
void vApplicationTickHook( void );
-/*
- * Creates and verifies different files on the volume, demonstrating the use of
- * various different API functions.
- */
-extern void vCreateAndVerifySampleFiles( void );
-
/*-----------------------------------------------------------*/
int main( void )
@@ -159,50 +153,30 @@ int main( void )
static void prvSetupHardware( void )
{
-int Status;
-XScuGic InterruptController; /* Interrupt controller instance */
-extern void FreeRTOS_IRQ_Handler( void );
-extern void FreeRTOS_SWI_Handler( void );
-
- __asm volatile ( "cpsid i" );
- Xil_ExceptionInit();
-
- XScuGic_Config *IntcConfig; /* The configuration parameters of the
- interrupt controller */
- /*
- * Initialize the interrupt controller driver
- */
- IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
- configASSERT( IntcConfig );
- configASSERT( IntcConfig->CpuBaseAddress == ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) );
- configASSERT( IntcConfig->DistBaseAddress == configINTERRUPT_CONTROLLER_BASE_ADDRESS );
-
- Status = XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress );
- configASSERT( Status == XST_SUCCESS );
-
-// Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_IRQ_INT, (Xil_ExceptionHandler)FreeRTOS_IRQ_Handler, &InterruptController);
-// Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_SWI_INT, (Xil_ExceptionHandler)FreeRTOS_SWI_Handler, &InterruptController);
-
-// Xil_ExceptionEnableMask( XIL_EXCEPTION_ALL );
-// Xil_ExceptionEnable();
-
- /*
- * Connect the interrupt controller interrupt handler to the hardware
- * interrupt handling logic in the ARM processor.
- */
-#if 0
- Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_UNDEFINED_INT,
- (Xil_ExceptionHandler)FreeRTOS_ExHandler,
- (void *)4);
-
- Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_PREFETCH_ABORT_INT,
- (Xil_ExceptionHandler)FreeRTOS_ExHandler,
- (void *)4);
-
- Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_DATA_ABORT_INT,
- (Xil_ExceptionHandler)FreeRTOS_ExHandler,
- (void *)8);
-#endif
+BaseType_t xStatus;
+XScuGic_Config *pxGICConfig;
+XScuGic xInterruptController;
+
+ /* Ensure no interrupts execute while the scheduler is in an inconsistent
+ state. Interrupts are automatically enabled when the scheduler is
+ started. */
+ portDISABLE_INTERRUPTS();
+
+ /* Obtain the configuration of the GIC. */
+ pxGICConfig = XScuGic_LookupConfig( XPAR_SCUGIC_SINGLE_DEVICE_ID );
+
+ /* Sanity check the FreeRTOSConfig.h settings are correct for the
+ hardware. */
+ configASSERT( pxGICConfig );
+ configASSERT( pxGICConfig->CpuBaseAddress == ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) );
+ configASSERT( pxGICConfig->DistBaseAddress == configINTERRUPT_CONTROLLER_BASE_ADDRESS );
+
+ /* Install a default handler for each GIC interrupt. */
+ xStatus = XScuGic_CfgInitialize( &xInterruptController, pxGICConfig, pxGICConfig->CpuBaseAddress );
+ configASSERT( xStatus == XST_SUCCESS );
+
+ /* Initialise the LED port. */
+ vParTestInitialise();
}
/*-----------------------------------------------------------*/
diff --git a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c
index aba3cfce2b..4837cbc470 100644
--- a/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c
+++ b/FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c
@@ -148,7 +148,7 @@ static xQueueHandle xQueue = NULL;
void main_blinky( void )
{
/* Create the queue. */
- xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) );
+ xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );
if( xQueue != NULL )
{