mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Carry on working on the Zynq demo - still a work in progress.
This commit is contained in:
parent
3e430b3801
commit
371f6f359a
|
@ -36,6 +36,7 @@
|
|||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/FreeRTOS_Source/portable/GCC/ARM_CA9}""/>
|
||||
</option>
|
||||
<option id="xilinx.gnu.compiler.misc.other.591008063" name="Other flags" superClass="xilinx.gnu.compiler.misc.other" value="-c -fmessage-length=0" valueType="string"/>
|
||||
<inputType id="xilinx.gnu.arm.c.compiler.input.1279195555" name="C source files" superClass="xilinx.gnu.arm.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="xilinx.gnu.arm.cxx.toolchain.compiler.debug.309485210" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.debug">
|
||||
|
@ -54,6 +55,10 @@
|
|||
<listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/>
|
||||
</option>
|
||||
<option id="xilinx.gnu.c.linker.option.lscript.609053533" name="Linker Script" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/>
|
||||
<option id="xilinx.gnu.c.link.option.ldflags.1670905029" superClass="xilinx.gnu.c.link.option.ldflags" value="" valueType="string"/>
|
||||
<option id="xilinx.gnu.c.link.option.other.1460714584" superClass="xilinx.gnu.c.link.option.other" valueType="stringList">
|
||||
<listOptionValue builtIn="false" value="-Map=rtosdemo.map"/>
|
||||
</option>
|
||||
<inputType id="xilinx.gnu.linker.input.1414431390" superClass="xilinx.gnu.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
|
@ -72,17 +77,6 @@
|
|||
<tool id="xilinx.gnu.arm.size.debug.484243311" name="ARM Print Size" superClass="xilinx.gnu.arm.size.debug"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<folderInfo id="xilinx.gnu.arm.exe.debug.2107277346.1555222947" name="/" resourcePath="src/Standard_Demo_Tasks/Minimal">
|
||||
<toolChain id="xilinx.gnu.arm.exe.debug.toolchain.1743802113" name="Xilinx ARM GNU Toolchain" superClass="xilinx.gnu.arm.exe.debug.toolchain" unusedChildren="">
|
||||
<tool id="xilinx.gnu.arm.c.toolchain.assembler.debug.335155760" name="ARM gcc assembler" superClass="xilinx.gnu.arm.c.toolchain.assembler.debug.1072989377"/>
|
||||
<tool id="xilinx.gnu.arm.c.toolchain.compiler.debug.540874291" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.debug.399974114"/>
|
||||
<tool id="xilinx.gnu.arm.cxx.toolchain.compiler.debug.663459635" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.debug.309485210"/>
|
||||
<tool id="xilinx.gnu.arm.toolchain.archiver.1142616239" name="ARM archiver" superClass="xilinx.gnu.arm.toolchain.archiver.1960622276"/>
|
||||
<tool id="xilinx.gnu.arm.c.toolchain.linker.debug.61228036" name="ARM gcc linker" superClass="xilinx.gnu.arm.c.toolchain.linker.debug.2137204862"/>
|
||||
<tool id="xilinx.gnu.arm.cxx.toolchain.linker.debug.946601962" name="ARM g++ linker" superClass="xilinx.gnu.arm.cxx.toolchain.linker.debug.1458226319"/>
|
||||
<tool id="xilinx.gnu.arm.size.debug.486408782" name="ARM Print Size" superClass="xilinx.gnu.arm.size.debug.484243311"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
|
@ -175,4 +169,5 @@
|
|||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="refreshScope"/>
|
||||
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||
</cproject>
|
||||
|
|
|
@ -66,6 +66,8 @@
|
|||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
#include "xparameters.h"
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
|
@ -98,11 +100,11 @@
|
|||
* "FromISR". FreeRTOS maintains a separate interrupt safe API to enable
|
||||
* interrupt entry to be shorter, faster, simpler and smaller.
|
||||
*
|
||||
* The Zynq implements 32 unique interrupt priorities. For the purpose of
|
||||
* setting configMAX_API_CALL_INTERRUPT_PRIORITY 31 represents the lowest
|
||||
* The Zynq implements 256 unique interrupt priorities. For the purpose of
|
||||
* setting configMAX_API_CALL_INTERRUPT_PRIORITY 255 represents the lowest
|
||||
* priority.
|
||||
*/
|
||||
#define configMAX_API_CALL_INTERRUPT_PRIORITY 25
|
||||
#define configMAX_API_CALL_INTERRUPT_PRIORITY 18
|
||||
|
||||
|
||||
#define configCPU_CLOCK_HZ 100000000UL
|
||||
|
@ -157,11 +159,11 @@ readable ASCII form. See the notes in the implementation of vTaskList() within
|
|||
FreeRTOS/Source/tasks.c for limitations. */
|
||||
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
|
||||
|
||||
/* The following constants describe the hardware, and are correct for the
|
||||
/* The following constant describe the hardware, and are correct for the
|
||||
Zynq MPU. */
|
||||
#define configINTERRUPT_CONTROLLER_BASE_ADDRESS 0xE8201000
|
||||
#define configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET 0x1000
|
||||
#define configUNIQUE_INTERRUPT_PRIORITIES 32
|
||||
#define configINTERRUPT_CONTROLLER_BASE_ADDRESS ( XPAR_PS7_SCUGIC_0_DIST_BASEADDR )
|
||||
#define configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ( -0xf00 )
|
||||
#define configUNIQUE_INTERRUPT_PRIORITIES 32
|
||||
|
||||
/* Run time stats gathering definitions. */
|
||||
unsigned long ulGetRunTimeCounterValue( void );
|
||||
|
@ -197,5 +199,7 @@ void vAssertCalled( const char * pcFile, unsigned long ulLine );
|
|||
void vConfigureTickInterrupt( void );
|
||||
#define configSETUP_TICK_INTERRUPT() vConfigureTickInterrupt()
|
||||
|
||||
#define configINSTALL_FREERTOS_VECTOR_TABLE 1
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
* None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#if 0
|
||||
|
||||
#include "xil_errata.h"
|
||||
|
||||
#define __ARM_NEON__ 1
|
||||
|
@ -69,64 +69,37 @@
|
|||
.text
|
||||
|
||||
.globl _boot
|
||||
.globl _vector_table
|
||||
.globl _freertos_vector_table
|
||||
|
||||
.globl FIQInterrupt
|
||||
.globl IRQInterrupt
|
||||
.globl SWInterrupt
|
||||
.globl DataAbortInterrupt
|
||||
.globl PrefetchAbortInterrupt
|
||||
//.globl IRQInterrupt
|
||||
//.global SWInterrupt
|
||||
.global DataAbortInterrupt
|
||||
.global PrefetchAbortInterrupt
|
||||
|
||||
.globl IRQHandler
|
||||
.globl prof_pc
|
||||
.extern FreeRTOS_IRQ_Handler
|
||||
.extern FreeRTOS_SWI_Handler
|
||||
|
||||
.section .vectors
|
||||
_vector_table:
|
||||
B _boot
|
||||
B Undefined
|
||||
B SVCHandler
|
||||
B PrefetchAbortHandler
|
||||
B DataAbortHandler
|
||||
NOP /* Placeholder for address exception vector*/
|
||||
B IRQHandler
|
||||
B FIQHandler
|
||||
//.globl IRQHandler
|
||||
//.globl prof_pc
|
||||
|
||||
.section .freertos_vectors
|
||||
_freertos_vector_table:
|
||||
B _boot
|
||||
B FreeRTOS_Undefined
|
||||
ldr pc, _swi
|
||||
B FreeRTOS_PrefetchAbortHandler
|
||||
B FreeRTOS_DataAbortHandler
|
||||
NOP /* Placeholder for address exception vector*/
|
||||
LDR PC, _irq
|
||||
B FreeRTOS_FIQHandler
|
||||
|
||||
_irq: .word FreeRTOS_IRQ_Handler
|
||||
_swi: .word FreeRTOS_SWI_Handler
|
||||
|
||||
|
||||
IRQHandler: /* IRQ vector handler */
|
||||
|
||||
stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code*/
|
||||
#ifdef __ARM_NEON__
|
||||
vpush {d0-d7}
|
||||
vpush {d16-d31}
|
||||
vmrs r1, FPSCR
|
||||
push {r1}
|
||||
vmrs r1, FPEXC
|
||||
push {r1}
|
||||
#endif
|
||||
|
||||
#ifdef PROFILING
|
||||
ldr r2, =prof_pc
|
||||
subs r3, lr, #0
|
||||
str r3, [r2]
|
||||
#endif
|
||||
|
||||
bl IRQInterrupt /* IRQ vector */
|
||||
|
||||
#ifdef __ARM_NEON__
|
||||
pop {r1}
|
||||
vmsr FPEXC, r1
|
||||
pop {r1}
|
||||
vmsr FPSCR, r1
|
||||
vpop {d16-d31}
|
||||
vpop {d0-d7}
|
||||
#endif
|
||||
ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */
|
||||
|
||||
|
||||
subs pc, lr, #4 /* adjust return */
|
||||
|
||||
|
||||
FIQHandler: /* FIQ vector handler */
|
||||
FreeRTOS_FIQHandler: /* FIQ vector handler */
|
||||
stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */
|
||||
#ifdef __ARM_NEON__
|
||||
vpush {d0-d7}
|
||||
|
@ -152,7 +125,7 @@ FIQLoop:
|
|||
subs pc, lr, #4 /* adjust return */
|
||||
|
||||
|
||||
Undefined: /* Undefined handler */
|
||||
FreeRTOS_Undefined: /* Undefined handler */
|
||||
stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */
|
||||
|
||||
ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */
|
||||
|
@ -162,23 +135,7 @@ Undefined: /* Undefined handler */
|
|||
movs pc, lr
|
||||
|
||||
|
||||
SVCHandler: /* SWI handler */
|
||||
stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */
|
||||
|
||||
tst r0, #0x20 /* check the T bit */
|
||||
ldrneh r0, [lr,#-2] /* Thumb mode */
|
||||
bicne r0, r0, #0xff00 /* Thumb mode */
|
||||
ldreq r0, [lr,#-4] /* ARM mode */
|
||||
biceq r0, r0, #0xff000000 /* ARM mode */
|
||||
|
||||
bl SWInterrupt /* SWInterrupt: call C function here */
|
||||
|
||||
ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */
|
||||
|
||||
subs pc, lr, #4 /* adjust return */
|
||||
|
||||
|
||||
DataAbortHandler: /* Data Abort handler */
|
||||
FreeRTOS_DataAbortHandler: /* Data Abort handler */
|
||||
#ifdef CONFIG_ARM_ERRATA_775420
|
||||
dsb
|
||||
#endif
|
||||
|
@ -190,7 +147,7 @@ DataAbortHandler: /* Data Abort handler */
|
|||
|
||||
subs pc, lr, #4 /* adjust return */
|
||||
|
||||
PrefetchAbortHandler: /* Prefetch Abort handler */
|
||||
FreeRTOS_PrefetchAbortHandler: /* Prefetch Abort handler */
|
||||
#ifdef CONFIG_ARM_ERRATA_775420
|
||||
dsb
|
||||
#endif
|
||||
|
@ -205,6 +162,6 @@ PrefetchAbortHandler: /* Prefetch Abort handler */
|
|||
|
||||
.end
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
FreeRTOS V8.0.0:rc2 - Copyright (C) 2014 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that has become a de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly and support the FreeRTOS *
|
||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
* Thank you! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
|
||||
|
||||
>>! NOTE: The modification to the GPL is included to allow you to distribute
|
||||
>>! a combined work that includes FreeRTOS without being obliged to provide
|
||||
>>! the source code for proprietary components outside of the FreeRTOS
|
||||
>>! kernel.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available from the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong?" *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
||||
license and Real Time Engineers Ltd. contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "Task.h"
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
void vConfigureTickInterrupt( void )
|
||||
{
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Crude implementation of a run time counter used to measure how much time
|
||||
* each task spends in the Running state.
|
||||
*/
|
||||
unsigned long ulGetRunTimeCounterValue( void )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vInitialiseRunTimeStats( void )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -30,13 +30,14 @@ MEMORY
|
|||
|
||||
/* Specify the default entry point to the program */
|
||||
|
||||
ENTRY(_vector_table)
|
||||
ENTRY(_freertos_vector_table)
|
||||
|
||||
/* Define the sections, and where they are mapped in memory */
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text : {
|
||||
*(.freertos_vectors)
|
||||
*(.vectors)
|
||||
*(.boot)
|
||||
*(.text)
|
||||
|
|
|
@ -100,30 +100,92 @@
|
|||
#include "xscugic.h"
|
||||
#include "xil_exception.h"
|
||||
|
||||
int main()
|
||||
/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,
|
||||
or 0 to run the more comprehensive test and demo application. */
|
||||
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Configure the hardware as necessary to run this demo.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
|
||||
/*
|
||||
* main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.
|
||||
* main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.
|
||||
*/
|
||||
#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1
|
||||
extern void main_blinky( void );
|
||||
#else
|
||||
extern void main_full( void );
|
||||
#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */
|
||||
|
||||
/* Prototypes for the standard FreeRTOS callback/hook functions implemented
|
||||
within this file. */
|
||||
void vApplicationMallocFailedHook( void );
|
||||
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 )
|
||||
{
|
||||
init_platform();
|
||||
/* Configure the hardware ready to run the demo. */
|
||||
prvSetupHardware();
|
||||
|
||||
print("Hello World\n\r");
|
||||
/* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
|
||||
of this file. */
|
||||
#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1
|
||||
{
|
||||
main_blinky();
|
||||
}
|
||||
#else
|
||||
{
|
||||
main_full();
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vAssertCalled( const char * pcFile, unsigned long ulLine )
|
||||
{
|
||||
( void ) pcFile;
|
||||
( void ) ulLine;
|
||||
}
|
||||
|
||||
|
||||
void vConfigureTickInterrupt( void )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
int Status;
|
||||
static 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.
|
||||
|
@ -142,19 +204,111 @@ static void prvSetupHardware( void )
|
|||
(void *)8);
|
||||
#endif
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
/* Called if a call to pvPortMalloc() fails because there is insufficient
|
||||
free memory available in the FreeRTOS heap. pvPortMalloc() is called
|
||||
internally by FreeRTOS API functions that create tasks, queues, software
|
||||
timers, and semaphores. The size of the FreeRTOS heap is set by the
|
||||
configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationStackOverflowHook( xTaskHandle pxTask, char *pcTaskName )
|
||||
{
|
||||
( void ) pcTaskName;
|
||||
( void ) pxTask;
|
||||
|
||||
/* Run time stack overflow checking is performed if
|
||||
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||
function is called if a stack overflow is detected. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
}
|
||||
volatile size_t xFreeHeapSpace;
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t xTask, const char * pcTaskName )
|
||||
{
|
||||
/* This is just a trivial example of an idle hook. It is called on each
|
||||
cycle of the idle task. It must *NOT* attempt to block. In this case the
|
||||
idle task just queries the amount of FreeRTOS heap that remains. See the
|
||||
memory management section on the http://www.FreeRTOS.org web site for memory
|
||||
management options. If there is a lot of heap memory free then the
|
||||
configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up
|
||||
RAM. */
|
||||
xFreeHeapSpace = xPortGetFreeHeapSize();
|
||||
|
||||
/* Remove compiler warning about xFreeHeapSpace being set but never used. */
|
||||
( void ) xFreeHeapSpace;
|
||||
|
||||
#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1
|
||||
{
|
||||
/* If the file system is only going to be accessed from one task then
|
||||
F_FS_THREAD_AWARE can be set to 0 and the set of example files is
|
||||
created before the RTOS scheduler is started. If the file system is
|
||||
going to be access from more than one task then F_FS_THREAD_AWARE must
|
||||
be set to 1 and the set of sample files are created from the idle task
|
||||
hook function. */
|
||||
#if F_FS_THREAD_AWARE == 1
|
||||
{
|
||||
static portBASE_TYPE xCreatedSampleFiles = pdFALSE;
|
||||
|
||||
/* Initialise the drive and file system, then create a few example
|
||||
files. The output from this function just goes to the stdout window,
|
||||
allowing the output to be viewed when the UDP command console is not
|
||||
connected. */
|
||||
if( xCreatedSampleFiles == pdFALSE )
|
||||
{
|
||||
vCreateAndVerifySampleFiles();
|
||||
xCreatedSampleFiles = pdTRUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vAssertCalled( const char * pcFile, unsigned long ulLine )
|
||||
{
|
||||
volatile unsigned long ul = 0;
|
||||
|
||||
( void ) pcFile;
|
||||
( void ) ulLine;
|
||||
|
||||
taskENTER_CRITICAL();
|
||||
{
|
||||
/* Set ul to a non-zero value using the debugger to step out of this
|
||||
function. */
|
||||
while( ul == 0 )
|
||||
{
|
||||
portNOP();
|
||||
}
|
||||
}
|
||||
taskEXIT_CRITICAL();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0
|
||||
{
|
||||
/* The full demo includes a software timer demo/test that requires
|
||||
prodding periodically from the tick interrupt. */
|
||||
vTimerPeriodicISRTests();
|
||||
|
||||
/* Call the periodic queue overwrite from ISR demo. */
|
||||
vQueueOverwritePeriodicISRDemo();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIRQHandler( uint32_t ulICCIAR )
|
||||
{
|
||||
|
|
232
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c
Normal file
232
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main_blinky.c
Normal file
|
@ -0,0 +1,232 @@
|
|||
/*
|
||||
FreeRTOS V8.0.0:rc2 - Copyright (C) 2014 Real Time Engineers Ltd.
|
||||
All rights reserved
|
||||
|
||||
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* FreeRTOS provides completely free yet professionally developed, *
|
||||
* robust, strictly quality controlled, supported, and cross *
|
||||
* platform software that has become a de facto standard. *
|
||||
* *
|
||||
* Help yourself get started quickly and support the FreeRTOS *
|
||||
* project by purchasing a FreeRTOS tutorial book, reference *
|
||||
* manual, or both from: http://www.FreeRTOS.org/Documentation *
|
||||
* *
|
||||
* Thank you! *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License (version 2) as published by the
|
||||
Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
|
||||
|
||||
>>! NOTE: The modification to the GPL is included to allow you to distribute
|
||||
>>! a combined work that includes FreeRTOS without being obliged to provide
|
||||
>>! the source code for proprietary components outside of the FreeRTOS
|
||||
>>! kernel.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. Full license text is available from the following
|
||||
link: http://www.freertos.org/a00114.html
|
||||
|
||||
1 tab == 4 spaces!
|
||||
|
||||
***************************************************************************
|
||||
* *
|
||||
* Having a problem? Start by reading the FAQ "My application does *
|
||||
* not run, what could be wrong?" *
|
||||
* *
|
||||
* http://www.FreeRTOS.org/FAQHelp.html *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
http://www.FreeRTOS.org - Documentation, books, training, latest versions,
|
||||
license and Real Time Engineers Ltd. contact details.
|
||||
|
||||
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
|
||||
including FreeRTOS+Trace - an indispensable productivity tool, a DOS
|
||||
compatible FAT file system, and our tiny thread aware UDP/IP stack.
|
||||
|
||||
http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
|
||||
Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS
|
||||
licenses offer ticketed support, indemnification and middleware.
|
||||
|
||||
http://www.SafeRTOS.com - High Integrity Systems also provide a safety
|
||||
engineered and independently SIL3 certified version for use in safety and
|
||||
mission critical applications that require provable dependability.
|
||||
|
||||
1 tab == 4 spaces!
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* NOTE 1: This project provides two demo applications. A simple blinky style
|
||||
* project, and a more comprehensive test and demo application. The
|
||||
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select
|
||||
* between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY
|
||||
* in main.c. This file implements the simply blinky style version.
|
||||
*
|
||||
* NOTE 2: This file only contains the source code that is specific to the
|
||||
* basic demo. Generic functions, such FreeRTOS hook functions, and functions
|
||||
* required to configure the hardware are defined in main.c.
|
||||
******************************************************************************
|
||||
*
|
||||
* main_blinky() creates one queue, and two tasks. It then starts the
|
||||
* scheduler.
|
||||
*
|
||||
* The Queue Send Task:
|
||||
* The queue send task is implemented by the prvQueueSendTask() function in
|
||||
* this file. prvQueueSendTask() sits in a loop that causes it to repeatedly
|
||||
* block for 200 milliseconds, before sending the value 100 to the queue that
|
||||
* was created within main_blinky(). Once the value is sent, the task loops
|
||||
* back around to block for another 200 milliseconds...and so on.
|
||||
*
|
||||
* The Queue Receive Task:
|
||||
* The queue receive task is implemented by the prvQueueReceiveTask() function
|
||||
* in this file. prvQueueReceiveTask() sits in a loop where it repeatedly
|
||||
* blocks on attempts to read data from the queue that was created within
|
||||
* main_blinky(). When data is received, the task checks the value of the
|
||||
* data, and if the value equals the expected 100, toggles an LED. The 'block
|
||||
* time' parameter passed to the queue receive function specifies that the
|
||||
* task should be held in the Blocked state indefinitely to wait for data to
|
||||
* be available on the queue. The queue receive task will only leave the
|
||||
* Blocked state when the queue send task writes to the queue. As the queue
|
||||
* send task writes to the queue every 200 milliseconds, the queue receive
|
||||
* task leaves the Blocked state every 200 milliseconds, and therefore toggles
|
||||
* the LED every 200 milliseconds.
|
||||
*/
|
||||
|
||||
/* Kernel includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* Standard demo includes. */
|
||||
#include "partest.h"
|
||||
|
||||
/* Priorities at which the tasks are created. */
|
||||
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
|
||||
/* The rate at which data is sent to the queue. The 200ms value is converted
|
||||
to ticks using the portTICK_RATE_MS constant. */
|
||||
#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_RATE_MS )
|
||||
|
||||
/* The number of items the queue can hold. This is 1 as the receive task
|
||||
will remove items as they are added, meaning the send task should always find
|
||||
the queue empty. */
|
||||
#define mainQUEUE_LENGTH ( 1 )
|
||||
|
||||
/* The LED toggled by the Rx task. */
|
||||
#define mainTASK_LED ( 0 )
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* The tasks as described in the comments at the top of this file.
|
||||
*/
|
||||
static void prvQueueReceiveTask( void *pvParameters );
|
||||
static void prvQueueSendTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Called by main() to create the simply blinky style application if
|
||||
* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.
|
||||
*/
|
||||
void main_blinky( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* The queue used by both tasks. */
|
||||
static xQueueHandle xQueue = NULL;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void main_blinky( void )
|
||||
{
|
||||
/* Create the queue. */
|
||||
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) );
|
||||
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
/* Start the two tasks as described in the comments at the top of this
|
||||
file. */
|
||||
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
|
||||
"Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
|
||||
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
|
||||
NULL, /* The parameter passed to the task - not used in this case. */
|
||||
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
|
||||
NULL ); /* The task handle is not required, so NULL is passed. */
|
||||
|
||||
xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );
|
||||
|
||||
/* Start the tasks and timer running. */
|
||||
vTaskStartScheduler();
|
||||
}
|
||||
|
||||
/* If all is well, the scheduler will now be running, and the following
|
||||
line will never be reached. If the following line does execute, then
|
||||
there was either insufficient FreeRTOS heap memory available for the idle
|
||||
and/or timer tasks to be created, or vTaskStartScheduler() was called from
|
||||
User mode. See the memory management section on the FreeRTOS web site for
|
||||
more details on the FreeRTOS heap http://www.freertos.org/a00111.html. The
|
||||
mode from which main() is called is set in the C start up code and must be
|
||||
a privileged mode (not user mode). */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvQueueSendTask( void *pvParameters )
|
||||
{
|
||||
portTickType xNextWakeTime;
|
||||
const unsigned long ulValueToSend = 100UL;
|
||||
|
||||
/* Remove compiler warning about unused parameter. */
|
||||
( void ) pvParameters;
|
||||
|
||||
/* Initialise xNextWakeTime - this only needs to be done once. */
|
||||
xNextWakeTime = xTaskGetTickCount();
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Place this task in the blocked state until it is time to run again. */
|
||||
vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
|
||||
|
||||
/* Send to the queue - causing the queue receive task to unblock and
|
||||
toggle the LED. 0 is used as the block time so the sending operation
|
||||
will not block - it shouldn't need to block as the queue should always
|
||||
be empty at this point in the code. */
|
||||
xQueueSend( xQueue, &ulValueToSend, 0U );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvQueueReceiveTask( void *pvParameters )
|
||||
{
|
||||
unsigned long ulReceivedValue;
|
||||
const unsigned long ulExpectedValue = 100UL;
|
||||
|
||||
/* Remove compiler warning about unused parameter. */
|
||||
( void ) pvParameters;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Wait until something arrives in the queue - this task will block
|
||||
indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
|
||||
FreeRTOSConfig.h. */
|
||||
xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
|
||||
|
||||
/* To get here something must have been received from the queue, but
|
||||
is it the expected value? If it is, toggle the LED. */
|
||||
if( ulReceivedValue == ulExpectedValue )
|
||||
{
|
||||
vParTestToggleLED( mainTASK_LED );
|
||||
ulReceivedValue = 0U;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
|
||||
<pathentry excluding="ps7_cortexa9_0/libsrc/standalone_v3_12_a/src/asm_vectors.S" kind="src" path=""/>
|
||||
<pathentry kind="src" path=""/>
|
||||
<pathentry kind="out" path=""/>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
|
|
|
@ -73,4 +73,15 @@
|
|||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.make.core.makeNature</nature>
|
||||
</natures>
|
||||
<filteredResources>
|
||||
<filter>
|
||||
<id>1390399902942</id>
|
||||
<name></name>
|
||||
<type>6</type>
|
||||
<matcher>
|
||||
<id>org.eclipse.ui.ide.multiFilter</id>
|
||||
<arguments>1.0-name-matches-false-false-asm_vectors.S</arguments>
|
||||
</matcher>
|
||||
</filter>
|
||||
</filteredResources>
|
||||
</projectDescription>
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
Release 2013.4 - libgen Xilinx EDK 2013.4 Build EDK_2013.4.20131205
|
||||
(nt)
|
||||
Copyright (c) 1995-2013 Xilinx, Inc. All rights reserved.
|
||||
|
||||
Command Line: libgen -hw ../ZC702_hw_platform/system.xml -pe ps7_cortexa9_0 -log
|
||||
libgen.log system.mss
|
||||
|
||||
|
||||
Staging source files.
|
||||
Running DRCs.
|
||||
Running generate.
|
||||
Running post_generate.
|
||||
Running include - 'make -s include "COMPILER=arm-xilinx-eabi-gcc"
|
||||
"ARCHIVER=arm-xilinx-eabi-ar" "COMPILER_FLAGS= -O2 -c"
|
||||
"EXTRA_COMPILER_FLAGS=-g"'.
|
||||
|
||||
Running libs - 'make -s libs "COMPILER=arm-xilinx-eabi-gcc"
|
||||
"ARCHIVER=arm-xilinx-eabi-ar" "COMPILER_FLAGS= -O2 -c"
|
||||
"EXTRA_COMPILER_FLAGS=-g"'.
|
||||
Running execs_generate.
|
|
@ -15,6 +15,7 @@ BEGIN PROCESSOR
|
|||
PARAMETER DRIVER_NAME = cpu_cortexa9
|
||||
PARAMETER DRIVER_VER = 1.01.a
|
||||
PARAMETER HW_INSTANCE = ps7_cortexa9_0
|
||||
PARAMETER EXTRA_COMPILER_FLAGS = -g -O0
|
||||
END
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue