From 4be6a43e0a77d23a2d33ced554407ea25e5eb2b4 Mon Sep 17 00:00:00 2001 From: richardbarry Date: Tue, 4 Jan 2011 17:40:27 +0000 Subject: [PATCH] Added PSoC5 demo applications. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1223 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../FreeRTOS_Demo Workspace.cywrk | 22 + .../FreeRTOS_Demo.cydsn/FreeRTOSConfig.h | 120 ++ .../FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr | Bin 0 -> 23143 bytes .../FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj | 1010 +++++++++++++++++ .../FreeRTOS_Demo.cydsn/IntQueueTimer.c | 98 ++ .../FreeRTOS_Demo.cydsn/IntQueueTimer.h | 62 + .../FreeRTOS_Demo.cydsn/ParTest.c | 117 ++ .../FreeRTOS_Demo.cydsn/Serial.c | 226 ++++ .../FreeRTOS_Demo.cydsn/TimerTest.c | 128 +++ .../TopDesign/TopDesign.cysch | Bin 0 -> 122349 bytes .../FreeRTOS_Demo.cydsn/device.h | 20 + .../FreeRTOS_Demo.cydsn/main.c | 347 ++++++ .../FreeRTOS_Demo Workspace.cywrk | 22 + .../FreeRTOS_Demo.cydsn/FreeRTOSConfig.h | 120 ++ .../FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr | Bin 0 -> 23143 bytes .../FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj | 1003 ++++++++++++++++ .../FreeRTOS_Demo.cydsn/IntQueueTimer.c | 98 ++ .../FreeRTOS_Demo.cydsn/IntQueueTimer.h | 62 + .../FreeRTOS_Demo.cydsn/ParTest.c | 117 ++ .../FreeRTOS_Demo.cydsn/Serial.c | 226 ++++ .../FreeRTOS_Demo.cydsn/TimerTest.c | 128 +++ .../TopDesign/TopDesign.cysch | Bin 0 -> 122349 bytes .../FreeRTOS_Demo.cydsn/device.h | 20 + .../FreeRTOS_Demo.cydsn/main.c | 347 ++++++ .../FreeRTOS_Demo Workspace.cywrk | 22 + .../FreeRTOS_Demo.cydsn/FreeRTOSConfig.h | 120 ++ .../FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr | Bin 0 -> 23143 bytes .../FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj | 1003 ++++++++++++++++ .../FreeRTOS_Demo.cydsn/IntQueueTimer.c | 98 ++ .../FreeRTOS_Demo.cydsn/IntQueueTimer.h | 62 + .../FreeRTOS_Demo.cydsn/ParTest.c | 117 ++ .../FreeRTOS_Demo.cydsn/Serial.c | 226 ++++ .../FreeRTOS_Demo.cydsn/TimerTest.c | 128 +++ .../TopDesign/TopDesign.cysch | Bin 0 -> 122349 bytes .../FreeRTOS_Demo.cydsn/device.h | 20 + .../FreeRTOS_Demo.cydsn/main.c | 347 ++++++ 36 files changed, 6436 insertions(+) create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo Workspace.cywrk create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/ParTest.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/Serial.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TimerTest.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/device.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/main.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo Workspace.cywrk create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/ParTest.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/Serial.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TimerTest.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/device.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/main.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo Workspace.cywrk create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/ParTest.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/Serial.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TimerTest.c create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/device.h create mode 100644 Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/main.c diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo Workspace.cywrk b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo Workspace.cywrk new file mode 100644 index 000000000..fcfe6936d --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo Workspace.cywrk @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h new file mode 100644 index 000000000..4180c4c6a --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h @@ -0,0 +1,120 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#include + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) BCLK__BUS_CLK__HZ ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 100 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 32 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 + +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_MALLOC_FAILED_HOOK 1 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/** + * Configure the number of priority bits. This is normally + * __NVIC_PRIO_BITS but PSoC Creator beta 5 contained a larger + * value for the priority than is implemented in the hardware so + * set it here to what the data sheet describes. + */ +#define configPRIO_BITS 3 /* 8 priority levels */ + +/* The lowest priority. */ +#define configKERNEL_INTERRUPT_PRIORITY ( 7 << (8 - configPRIO_BITS) ) + +/* Priority 5, or 160 as only the top three bits are implemented. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << (8 - configPRIO_BITS) ) + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr new file mode 100644 index 0000000000000000000000000000000000000000..239418cc3fe1ff9a39dfdfe4af41942f06f50e21 GIT binary patch literal 23143 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 literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj new file mode 100644 index 000000000..0b1cd766e --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj @@ -0,0 +1,1010 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.c new file mode 100644 index 000000000..94787b3d4 --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.c @@ -0,0 +1,98 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include +#include "FreeRTOS.h" +#include "task.h" +/*---------------------------------------------------------------------------*/ + +extern portBASE_TYPE xFirstTimerHandler( void ); +extern portBASE_TYPE xSecondTimerHandler( void ); +/*---------------------------------------------------------------------------*/ + +CY_ISR_PROTO(vHighFrequencyFirstISR); +CY_ISR_PROTO(vHighFrequencySecondISR); +/*---------------------------------------------------------------------------*/ + +/** + * Installs and starts the ISRs that drive the Interupt Queue Tests. + */ +void vInitialiseTimerForIntQueueTest( void ) +{ + taskENTER_CRITICAL(); + { + /* Initialise and start the First Timer ISR. */ + isr_High_Frequency_2000Hz_ClearPending(); + isr_High_Frequency_2000Hz_StartEx((cyisraddress)vHighFrequencyFirstISR); + + /* Initialise and start the Second Timer ISR. */ + isr_High_Frequency_2001Hz_ClearPending(); + isr_High_Frequency_2001Hz_StartEx((cyisraddress)vHighFrequencySecondISR); + } + taskEXIT_CRITICAL(); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vHighFrequencyFirstISR) +{ + /* Call back into the test code and context switch if necessary. */ + portEND_SWITCHING_ISR( xFirstTimerHandler() ); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vHighFrequencySecondISR) +{ + /* Call back into the test code and context switch if necessary. */ + portEND_SWITCHING_ISR( xSecondTimerHandler() ); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.h b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.h new file mode 100644 index 000000000..a022717fd --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/IntQueueTimer.h @@ -0,0 +1,62 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef INT_QUEUE_TIMER_H_ +#define INT_QUEUE_TIMER_H_ + +/** + * Install and start the ISRs that drive the Interupt Queue Tests. + */ +void vInitialiseTimerForIntQueueTest( void ); + +#endif /* INT_QUEUE_TIMER_H_ */ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/ParTest.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/ParTest.c new file mode 100644 index 000000000..e98e673de --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/ParTest.c @@ -0,0 +1,117 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" +/*---------------------------------------------------------------------------*/ + +#define partstMAX_LED ( 4 ) +/*---------------------------------------------------------------------------*/ + +static volatile char cLedOutput[ partstMAX_LED ]; +/*---------------------------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ +long lIndex; + for ( lIndex = 0; lIndex < partstMAX_LED; lIndex++ ) + { + cLedOutput[ lIndex ] = 0; + } +} +/*---------------------------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + taskENTER_CRITICAL(); + { + switch ( uxLED ) + { + case 0: + Pin_LED_0_Write( xValue & 0x1 ); + break; + case 1: + Pin_LED_1_Write( xValue & 0x1 ); + break; + case 2: + Pin_LED_2_Write( xValue & 0x1 ); + break; + case 3: + Pin_LED_3_Write( xValue & 0x1 ); + break; + default: + /* Do nothing. */ + break; + } + } + taskEXIT_CRITICAL(); + + /* Record the output for the sake of toggling. */ + if ( uxLED < partstMAX_LED ) + { + cLedOutput[ uxLED ] = ( xValue & 0x1 ); + } +} +/*---------------------------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ + if ( uxLED < partstMAX_LED ) + { + vParTestSetLED( uxLED, !cLedOutput[ uxLED ] ); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/Serial.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/Serial.c new file mode 100644 index 000000000..a82d0c00a --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/Serial.c @@ -0,0 +1,226 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include +#include "FreeRTOS.h" +#include "queue.h" +#include "task.h" +#include "serial.h" +/*---------------------------------------------------------------------------*/ + +#define serialSTRING_DELAY_TICKS ( portMAX_DELAY ) +/*---------------------------------------------------------------------------*/ + +CY_ISR_PROTO(vUartRxISR); +CY_ISR_PROTO(vUartTxISR); +/*---------------------------------------------------------------------------*/ + +static xQueueHandle xSerialTxQueue = NULL; +static xQueueHandle xSerialRxQueue = NULL; +/*---------------------------------------------------------------------------*/ + +xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength ) +{ + /* Configure Rx. */ + xSerialRxQueue = xQueueCreate( uxQueueLength, sizeof( signed char ) ); + isr_UART1_RX_BYTE_RECEIVED_ClearPending(); + isr_UART1_RX_BYTE_RECEIVED_StartEx(vUartRxISR); + + /* Configure Tx */ + xSerialTxQueue = xQueueCreate( uxQueueLength, sizeof( signed char ) ); + isr_UART1_TX_BYTE_COMPLETE_ClearPending() ; + isr_UART1_TX_BYTE_COMPLETE_StartEx(vUartTxISR); + + /* Clear the interrupt modes for the Tx for the time being. */ + UART_1_SetTxInterruptMode( 0 ); + + /* Both configured successfully. */ + return (xComPortHandle)( xSerialTxQueue && xSerialRxQueue ); +} +/*---------------------------------------------------------------------------*/ + +void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength ) +{ +unsigned short usIndex = 0; + for ( usIndex = 0; usIndex < usStringLength; usIndex++ ) + { + /* Check for pre-mature end of line. */ + if ( '\0' == pcString[ usIndex ] ) + { + break; + } + + /* Send out, one character at a time. */ + if ( pdTRUE != xSerialPutChar( NULL, pcString[ usIndex ], serialSTRING_DELAY_TICKS ) ) + { + /* Failed to send, this will be picked up in the receive comtest task. */ + } + } +} +/*---------------------------------------------------------------------------*/ + +signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFALSE; + if ( pdTRUE == xQueueReceive( xSerialRxQueue, pcRxedChar, xBlockTime ) ) + { + /* Picked up a character. */ + xReturn = pdTRUE; + } + return xReturn; +} +/*---------------------------------------------------------------------------*/ + +signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFALSE; + + /* The ISR is processing characters is so just add to the end of the queue. */ + if ( pdTRUE == xQueueSend( xSerialTxQueue, &cOutChar, xBlockTime ) ) + { + xReturn = pdTRUE; + } + else + { + /* The queue is probably full. */ + xReturn = pdFALSE; + } + + /* Make sure that the interrupt will fire in the case where: + * Currently sending so the Tx Complete will fire. + * Not sending so the Empty will fire. + */ + taskENTER_CRITICAL(); + UART_1_SetTxInterruptMode( UART_1_TX_STS_COMPLETE | UART_1_TX_STS_FIFO_EMPTY ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vUartRxISR) +{ +portBASE_TYPE xTaskWoken = pdFALSE; +volatile unsigned char ucStatus = 0; +signed char cInChar = 0; +unsigned long ulMask = 0; + + /* Read the status to acknowledge. */ + ucStatus = UART_1_ReadRxStatus(); + + /* Only interested in a character being received. */ + if ( 0 != ( ucStatus & UART_1_RX_STS_FIFO_NOTEMPTY ) ) + { + /* Get the character. */ + cInChar = UART_1_GetChar(); + + /* Mask off the other RTOS interrupts to interact with the queue. */ + ulMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Try to deliver the character. */ + if ( pdTRUE != xQueueSendFromISR( xSerialRxQueue, &cInChar, &xTaskWoken ) ) + { + /* Run out of space. */ + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulMask ); + } + + /* If we delivered the character then a context switch might be required. */ + portEND_SWITCHING_ISR( xTaskWoken ); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vUartTxISR) +{ +portBASE_TYPE xTaskWoken = pdFALSE; +volatile unsigned char ucStatus = 0; +signed char cOutChar = 0; +unsigned long ulMask = 0; + + /* Read the status to acknowledge. */ + ucStatus = UART_1_ReadTxStatus(); + + /* Check to see whether this is a genuine interrupt. */ + if ( ( 0 != ( ucStatus & UART_1_TX_STS_COMPLETE ) ) + || ( 0 != ( ucStatus & UART_1_TX_STS_FIFO_EMPTY ) ) ) + { + /* Mask off the other RTOS interrupts to interact with the queue. */ + ulMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if ( pdTRUE == xQueueReceiveFromISR( xSerialTxQueue, &cOutChar, &xTaskWoken ) ) + { + /* Send the next character. */ + UART_1_PutChar( cOutChar ); + + /* If we are firing, then the only interrupt we are interested in + * is the Complete. The application code will add the Empty interrupt + * when there is something else to be done. + */ + UART_1_SetTxInterruptMode( UART_1_TX_STS_COMPLETE ); + } + else + { + /* There is no work left so disable the interrupt + * until the application puts more into the queue. + */ + UART_1_SetTxInterruptMode( 0 ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulMask ); + } + + /* If we delivered the character then a context switch might be required. */ + portEND_SWITCHING_ISR( xTaskWoken ); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TimerTest.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TimerTest.c new file mode 100644 index 000000000..3087d1683 --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TimerTest.c @@ -0,0 +1,128 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* High speed timer test as described in main.c. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( ( unsigned portSHORT ) 20000 ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The number of interrupts to pass before we start looking at the jitter. */ +#define timerSETTLE_TIME 5 +/*---------------------------------------------------------------------------*/ + +/* + * Configures the two timers used to perform the test. + */ +void vSetupTimerTest( void ); + +/* Interrupt handler in which the jitter is measured. */ +CY_ISR_PROTO(vTimer20KHzISR); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +volatile unsigned portSHORT usMaxJitter = 0; +/*---------------------------------------------------------------------------*/ + +void vSetupTimerTest( void ) +{ + /* Install the ISR. */ + isrTimer_20KHz_TC_StartEx(vTimer20KHzISR); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vTimer20KHzISR) +{ +static unsigned short usLastCount = 0, usSettleCount = 0, usMaxDifference = 0; +unsigned short usThisCount, usDifference; + + /* Capture the free running timer value as we enter the interrupt. */ + usThisCount = Timer_48MHz_ReadCounter(); + + if( usSettleCount >= timerSETTLE_TIME ) + { + /* What is the difference between the timer value in this interrupt + and the value from the last interrupt. Timer counts down. */ + usDifference = usLastCount + ~usThisCount + 1; + + /* Store the difference in the timer values if it is larger than the + currently stored largest value. The difference over and above the + expected difference will give the 'jitter' in the processing of these + interrupts. */ + if( usDifference > usMaxDifference ) + { + usMaxDifference = usDifference; + + /* Calculate the Jitter based on the difference we expect. */ + usMaxJitter = usMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + else + { + /* Don't bother storing any values for the first couple of + interrupts. */ + usSettleCount++; + } + + /* Remember what the timer value was this time through, so we can calculate + the difference the next time through. */ + usLastCount = usThisCount; +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch new file mode 100644 index 0000000000000000000000000000000000000000..eb724d6d6eacb442c26431faa416192e9957d1ad GIT binary patch literal 122349 zcmeEv2RxSD8!$yl(Uh6_2-%yEjEvHfB&D)iMi~`ZB_u^dgS4f+XcEcWo+nacNN zF@O?|EQ_K1O31UO-oUr9tVAgbYYPj5$qqF`17`50#-hTa%A&-g43#)SN}fdnQVx(S z56{%$i8iDhAXlBrbA~diEDNctJ$ySst}|Q*euD1fP@vvn@a4ubpXz`o)pcx~wS}F% z5qbcBSPnm8&lpU+XD|s6@XBEJp{@uxsLL9@dIJPw=pzEgmt_X@t@E81%VZe56ZF!R z#SE_YRNAv07~G^G1coM5q6Gz1U|q$8>@n8T@tB}x&XZ4+VzRW9#>OPugfw5%tT z#2M&>j3m7VDw+rndNUhcQF11X#0i==gO3-C$s9(HBj^Dg5gF|%6vSy#qhPEJaMhqv zj*#OFDQ)=Ignxpp8US-GK+lEn)B)a7fo}>O+rTdjoks8@;LM>bbaxD(6W9%30P?_r zpE^whmLy2C1ZqVPI{{D!LOoQmk!=;?a`b`mOoe8bLe)-WwmOz}KPX661;GUZ(_esN zXFUEnR?~1qJcG)~vUY$a?My)uAtMi%i!ef*Mts($@E4(oSS=4F)Zt$n?o#I2#{U|wJv~x z&4K^k)bca<8MXILjztt|_Jv-m!u&a~;C)x3sR!*T06@q`6H-b5CM;(JYt$8bwE}8$ zX3+!Ga)z`wRktfuVjA2dtd>924*RwVtj@)l91%yafX#ZhL0?{Ak z5hPXi@Gno{k8&HHA+dLYJj63)3eTLV@|pmih47XNu6*F|ro zte=sRAK}-wK2Vf!hQ1>6K%$Dv7W;y|#Xh6lBoFz{kdN!b8G5M&ADn7uc&bUQ8&zaw zP~)%he|~C=@ER?8Ap3P>nFceBQb14ZX&SupJM_W0OA9k#2;MYNQ-hHpG>~>`Q1gZ} zY7cXUkWhg4VFe-8AD{}P3@YuDT1$78bC=&HF z#*F{bjCPvQmD-_PZ6SSbT z5Gapa1W~A?{0w*##XV#Ip3p>hhGPY9{LTWw`bp2awgjC)iA^1F8C5JKSjvF<@^J3} z%LA7NUXiP#B1WV)lzfro5&nQo7s(8goAyOQFMS-LGyHplNV}-Vky-o$BkSBk+laJb z97y<(3?rGtJ}-okAt}UVk5UU+>?rf#*ogk54*8ga@+Xqa_7Tx~C9MqG!{YC0nLqm9 zGH+kzzlX8J=zwtkQ-p$^2tYe8$942i4Y&=7H2?uo(nYz|oY|cvb-NBB4U%*Z{8XEEB+Fg1}}lRiP9`*96*%uY`gf zwiIM_xZHoFQe&ZfZ$QvhLpKFIWeL>SHfUtNsDGo_g)5aXXOcotC{cN+Jt{#d1O(bl zaLCBSQ8PgaRl9A_9r|#8YE;C!FqlfiO2tNhR|uN{vxHR64LX3ry<@v=0a2oDR46y& z6e8txfFh{%YEnHW^a!muI8y9Cp;1U*afAp394&%et!-57jcrymv>)MwqH@sHW)ZbTNP;^1){wpYyF(6BCmgmp34SKL`D2?hMGJg~fkkQHm7NVt= z2o1`BtY|_Y<^)7;A|jxX09mavMX5C5N^}fb0q>9)kj@}sLM}TMx=tzJs3}1ELVpW? z|7lAO%2Gu3p!@pg-~k#QX;D>_Ko89C{|LG3KIk@lK%;;XMWoP}hjWjF3&}C2(13tA zf|h=?_YY1g3JTx{|=e>kso#kLL0)ML4^n@%D~@HMn^LQu?eG*0y!i~<|=?jsIC*aKp7AS z1s_K!fk@TKh)46hRRC@@EA>Pc3S^&6xDd2lywJ3X|n(qu4g~S4#7Km%eVQ2vxF$>9x29&|4NN`YfK*t6; zK@jfiHKf=9yFwf$Y{|sec*q|p9B^_1q`9gk_(GlRK?Dgwiy?L^C=t0+gK zexqZ*L- zqlFli3}hjgLOmb#X>`EgLM1E&9eiliM~4Q!iO*rWG6&K8ysB$Itus0V=B^vt_1@^ zOrRa~)?DI<5ArsrULXOBTGie6U7k?pSbdA#~lfqvTvIQs1yklF=Wy$p)1s@3n07rP#DZ3 z@Ct)@l)B<#5z5mR33l65Xa5l~4OOdKhB zqbt*6ZzM277RBC(m;jKog0FvK_7?#bxc4yk>7*H)dz5Q&R?+tDNX;%XBIM$T1xP87 zYB*4I98(yvhow=iLzIb(*1*5#nfJgulyTEdf1{rrJ}K1CixN z48KmA!cn4%fi``_TQrf9SSys{ag->(Ag&|*!w?NLo}$!FB5%;phS8#^wEWd5QSD-H zB%^GT@#jHSZ|3o5CSbyddo$L8jAN@axOqG*BQ16j>PNyFJj>W>rv zS26Nrgi+_QN|fU0Sc$s9igSo$7YPe1D=Q-O8OS119DCzHNO#uK2s5DRPItyYN9j;P z8ZsFNpp@t@Ta0Q6c?%HccbTMNd#z9zq6DgPIADywK>(n(iqaT~R6)ZSv8N+Q5KRzl z2r9IPV1O11HiYP*1O}BNgs}g_&&OasfO|?#dPtrd!dGvQ;b+pB6}7z_@cn30Gd|kdlk6HJTxvW1_+?QfhO0#sso>+ zHs9g!)`Q`61mXTuv6aZNklrI|pdy99!7UHS-%!$Zhq0o`301=PkS2CZ00o0t1GfN; zH@^i9v_}wS;NJ=nqLO!p$lt>ci#Cz;-;N)X03SL-Kugf^q}efboj|Hn<>X@c{_X%#_H5kO4W!Oc_k1Cp2flG=uq;x*}&G zoQT0JfpohR#9%(63OsHv22_bwXE7uNx7v`v6pS+Rq-ZnlctNK~XAJ~iqxDx55<7@B zv6!@}Z+y@U$}@D4sX#XuLSYOqWNqQ#_zKm~>Ns6y8dT>E|47f>p-om`t3NhQD~9x2 z9kh|b>GpYY%ZH^xVzSZQvw(MljA|AxsupE+$a60~*oMi`oKZ zDbcZ&w1E=e?+6r=scG?q;rh@b7Dk_<5fTL~)alUmhkH-x@BwtmpcsMMKJY1Oc_=tw zFafdi;(N4L1Hg+2j_88IffK-DF^q!%RiYH1NtB|{1%It*t3@26^av9eJmL)g;RBp_ zN|f#p6{Q~GOm`_Q^#~`GDmS@(I-vpssYf_1tk{%M8|6S;WH5PPemkT+Vj?ARX;2iN zlQqc=rRX(@X$EsJb?q+gF_^CKRyWL+D8&jz%SeS!;fu)CqGb}LC}sTu92iX8JVkoV zV2*?|4vxX(ZO{F&F$NQxq*l)8#~fer9UK&XIKG0SZ^Xiq(DrdM>Zyb@XejtmfKm!Z zZL6*t$C2Ke*uLSC!Mp)&Fqm@Cjkelx z<)YmeRaavDz?cxU`w_JfZ8~TNAv=zcCg5sEMFTDR7z=`Hp0*5=?$b^bV!fgyBAj_> z(H6dXL$-cq{y^L#0bes<`d33*mfF#Y^t;{bj2a&f0nJzFc*RaDL7Hers0*U@PGX%< zlf*$FBg2890)XZYqASWmcZt`Tux_^RxOUhZkynzTvNz(aF_@d++6l$+mcfjqu7rCJ zgfswvW?v2zr6)#UdRGF?xSasEJ5(yeb_U)xg46^m>uP`W^L+2rXDvQVIJy!XcW3y5c;;8-v>3K&KLNaN1ixrY#?RBr74`31}MblSQk% zD{Rif-O-4~WOL#VEsY0AF_;F_wXG#uXzHlZ7HUDEj~2!{N_1Z~-Rg&a>q7s29iQlB z*ggYjM8XhM+@XzFK^7k_K!i4$XbJ9M*dbbvu^bv{(0GRa2Bbt7VnmD)&@Wm_LYWk$ zBX0;W!dP#z3m(O`j<5z}3Z393TJ%6CGocMckZrT3({qHb7=#ytN#2ww#g&auy9)-m zr@k|7W-#@jEm|E)1|hUsBT+-cq$Yfj zexuYzEcm!ek-DSzm6+0y?BS|GyEjr-486hCP8)=9@Esm1A}QhG?h23@odAMq2Ggn? zAjDDtV@FvG*Atp@iNZkVtb!Nj!V8qhO=tS_l%pMJ*(QPp<@W7&UupZdkXt6_u%?yEyV2WbL|NGJf2xB&ENA;re+ zwkYFuxB?JyVG98Cp22j6ba&#&3wd1;+a1c%#1Yd!1zcB3=?WEr3I)Ts4XNJH$o~u@ zT0i)2;}0xai4i5y zZ-W8?DjOJ#LVGJv7{y?7G{}=OG)qFDu&^Lwf(9_z5enOfG6Y~=+aCfHlQciT{qbGV zRT6S&bj9?~_Zc#nGSqXF=4fcQxpt8bAZx<|KJcgyU&`-CiGK{H3p{K$+d-FWpwqnp zd{^lmV{8ZqKsmbO0E_N&0G^QYbB!6P>7N-u@%#J15JH|X0UdnuPvISH3ju9pNT1PV zN06SVsYKt#ST`cC;ifKhWD*}d#^a!a7MBk$2Hfc_LZP4(TxAoZ_gc$d3!JD|#3;8QzKQZKmLm#L(WLoyYhlmE9!iwgBdGXiR+qAZd z{&z^spSh+w^L9tT3KU#WR>w8p-G%&r`y3~lzvHUGKmyS+^54PEi57s7g!HP?pjM9p zv;Y%zViPkA2Dx(VCO?~{uD0qbIAlq zy#?S*ZzjJdp}D6)x3etVY3u~63j_NJdqVR7vL}??&`?k{AZ}c|sr#;lOBMzynBoi%fsc3i`Rs@*^HacETWuQpD09 z<)l$R;O-HEV_-~yNJpxMUul!zZZ!2C5s4Vg?bIESbQsJX)ZI?F5^Z_z|D+pAN<<6# z&koA{x8doZDBB>W6WNB^bIM>YhYX;hcK{QAoreBTy6%bT{wZ{_jrpT~hHM}GW$0Cq zr&4HHM&^%Ur^J^)Y>lX|VpuLY_z2Z-v@oJar)Pb&JHZ7!qTDZNxsoVFA>j<9Xu}OU zNIMG&(8cnpL0i*Q;9$5X=6{&@Cu1Tl1zv=?Zo^89MM7^adK%G=fEI4_9FkZi z^nam9ib2f;Q^|=HXx&ENwi=YhP;%VS(39z+J65*)gJ=y5kA+6_0*1YjQ@lHzDv0zb z8KL{^0U)g86GUUrPH2oxl06RWjfm0==2;jSJxWY7nCGZ#?>cvZdK=3Ebg)8l-lqc9 z5n?KF2PCH*(%2n{=Yd9uLMjUBZmWtDYU~X??}?|9_d4rN^qI~7PK%^n`^?+`sI=i9 zZuYB&`^z35v_F?U4WK8f|Iy?0k@A})Qk$?E!mpUK^1Whxa!(Z73*vw zLw^$P+QP$%X>6nYfr#8*FwGbXwVd({BIYre`BYC~n&F$igPzmXqA>@_9~SO>0y>S} z9i~G1Wrq#QE%XKXIzMFI+LGyW7GQg(3X&3%55l zc2|#aX3^A)@wCJs=LiG-ZyV|GuyvZyqN$9*%%!e`(24>;$x}cB2z%@mDF1rkP>~r_ zgno8Bn;kdhp#2_=BuE(uy&xxpAiY3Zf_Z5DM=pgqSV{%bSc-Nz-K2V*M_uW~UeM*v zsLNd;b$1J{13xjCx2e0SWV8(CG)OR*WmG20Q>2mZTuU5E5dy{DC62`Basmh<4aOt4F-DD? zb%pRn?+YEJ2D`bSYB(B)0zn%A!1z>}n01gQ5|@P}iF8^NzLCo#X&^}6o#3IAfcsFf zq!;`nPh8UWHok{((MTK#arp~^_j4jL6}mv}wiKlXKp46Nq&w3EGPg9^cc16Z9(dN4 z{{0&yO0fd^ubqZ6Acv-*7@&>P4+%2q_?e9E)Rd4nm^plzCW97jFOx$VI$rLHAoiwF zB#oVC@Ru5;00{fLSUYhG^exjPrRR_qo;vf2_J;5UdUWKV2xN?H;eXvoylAJ&yK+S2 z$Qb&m45PtPgdw#zf?0GU!~#ciJ%jca;hipg58t6j(sN@ff44Ce?BFjpruugqQ~jZ_ z&K$kt_ef}<_XxnwtH=-*CN9TLKVi~sG+pIr{E-i2-WY63%LF|(g0FSVQs>uZwuur* z$WXmSI76=;-OFb4nYI zVkr!Cod63O#Ym9OesBikO6*Ehlp%+r(IL)_7!1yhhCvyrJQ8Yk{(VrU6frnZBX!}N-=xSL<^!gF$FczmP((!_&n?ky+6w=}C&l>o3 zGx|8F?bng-{~hDezZ1d!L_;|uZbuLR-24zTIr<0GR)?HU^b~IyObzNve40xk4V0SJ z(lLG))qafL?H&do^tZ?;hD>1K6dD_7qfKwt!_VYA-#!`XV&Qwi$YfpfIy+!ZP({zkNG{f8x)l{3we39EZ9JXo#dg3TQHr z+ZA<{X?jBhG`#IeK>K;Kzb>}fKpVZGMqPD=|98Z;-i-a{Ec(ww)6Tr$zilw4`2iyO zUkh}&BcSV2Fn}By&oRwl8dBHpoR#wGNR(m)ZK47mr`P!(&w?fYf1RRB(cc}L_JGPm z?{Gge-A598>JJZ~j|}EZs%v=5U}LDHdfM3_4KSntN~8x&GnnSowX^gvfyyDllh6&cS&^QTjrZLmDWL|c{fX3-)MEkZ zj(xWhrPvQ*X2Twyq3(#uS{~9}dx*7Bh7;&Aoo}V zjo}o~yFS-svanDeeFk$D1w4G=C$&MZpa{H8&Yh;utY$EyAs6EPsH+_mK~Rx12B0zk zk^*(bJ}{VxaD|F`tFrv;3_dg+;!jz3=xY?@Z%}P4fIdJQW^jXXJ*c1Hv3ls8LhlM5 zeTdo$t_uD*t2w=Kn4WpJwo|>)*@DLb;Ffzh2AbAdoS^@N3PXJhpsC)l%icq32DC@;&K2}q zOt%3Gs!eAAm?m?yW0`!Jf zaJJ}R02&TI9wP)RfEs)s+&tK^uw#u16{= z0LMj_7cSR->j8p@i#{+;S_4*sbXW4fltNsz^#|7)!5JpLcgNJGQlU%ijd z(fs)59r}5*8zicK2@;(#fgEgxzj*TRg~r`qh6YVp6+k#c)S?B525?o=E-z+I_$2+$)+0N4SK7)-o{A9|s#gpgw#6VNDH zgh73h*dyrJLZUvPO$dt7N@Qn3-m$1aXoi}B{GmJvrO`o-+yND>p3ttneB04nv}#66 zkv|f#_BY!4L#q|!FuIP3Y%hl*n?xzXMd}g0({@feN}K}j9@7EA~FdS0OcPeE?mFg|XTNU>hwYHWU0mzS&zIF#W z?%4QikQ2bNBaFa%(OLC83sttA@!u{4lk+6W^*wI=d2j(T;s+ zy1)-&AD&8C0vLxMX+s)6JD0#1cl>Y}n5_bm+4uEPIrJkW3&Y zM!Joza14q^T8=-b+uJ42GA+%hDJTl5>@65=j{wAozQ3Zf1WY{v@ZPTjkPy<}2jBx( z9VP${v=kwwoeHc2?VM=$Sq5y2&{sMrm)Kdl15uO`qZ|RCE5JTLb`qdq)e&AxY7qs1 zcmI`O4AI5bMd4kvT%Zhq#zG9!?WhBv)4l7c3#}a(2#hsgd2AbdjqPHXtP6Y;;LZf{ z@jN!#hC~IrVl~yE;NXOUPMgRG>}m@ z!f126Qo)#Qv<2w}{tym^Xwp+e3nVzLh-^6ZM4O-|L=?)SRELMTk|=bfNMwSsB#|WP zdPM<2NqjpRzHyt*QmPlElqicdAQgu4-~z&>;niLjG5nF`vXEMYXobU8aZzAoct?-u zMI`eJ5@u_Vfnn>_u_*3T{0u?V{sZkJXwVaayo4%IpF!S6Tcr>K*c(y&Znv~s!p-j( zi3}-Vx&erncM^^}S=--`p_xHDcyI>U=SX%hkb^bI59Ojq3iq3#0U2%UXi7%Q5n4jGbmd2D7NT&}h}WTy|= z&w`EudbbdX6vJJscycQqQH>v@+Q?VvS%&&y5#Z2Zq1?eQ+IWq}5iytz(DeUJ*&XXA zt*~Mz5ay!rP5-c=8l=102x_PfL4mc@n|RA$exR<1x1G1A{21rh+xhyL(YEtUb&p+Y zLtFeMFxUS$<>C~ej5_9K#z=v);4_W`4H3SH*Jr>NtCyvzA$e4DN^rfW;vOKW%X#VS%k2#G(wRzuUJ@Cfbjoj0Sn967#0@Z<$F@6 zgAl*?lDV;gmCw9e>HU4IAI8dWiez1vxOZ$`;oi8|!qQlVs?77`3isSZWsUT&&-@fM zG}6rthi!Y6F0p0twk;v671i$g^%on$!MM+CeE8(MkolwAx?fYCYhA5)(D z=$oplmvt9&n&xJ&-tjr#jHi13Jm-1oN57T4IeIc>)%Opt$F}Y}@o;-lU`~K~rA}4p z&aD^ZUwZl3aJ^NpXibS;{rMYb!^y_;tq*03>U`eT-}`)P(Ys~$PoAm#xNYBw6JJLR zm^w2qeP;cPnN6optmZ1*_jzLW>IqFIq4gPG8V8BIE#0qj)#1xap|zL3#9kUJU?<<~ zZg=8?(Eh;0ZC3V|rs`Z>Gj@N;$5%JsyVT5ontSo;v9hF~F9CXIi*~(vJMOjozIbl# za&=E`OJ-x!qKujE-#tt@dxfLAzU0cm#?pJYWA&>1AL>ngX~`^WxTNoO+|5cAdX?xiI5MZezqV7u&P*JbX8#*cItLd~{|0O!L5swYtq}`qR8JpN@KTI$d~Y ze5p$vZ&Yn-jq`xu1W&73vkpaU9yBvPEMNA-w0XC`o;WdW_Ux#-Byp?lyzxmVLLR1X z-(T%G!c*~^R?t_zVYfpZXXW?vdA~dK8&f~`%C#jnd`;R{z669y_OBKd^&Dp{{ONlB zE0$9m%hrDWnE5E?!tgmWE<2i5TeFEg4o;uVO#IL=MM!IuA*YenSALIb(X65gVwL`C zuSE|j2pMPX&|=JwG<{Ms!f9T?_y?ckwF2Jq-7Xy$QNJpx+<%II!i#NnD$5U+ODpWy zlU_;T`L-M3cpnu}Xn6)V&gC3k#WHRgm!eGShR z;d=GyVr37H8aGa1oiAItXvO}CT(1LNPBuRZdJ;FTs%Cak!E^)nAv5cy%&KkWnYlyy zr1XT@v-u|$aOSCo`d?mSwb|U9xglcjvBtAJj6dsOAo5=H&swQAZD7DBYrWX^a=^ z#EBw;tS64iT~F_?xx8lLNbVyc4pl4X`<#j6`rzhOkrFU6!&YbL{L^O>_}`AsDrVF- z9#(f$3Vh13X}Zead{pG?Mkvg}Nd%Z<2DViTLu@1)8DhuqjvVJr7BH`u)l9_lZ~mZm6l z?b)R1kAjprJv5(hS*|)V@3Qor#{m5{jev#HrzzsG9T)hZ%)Xj^{njdE`bx5Juymo7cuA>gm7DH~4WpC`K7cydzzie0OoUrSiO=6KZ!aqM(^1S6!?6k>7onONI`NOE(hLRBri<4)@ zE3d4Q-ZWeLP}mXo-5htfM~=A3^_)Gi`=GgMP+^eej`n82b;cd^%36F_w2D0 z8zDUr){pyaa$HhW9`|>-*PQt6j;E{sC4sfM4;>%oMRJV2I3V+=rbNR#Yt9C1PA&Ow z7xz923g9(#XREmOUN1aFFk<_9Wv#g};lmU7UxeK=SzISGI%)2U(VT4Z$F2;TEy`(R zJ|I1^HD^rt;H$GXPMavU{FZ|UyPf!KR!7T$9&cM#yyJel;gst7kHEXK%^X*Dbue_t~em2^DTTQK(_Tjlphrf-`Jz$bDfA6}v zsp^lf#ApgVU9n?-dVW!<(yoRK52sV>ydnkO4|^>%Uw`u0f?0=Ii=uDW?V9q@cjrM_ zEt3GVU7V&38{)&Jh>nsvY0k4mYu?V_Q$Mke+`D&KUQ#q2Iz zVLM!UbY)SbQGU9X@qGO?$6V~Sd_J>?D~uZ7@U1V0j$p(cReKKYQ4!Z1FYuXOcF=j6 zd3wEuy;n{@*Td?M$Dd3Zw}Pi>utM1U!@N6<<${aWvfBua9lTG>=~2M>#06!83LmNS z&+j+=+&Zb}8%1riL~Rvq&zT#Hh$&CxW2OC3BqaiN;#(lgFQy9zS|IKB@}l|NMmqS;J2|~ z^%gQ&HZhfNHtqXz_Un=9ECKPn3wT4NWOM{B=Pwh`OxoVc7{b%EsAax^$=M@}CiauH z&78qkTI*CK5D%%NxfWv9C+|efSt6vZZdxV37iTuRUhA`aF?ab zFk-*$GR!vM$o)G3E!#47xsxoUn%T=InBvSI%(ChS?A3?UCwM#m~l+8d{Ah^ zAd$V5SEHL&^~sefoLyqN{M6XtrYDP+pAzRWEts+Vu-xNmb@6-*y-g+#^F~yDFcq(H z*K+VQ91^fd|4`Cbv8Fc)LdnCz?@ZD;_d)k!OYGzeeFV?dU+?!$>k{i66-`SYP5uhI zxJ$!MZficL>#Mx8Sm3+l?e)tFT^o#xf@i(3kbBfBSyo zvp0_3CsVN_z-H^R5Cete$}P({gFnaZG5ZoEETrXk>}5{BZ5gRATDAuZE2nUsjM$WO zb^g|Mj~wsTGRxOB-xbR_^}75<%#E22p5~W>Pd~}EzRh!B!>Q7@mtFcu?Nhya_)*%* zg4|En4#e#FxQpxD2$4Kv?Qw@AJw`OW4&VFm8^7?%$>SG}TXt)Az+|WAO-}-LH+v2a zOZKwOvaMV@-AGx~^OZ~Pp@4^r6<(TpUlX^TZZ$30H*%W6(9`~A`Bi?5h=|}xt8>C! z`A)jnExZtarsDYo3CcScAXh8}i^U%)9ncbG5x{cojjw znJdi8ystKgA3DCQpp{otRBYGOqAg{Q-y}{-G07V+Oj^nG;IgupvX7&#&8vvtm^|Be zcUi{ufTxu&UvRzPUr@19W>j_VtSx~OT;I9h-#8ezzHnTfPXJ>`&V*w1*02c;aU6yT z_D{t7U1#6%E$reXpE11kx9uGt32chf8M*7jT*E+_WrqBUM`Vh1Bv`RJ3&$2RH6 zJfAXgLKKS`$EUOx)1R59tzggQF`lJlSK-C}iplmMpon95(9sA*tFcm|6=F*rHk=jA zJTTts#Yfd)g9hxAI2NR=b${@yYo!|#){W$;_ns74($x5Q#dLkI_b1$x##F_dMtqc; z{>W!;s#?FN2bZ~@KHK-eeQACffn9Ghas%ob5;RXmUNYN$Cw^j`x#WZiRt7`2oK|=q zdTD>+#Em{%4X%%TUw3WW(~RVKEBBTiGOM5WMtYOOy|T+3*{j@#zEP=;w$4;Jb27dD zq;Or5zJ_Ix+{+;uw&S=qUiLX~V0Yu1rD+!;Yzu7$v)}*1cw-sZ;y8l$?ZQ6V+FyqV zk6bG`si~qWoo|uC9?g7P-IdQX9kX|7ZcNbUWzY+>||9Q&qXI{qNfg=K0RxEt8(ndR`VshHe40@ zb~lpexy?YS0C`!PEYqEDvNi_~5Q(1XlQC>+O2C(}w{pNKR|ix!{Arvw@z7i zX{PRlO>U<)OK_~7zel!W$M~%>kxT9wHl8;d>nuG_vg zT;!B&Z6o*m2gmcp=I*`1Im3GD+F1vVZct!v95ZZ1twe#@is=k5J^7b`vw}Xi_!*R+ zK6{}i(mybE^0y0djt?E5)R}W=Cq0aLv2Cet%R2hODa@oAUOV^=Uft{P<| zbJ|GqXQ zZ&Tw|zYCjxX2JcZZxWqO$2_ndZP=n6n;c<#=){#*=EW{y-WpZ{RgHE9O(n%+X8OyG z;VsD%Og?j5!rM}77Jr40sp4o`jeav8T2!g)JD-WI<1ZT$vTSJBhbco|95fRg`(oi; z*C}glqpIg*CI(OXw({W^1^Y3f3#zLXmtU&&o_u|o9j`3MlUb2$_2p;nGMw2C&DxyN z@Nsicg!Sns2No4QTkwEi^`-yq;R<0#TMh3AC9-OSx{FEV>8CF#zb}~>f39}HV4oW+ z!lqhE`Q)y+zAZ%f`rGxj>8!OI--IS4rhiKosmREv4S!Qm#4S2^EZ;M8qajW@gJW4-s zG~5`h{$jt8A_yFM6N5HBD;y zX=7;t3(?kaUQ^)=e=qizp}G(KRj&8tyl2Px2bPHq#b2J93 zpIz>eXY}^Wn2}AX1^GrY)ywuS%y85=$eiwCx?s($AlGo_fa4EMHdw3;q z*0Az-NB6y*G){~|Jx^WCBws^i@Wh*zcbuDcEZ+2KR8+}^f>%CsHEXu{@lW2D`MLS+ zZohrkQ`H4Ox@PCtq^~}$efeDNG~Ig#gwM>^-dLIY_3ps{S>5lYs^R9Fm2O74yFZGR zv=LApGEVvZIo*qT4}@Q5InCr1AD*5VVUfYOqPR1cJL}1dp*A~I`m}spS3YX$TCzdDv@eoig7K|yN0;~of)JN~|W>wSTFhqg!Aj9?1a$3IyxeXgurg>vK3 zRZhXD&krqjPK++kc3s_6WfN_^jfJBm|M}VcO7n~1-xMX*-fb zKhB-TQ`Q9CH#Q3FpUck~zHg1Q$8evP84W3l=bDw+oAOuh@%LUcamchb8`>s?#o< zvG_VmNp-gGFoO-}6IHGZZW??cr|y`wjrm%eVa39%-~AjW+%%JWs>gZqOH}UeJ9#!k zO^yr@WG$=Btc_pJc9=V>_)}o*)c2t`l%JN5dd%BW5r0n7T`WpDdXDQ5!6j!4ZpuVt z?_=8;$i{u$+IDT^hU{}{CuB8*tG^CsI(Ybd$xUep53U`s^YG<0i;DMGY^{~@kqiuW zUh;In@Rh++{bd*Koa5-cRPdC=n>9Sj>F2~fwH}xhWRUt>2fG-%;ACud-&+;N!avY7f-IdW$1w|b|>{z62mgL z?z6eNN?@gA;q@brJVuPM9Tm7}g^8kVtcDHWJ)vhZr^|zm$zQoQCsVa*hNI-pqufU} zsts!KNWaN&);YO0>nFCXOgU(~c8iNwwa2hwA8L&6n9t`_nq+dw zBumzTMb~$)o_N|_uJ>FYLiSnp(<|qHxYt-yJwqyVtF`7DXj(toPWFNeEUvtqCk)+6@vi=F9pW5}^s^!s# z{h;(!me!AP^N$}JF4uH@aA3=x$4Q@tPZrc$mvd@~T?OxWugQtx3(s7)ZaBWeCR%Oi zq{_5xiB$IHz@?RZsS;b$Bd-P>V&pBjH!+-Nn&=0sJ()X_tQcia!y-+O?2fx6z14kC z>?#Apff7Slz2kPi6Ir|NsAjprXUTr&>P~LB`SR)Y*Rt!EzcL)863aRzBX#)JT@TKU zyxCtzu`t1ze?!V$z2yDEHWt&R_d%?Kev0tKV^5{}tQ6N7zk)IWoF*pSrQ#@e03e z%|J%*ZMHkZZ>#WKsNB_OVY<6c^-9Hdn%9pUuZP>#9Cn@23myB$c^Yg|`N$F32dCmz?dR#rf)t>VZjx8?S#F z6|Lm=-Fr{IzP)8-T@%A(%q<0(=}P@{{mopj4-KoctehPB<#VxR*z(KnqVf_v25GD8 z7u{JYq#r1h;M-Ja^i-&Mcf@cTp=taEk*4}F)sNN*$cUy(-QE4HcI+KqLCb~3ySNg# zlAV$cPyA%1BtPF(Zrzv&%f$L5#gRw3#qO=l-V?LaW@U^r`%}&j0qN)T>@{XIZs^A@ zbLw!|i;uiRr^_f5-x_)?EB8Y11Sh6xDf5}vr1IPabA#1)<%-u89ICeXFm%Lybpr90*Z5HO$nrpWM4sg>Kxfdrb_#EX=-^aX~@$-s)*Aw#CI)*7M~025#zG z{b5wZija-bXKKXqy~E4W^Owype|E;hZ*OkAN=?Bgd2X@lrqyzrg>LX2NgGfapqlD1 zAoQuk2G)Ryi{vIBR1L?~O;NQI z7dy(W5s@z&mSg29`S3cJbndre*cMCIE9}`)!Lw#&mNUd_>dh`KT$Wj0d+=3Kl3u>~+uOchynb zoVhqi-1w=o=5hJsqx@Au%|45sP!l>TETUF8J9ECKdW+=5aF6-<>pkN6CI&A*!WcOx z>J}sVv#Qzl!FC!V{mRD0%9lq!Tg%!!_L$>#Zgk?gs7ZmV z6wc^QG<|oYE*W8kO=wwUGckQoQ zJ1!bHTCBOM)jY#z)Kb>XR_-(A+$*UFY)I!?GJI%|mtN3p^L)W3;YqS5Y!qkibG$aF zN`1_6xti@F6*{IK71PBnZ`WiV+*omHe8x3LCmGYb^1|n@jc`sFP&Af*`M^_FalxC_ zA3n6dwl?!s>It23yGw<>PYL1I%5>U)b*tIE%cUpoEj#zH^%c7$|>7_zeu#o0Ms%!rvAw8KKUL`kP;w2aJvz`(#) z_m2;6`L@56|NO#RD*FraZcnf-ULwIU)?mrZBo(pZJh@#p#wPAA?#F@_N-fPeGsv*N z_={4*JqiPrYjX8c#hshNMDOf*<9MoM@QpL7&jwYS3{`m_8k(q=sOBa*GPL;02f>iO zvs;p9GtQq*HWgszt$CPI&f|P(rTNI`t7i*X=S&{`Y2sC#(^4akthnBX^GN^ZN_Ov2 zJEf)`U@xfTu}Yf69ug8a$!9WyqhAv57{vph`W-ss9%8C>a6!NQp7pwX^$lC?n^m6J zKg)cuY5r)@DCdI5h2aI?iq-%BKL&1J)nF+oLR~C-CTsm{?QD=_}O4;E;D;7RG zoTi;KA!L4$hO+zZw>tMZUe6Fqutjq7)wXRlM?S-=_VxqFSz ziJJuo}ak**SMebD=&&3XTo@{R-zD_+Rr(DzuBRH`N8FfGbDM7 z-@I{6oicjk?Qv_SyTlwAn|zHUOr>y4-p>3P_S@ME3O{g$$nL)E{xs`FUi8Pot+j(k zZ)_@5EjqB|-Vv>UMzu3`X$w^fTfa?JeEvYP-?oH4yk1+D`}McmI=xoM*qCu#lK-ss z5MY?apbe&{`?HXymu+y6<$=L^93m&+RRVJSi@vS{~0Fs#=0TYZCLr+@9l(VML#BwY@0B<^WQKTvRQ@bhyrZW<$n&v9&8 zc7pG+gszRPS{fY|Uwr()LyNDL%8@Y^0-C#G z-%Wl!f7n=aXx&Cj<=;IV+z9NS|$9s|c64Y=d7Y`){rXChyvuFs!Zt#j$s?d^yC=Ld`G zKd@nIJ`mSu)-ApO_JhwZ`-tt#`L^IuL<>iHQk?km!C!3xPE501B)!(7wKR7a=Z-s3 zBKpGmjdwTSN%vbNH|Nrzt4&pkAD_6KO{_llh$E}MsF@|`Ym>f&{=>>b-}{~}+iWfs zoI2M!)Nq68lWf)W6c4c`%f*+T53n=2`@(eP4F`vJ&zw%Fdr!35pUxbXN4Ycii_J(WU=(%2@Y_?>!%n?PS_b6dU4>ovQ=tpf|a%n z5$pTd$lIWJY_@93`n6-4!v_sGxccVe2^OMUvl5c}933{3zr-PRu%v%bk-dI{Nz{P^ z!G$U>_IapSj^qn|rvs2y~(%2O;*O=YfFXtC4g;qEj|_H$u7tXx)? zY>$?k%)cns^cHP+=URW{bVCh-Ue!kUFVWXT?XZYy%OR?jsJ0BCi zd)CrfhZcD2M-SLxdCdCgRKtdg>LbF2J3SJtW`66}aG@%2>{vIqy)$>*tvKSaF86po z=Zu2~3+&SuNesI5Y3j-eS@qXGZSWDEA5xQH@`&O z#>=J2|EclE%l5-=H2Ydy*pu^8utZFqJ9pB|F((gLwI~I+Sg)8kDWG|(q3EhtH+bh? zPxg3T$o%&0n@>&3%X3Rh#?<@2eQHw{Zd}$g-mNoI2{YaAx?X7(XBG)OYWqZp)@tmSmoN{wjNTkf6bG)xgvZ#jlPS?4LE)VBeU@MpJ5X zuJ4GSZJBsK*?bt=4W69)$|hSxlgn1DTR0%AFjn=J(7J%{U--wx>8v{AtFTH&M~8WR zV5Fe_`bWo{bjK_>P&g%_VNzOn=J`FMj-m^5mBMw4N7l#O-78YBe8u63fLiu`&714T zr45cYWi`K^I{0hC*;^_cjUVy_3%Oed)l29k`8tiA!ppvO!qlzn&(!;f#5}Ov!PNTf zoHOSBh?TM5C0ANMs8@(8i*(ZP+qPDXcgCdEclU1nULIFk#>jkdeo!TMY^n90y3`b( zwE}k|{k9ai`0&hL_0?1VdCZ;H1hw&bJd3pd`(f1-8I>ge%vTRbe644ui@EXA|`0S{Zs zieYT(asxuXsW^`v>;Az(E|{&tA}{o6q-Zji>X8?_`;-R^?3b=do27Pp z%x4`Mdwqm(nq*3p-(eerV_RBYG+tO*l7GFg=SBxd$B)%<%PQYrE;BJS?9-21D4chm z59_-AgEb7TEG6Y61mlMD4k-}6y?WoXLC?mm`*4suEHm`{S&LC&ZnO8Rj*BsuSHF=g z_w4$4_OrJm+@gFpG&OBK;~gL46ycy}S-Cu9?_3KFy(vdhEOxy-sJu!+YxKqi<;JPT z4-%pu?+7n@>9oPiEM+9eevX|yN@;Q~SK#hmB5>Au+}{dNyhJft)5xz03>@UcTBZMWTa^XE-n`P}0oBht@4C&kcc=$Ya2+A%>iIZur_=a}s1 zqj5KR`+htw=k9v-V)W3Ehhb{j2`5~F;`j`9rymFz9V>ZdY$5aOY?-Bo2mFQdr(^?# zJ|MPl&z9xI9AQ&3&GbtwXUbfiY*M`c^=QwQ5o&%uK70dfpNq6Uat*3oCsO`Wzct0T zG}*(^acGj4d)&aIab9)v)Lb?kiQ%*qdGNuf&g8_g$^4Z($1UdW{UXjxsP$A`5~?=E z$;_l&M)5gsk%X80#6|X_mWZj>3>*3Mw0+)}h%JduF{-*}nYy=ipU*L?b;^-si{P>H zT~a%$pXVjrITEuK>>W$xp1r$!{XwjrUY5VfQq#hXOEx>_WheTynhB-xE>u!~o`3Vx zL$;Nx4>+hgKP?h#P?|H6Kig*rw}xT9li zO5+tQKOafXGdN`Rq%~&bEF-%|>QPn7g&D&)*cLX9K5JE@+3eV_KtwtBZWRAA+X6ku zn=OlCCtM9Rb=J<&SFF^oo>^x2f2e!s=*ohv(YIsUwr!gocWm26chIqIt7CL*vt!$~ z+2P&k{?2#LIo~~R+%eui?`4m@)~Z@_&Z?So*4ja(e#di+j}kKaqhjuyH54O?hlYi& z-PaN0GUN66;lql^`v$km$ke|5P?=Q`lhtwYHJG|zXg#0^A}gkxklYMm9Hna9D{Stp z9FTytAOd0*=-y)bV~|y3$fR1c0~~nY$9>l($2&nZJ>ReWi=2q`Fv$bDiG69bdz zv|5a^)E!^zJYMAAZ{^A56sl;|`p~^~*svA~rt(9^+=>QH4Q1**RT6oB$~w(P&E%n%wg=(OsBkM*3&6V=oBZC~`3dIx=IU)DF5CcKY zII;3zr0ePov>%QzwlilrnfcACQbP?&7O0Uj&P-Z-WWamYw6O~4YD2-ML4L9)BYCOz zQaLW%eHlX7AP*7u z{MueNDO0+El#*(snQR1w)!0u=tDH8!BLh|73i^SO3mS7(L|U7lj#fmX zZs)5^Z;i+{&^eKJL{veO*-}Ue5nMebP&jb{6fY$(W3)8>Y+#AQJx>8q;)m6;;Q5n# zLq+UrK)oXK)xRcI)Al}-;~3Wb$|^wxZBc^8eogg+3BinXddPp|YY_*3jK9?sLOlOD ztjQ#9QR3&r70?2;V86L5)xy$Cr|DeBVoK%(8ZFbJ9ij6=EKV55;`NIk@T7ifUFcDF z>c?)G!~X7q1eB3o_ekikI8Q-mTJp4*a&WU}&KazW=P0^QJYL8gudnk?UaC zf#y*((`-7%dF^^>%v75FeCu>a)Y@!bD=;8@r#LsBpY(}D$XxEWI1#C1FZOoJj{J%T zls|Pwp*lT52uVw2%`y#mfOYuO;kspCl<=Zc21nwkX-{c*6lu^I z9$?)gO0+zaX)ot>mSz&^Idaa$7erWEiW!qGF*v-ok#GkbE94}D=~AXeFV;yyu^RNi z*_;~u!nz*NAV(uBB4sAeoBc7_nAHj`4j%L>__or)8gTj+QgP)y^V2<9)}8!R)*Z2Z zF_q>ULtzhUU>L~EE`5f%92WAcu?^ItynR*e!44E{9=ZJt#&L$B@DWY6vw86ZPn#`Am5IL9O_3LRNMK|1n?xF+d@+M| zy*wSif-J5liwkJ@Ayi={RJiBDK#p5xl@qWC2mA@CJW5A+RwB*E0rwmEVd*2D;gI-p zk!VbD^^s$F^!>ovbULqU1D_*-El=^d8c~R}A75s*O&fSkBei#%QJ58dGM)r6&kk_( zvl1q`;kJ>7gK~h-Jlc=tAdlsb6+pKI@-vblTaTS6nMCj!i>s z_=_5aOg$@V4c9$aIXXl6x8E_ba0=X(GZosBOhggGHI^UL-J@9H_8C1_`N-HZ{mK|u2*flLP=ViuTWpLo6)ZP-4x)BJ=%Qpil z&CIY}(NYj{AJTm4tA$HwdJ--J^}|6xI+XaRDFA`$TN&X4{_E>5Pj?142OJDMV^E%$ z!t?Pq=>Qm3Iffy-uF0}h+&=M3AAYa9WAQHNoa`i)$q8t!Di@_|9vR8b@^{tlrtN+R zQ_# zJ(CNgR(*^s8@-=ojaVUz_NRKrFMXC4I`*O(%*$)jRZ4D~9`%xl!GZ{u6dHy4IBlF} zUk*-TmOWR>23$?^@iCr`WCtKHM)zvfU+GJ32zg>1P$Jdur>5GpEnOGa)H9iN9-F** zt#0m~*K3&`jkuep{>WBdeWeXvwOxx~&3#LCu)|omW{!@p2JnjdwUgJqr~v^8Oac{L z9bsmkapG>Qsl&9MxOo${TMxFE$zVmpUd~`bzo~d0&+xyLR|IqD>rZ|nfwYtJ!6`%d zSpk*QkH;ppfTo_`_9i9fR;ft4X&!?MZ#EYqx^Wqp(&0huYGSk1zeyV!rzM^RmYRg2 zValqKG!9f+Cy1Ua7QXNP_WMAVBJCQ~ay(g()n>VG7OVYISgGyp=_CTlxe?mTQDYKqOe6tw zRnzO%1b32TqtdgI?GqybQh{#W0|^XA$q*>0oYL$n7ngL*a9=o?4d_|UF~SjujtvP_ z`@90dh@5NH6^cQ11etdzRl}*dirV_N{R5(oip)$0agtEJVIT#~-O*HR8@K1hyQ{lo z(SDuj6D^<>TaclI3QNs00QTY$)5^R2KA7_v@7RR@i)$AwT?)oj6uPe@8eQYV6nu(o zpVU?AFt2CNAo1RlEy^=mwW?I0-&1X}j-URZuZ7fO&?wts>$gwK5Uygi6B`4CJLzL} z0%fon%+@sUV9 z>j_|6><3YnzxyS><^vy$X9{(`wNK_taIk*cL3s}4T zZmVtQ<;W~YS}FgOj#9*T<@Z301#(|fSPzm_+s()b7yL5F%; zQW|M4#g;2(@>zcWVyC#<0hdBDvM+47U^apO)af1$Cm``OP-h}*>sz9kHE~IXc_M40 zry<3ThMY}t`p^Buj2a`}EDP`uYFD>WRs5bsQFavm5wpNl5&JRW@MK zB)6ha9D~VCkee34afufn_9%f6a!f{yoBLXg5GLOXBJv{UR(5qk3^=TVrd>r=2?^w_r^i)z1wIs`?@54L8U z@6ChW)9D$IH=jl|7fqK%4@Fqkw@>Wo64Zw9;ni}bxZ%mE;Iay<3UY|)wuV`vM!-yc zAt^{@k@lT^ps$@EIlh;Y`;8weHZ`hIr8^v)SnFgc5V-MWfS>kKsqAq0heeZmRu`Yn z&YLoe%1IQq^Yo|7)2Onht|sD7I`_A|6f(tZ=}+kQ87pHu`gU&3hGcHAsezmk)3IQx z*E74Qmh2mWxc1FpI3t)S)Xv^BQ**c#{BcS|>hC?N{14JKV+`mU{?|TfK!|8>}>WwGFzfhCa1IRnS;~DqgGT*4%e@lkSU>!#vZtyF(D9+&AoA#C) zSR4|M$Ac7TPW5U#sb;VN5msW~5rp=aOjGDiOB9F3^BJA$ppF`8YhN(tOb)1y&3=1c zR%d3W`LZDD=^L4G+!opXYpH(_PNodUMwX_YG+2u&s?k&nn-L3&a|Ia+JMHV#%9loi$dfN})Sf`LAbe}0Ar2B>wzFvBHxeC!r z^XH|yMDNW;K<050y)HSkqEOh1r{(CuJ~oBWj=>ADU2VuT!-O?;Aw;(hFGfm#zi_3;HfQNIg>(SKf8yDMe>*MA2zvt;$NKxdS|;w zW1-Y|kgUyeHnAazJ#R6B8l7aMxUr=jb$d{g?+SKxPli#|E_6+4Hp3>j*ZCfz_01i| z4)cgjs8A_hAwwZ8~t7a*5 z_dTwnnM)Ce@mfgU?j*vB^E<=-`PS6UM%>fdLX`AG83&ZfhTsKmFqMw_g0QORxh~L| zA#77S=DFZFCxp^faU{DBMGR*5%JYF7(ulNd30N`vq_f98#f5Lfpkp=An!3BJ)11U! zBq(aS8KBjIdqh`W8UunDjQ(r-N3`LlQ#r$*m2;^pXl^BTk!E5s`PVu~?^UXvRDQTy zT0qlDL#CS}Q=}?Jp>S=%D$bFTI!{DhH+q4Dy`K|3$q@Q4m81~#5Pd37y*79=fvSkm zo=p6bFWWqL-1J$!za|*18fBF5QzvFp9ZN|`3q1=gk^g5gm%3^~#m~I&%KH+KmhLPI zfH9a(JG#Z%$zeUJ5BK;%-p_vqqDmzXKB29hgh9c`>+Jw?w-e!cdCu7&&a@JiM1-yC ze)sw5my;v&Ggy$_yiXj5d6D>s8T zHvL$m=C#M(+aqjsMJh=R+{%6>4`_*NVu#IZ?(zv|P~rsH$E{3A^eUL>*KTTRZE!SK-A?f+c-~sH|*f8pQ3P zZ&>H|M4I{Bqv*x&@1A@SZWZ@WlEDVqZ`7S;=h&8%>$L4 z%kA6XGSOi214pH))s(6eZB_bN(|s2ChW@=gNj}lhydEsdW4Ed-gF4EC)bJ*!2ikYV zd0RM!x|*@F3@nG1N;?J+lHv*#cwcafl6>hMVtMOA+`CeqX3Pc;u@g^F7 z;cjk{SRhhKd|c~>O+mAkd=%OBJ%w@GecV|nw>5Q-Mx&qmUonLgHvINIR=0W>Kc}Fx zgW=uZ4)V}w?dW}dPczGf*3bgV`Skt`Ex;36u;Yk_C!DFQNgp)XK5Q87AXl+9jhM&e zcd^FxlDm-Z{r%O#vfE~w=VLd6Zr@B~Q^uN-=KQ$@tHpG}n)$nV*86qxdl<*Md-$Dr z#Z&_|6jNN5#F#AT8l^P??qZ<(u9aKrMqWvvtvQUdVy4p`YBPRS2ipS=`KtJ9& z3Vj^jT^lNPj6-E%l7foK6;CPP8KMZX$CSv&0&<~W;c^fCQN@ig8NXUE;cS-isjR6} zU0It`G==lHeSTLt4ke)0lAiqVyFJwki zxj8wubUkL${wc%c6vFz2J`07NSgz85-3v^3QIKTXslD<+ULcG$dt&ba`e>B8k+4&X zY*j2n@e2sgaSE(;X$#){%AP3^rzuuL|5tq-R*=iX&~l}`7^a=}1QB@PxTUcqQR)1B zubHliCXs4sQV=6{1UiG-nVKKDbqXZb?JCF+xdjfx19N!JL-5zya;ct?+wl@6xbY&3 zvrVE=5@jdEV8rUG>k^i_tOI9Q;eaO#C8W*O3K7GV3z}z`z+z)p__GfQWc_i2c;}k{ zU$I;A^5@7)g98wz+2p+jq#Fxk`D6(YA{be{vUDM-j2IA4edU zTIk_f!ku#Yt`|S??XrSCW%=p2gsIZh0zAqe;)str3u2`w(6hX*F{Ws9B{F&6J8HXB zTs$Rzl}i_ciPgn~s6r}krLKxq_~`2lXy(@SSO_pkQ=gb+N_2l}>2URh%S54bU>e-V z2`?Vn)YcE^_}$#b*=HXj^q8sw3PPTet9zVtvuDh2QuZ3EP!W>v5=PLQWg~|ik!|@k zTWxT3mpH~rU9u^_cE?-pf-qZIck@cKSnWK*duR zc7qMJ!tK828_mjAf*oKZR!QnJ0)Ar1V+;jZF4 zpQ+v+hesZFXV4F4D`*B}^hv@o7SwO$T(&vmW@chsj!EV8 zb{G2~GInA|xFkgNjiF%eH&-!~!p=j~*VMaL#Ri#Ev=g&#`qo@PSHC=$*42dj^L{?> zA!>M5I|s!|8~q}BxTvGh2P?NbKG%`Mn|p&Io+FzhXQg1m=-K?k8D)gcWg94ajcCSE zB@4O2$aSbmC2hAtL-ByCd{bG7Hkc5%Yibn{cMI|t%kL@9EF7^#&Qz68W)Wmcak7YI zw6Qs6dj!xUXQw}q*-(z;le%o`X2_gCg_sWD9Mzp|DT7XN15|z6ue!tFAN7|hP|sSy zF{i>R25k1;%LxzV3s=Mg zP%I?ETKdi!ctWK_TRedcv~8BXpCZL)+qYqHy?XPwG~pez@p|r7Cr4nU(Akl~>H9le z%xUYa6VqzpXKopWc>om?KhPj^^!Di0Op{BZj9a+-3m<*1ir}x5dC|Al)}R0jo|u>r zJLfad$&%NuFU8a+jzco)ZrV&XcdLw`ji$K>N{fJYjspKJ#J${_u!GpltMYtoi#%Hu^?{ppanQ( z7+|}4V+=f@2*W&Z?4g!2R|i(f-Rry()j>-ANDb4^a?`~h)N}BSW;;>OZ8CLdggy|3>nnG*yj`!RHz4r#v$F`yLO*GH{uUN02J<-; zJklc5T=vj)F8^8Of{NM8|LI53899{G_NQb1|auB-wp|bo%t5qI{lY6{*~J$ zaPueJHGxWuH&h8VcK3TKR?nnoOVQkI&XFf)EF8wzUwa*JsYbc_ue}rR7`om^XftI~ z`4S8=?}q566B;4?;mL+<6hRQ+=e@r6l@>`Up%F3zvSyVEsoF;G;ALI5wUms(O7%A? z9Ar^Wf&tiK=KiP^K01YW=c7NkpoGpO(H^pzuvIXBiL7q`d(YA18n-r_DL`ly(0o%7 z3Mb`M(xvA!UjrIc8$0XI??sGmw&_(giSeJp06Tf>Pb7!k#Sl~dr;jw zWoXJb`mH<&!IFvHL4cjCLo+Jmj-7QvoNJOp)x+N+B=*}DWa?+rFZn586wZNbkhh^B zGu<{;))n>5u4k;Kb}qFe_+N0Qe^OW!nn4kXxJaV0@BHr7Ja&;H$CN=wQ7vgaXAq|_z>Jm0^*FvLNJY)09Z|R-o zYouSk4TyJ#L9f|p13%rYl3b{i*PD1e`9#|2OSI36$jf&28&K!_tKHJuGAv(x`OTL==_c<;!e5!e?g!4197tp=Ku)gh2$tsP1_7em-On+UE~5-oVL(Q;x6HRz_cI(ncef9*vEd#*|u;Xjj7 zk!eT>l*^VwpuTPV!^+mbqpT2V4b-$Kd`VbSSte+|Apnkg+8*ttvMz(pCI;cOl7d_> zaXFf1>hM)6$w3*DV98bTNF1`8%4n=QhVl+PnNb0K-PUSf$GtbIN|`U=8jl*W%`MtW zL$}p0o+6rrj14FjLWD}RwTi|Zhuuau*o5YV$&4SP6_W=xle@7$T^sB$`TZIpB0g=g zdyrHE4@xB742Ol@QWWN@t{NGRQWP1~Cfnu()u_}A_NW?EQ0t2bFp4;1#w**`BsT2{ z4t?vsSN8IW6iMJ+Pw{M&AQ$FaKUtVOIKOUfE#%{T)+s=b~FA!S>yS}48u{WJ&b(58AB?;aOBUwU6U_xGCb!Vw9+{s0@<<&98i030q3Ow5XyCDmH9VW8>{=szFxa zYZ;}kn)#DCWI2(g|MZ;E{=vn>=&nT^L-Tb11ZJT*ZM|R6x*#_^v}v@I{}T}mGW5xN zi?Ksc8f{(F7fqQp`_c33NwItDJ(20o4)hr;1xHv|!7(W@VNFe-pkQ``g>=@S(CPuHwMF{7 zhd_tZ6>R)3hq7(+r*7s?z;u!*(9mE)KL%yf`1=<}p@(iFakc?#Pa@4fV^6VJO()DB zf(Bndz)-!Sxt9AW&~(fZp@$#XTRPaJkE8#rYZc!Io#+Jz~^;W0Q^n}6gmrW<4#vqF=Rm=}m;~bLD!G-PYD+}RS&cz_!xG1+4mt=yAq*b)4APrww|^5pCiG_seTQ^=vLHXL~2W{ z6)Ao3X9^U|xb^h`LK9@T$dHMy;e8=BgvUg#X2xm6u)^7;V{Rkt5#SuhgUfm=`bM=A z;;ch$%fZ*6!*AZN^1ws`Y)U)kYuc$X7vK1UeD0qj0}FQ@h&Uh;85vy%)bK#;U5w!8^9B;W5F=#bfR`X3-Eq8Ps+@9xT~g5|jCLNR z%_+L_;i|(J<|wOKtt_xcg5=9jNmzt6L%MPU(>hnhlIQ!`O84Uo^?7-(&t`hamW?*d zT8D-H^0TY!0cEJe7;yspGbdL$cDw~4C$lw_5h7D37K>v37TlBFB-BhvKOU4vH3_s; z;Hb-rcETVUu2IsR&N_$Fh4T(561VO56J~0UgYlP=6F$hu=Z3qwJ1>(K6&MxmJYezV z9pYs}3J_h4h~l9J9)^~4zj2vks_Y(>E}=mW)L*BoD@|W_h<$_OY2&#fNREairK5zD ztsz|rAo~jOPBuG-5n$T(jfRtF7@cp;Z}Ay1ecTJM-tHDU`=fo{qU%@%ME%J{Zy*I{ zN$d%`-5a2Qf(`&bmw4auuD>7hjTh&MO=ix9Ql_{?l%j#Um^$fu?;(xyK9YT%qO+_o zLGT8w`w~4cpC$RWtIsPWlorhA!O(xqPy;QB7#!VjW&wgDKW5aO_5#1x=<(` zjki9d;um}FLP3jAHX1cc@KQ)h1!}!Im^ zrjd>km|!%^qxbPZ#o%sBcM-q8Z6h&-vXYt1(7nxE;0QVDPo=q>9ozfJlD9=&0hYk# zM`PAf*`g5UZZw)KvNPAp^4o?t6b`%ZFXB%%@rO09DK9;}TgbEUEQqI+iY&LKu|eN3Jf;tn$ZT<32(VZQwV^#`rcZO3J8iiE_Er%t z-uEEORz@WfLiVE*ax}u^=(KL#JnVtIVR2TFd8cNuz zM~*9b@f~#C9P+Q87ctWzgE*}CW5#x&sf1c4QpHP^?0X|i$>TJ|R=GC| z{4ytOjinFM*5#=1_$i~hx86b`mrKVTj|;hW_Ea@6g=x9kXI;viru0Q@%WU*a z2~1ey5FH>I#ctujo)J5|s`$%6>mw4|YZ`P@)~-%%TT{3fv^Ks7^YuN?>6%;eS^~Wi zJev7p3Osd7Gf-y_ZenIhpB@(1u-g6TToBF!vV<}x>5B7n>07x|9=@F(85TdU(;qfB z(tNeA0RHlmZ;gqti6iI~tE(DcgfR=4^={MM6RkJV!?067n<0>54rFA}q=B2|dpmLf zxV&xOdM!^AunA%r=L2!sA!8I^d%cqFcupn zH%k?Rp9v-2)gx_|Q6=D4H8NeRa?Nh4l&29sCl@sEOb*}ud~TqmOU-MnrWd=LDo0fP zZ9Ow{_cT+*ze4Axmgm~d<*BKHaQhu-ep1tE<<-v{U+x)^PjjzW6qs#@pN_$APZptiAvS08xaEcR^ zrJUn)edMQi>k()vA0~G!s=zIOUd`QQ2_^*HpQ&$qS`pBt->?y>Qd|V0CML~}u+ufi z>Dl2#-}1y9qOpqRb8jAr(8k}(gHMpZ)b?f-LuN@}346i9BJp*`%M|ypRx(Olzx%vCvFqCrnZE6;tO55J7Q~iK71eX3l ziEHF0Z^1AugS;lmvW-_)l^;y{a%sX5u9i80?s~*)NwWlJYWqDaM zt`C@yyP)SA(Q_i%j8ttlbyJta0j+Us=JzoQ5DmxHh?(^EE0srWnPoPxeD>(>$@*SK z^Ev%nqk2o6_e%4v4J3l+8eL-tnzq_aCD!z3Gw6|EcZ>aRk2`7?>1QLJZ^LZ}S5IyG z<_#g}W>ZD(y(bgyYwtF!T36iby07r-dhbB3iD^4KXW85FT}kF0wQ!neX8}pycz9;f zva88vCOh!WYbT&TM{mAoeLX)9<#*nDIzI~c{`PFp^#+9bt7F5!d9M&Ox;r8VDy0{V z4I{{_zvDX>u6cn2y>(3VUElo9$s%(zR_nwRw9e9qYrj3|?f~JP0W$nS(KdAWqHPt3 zoR0Yer|~9`tS69_Mct|r6P;o;Rcwb;(iAW@E~|JVNh!M)-9BB)GB6x4?&=`63rT{k zG=oOd5)s-DF5{$TLw1?o2r)5Z{@9YKFXh6HYc(zYP$!n(xS|VbMjh-6u|uq zDhI2mlES<-q1#g#Bz~C#6G|#LWMTj(63S)w6Ac6z+UPKPLSmg1c`X};s)^0!xM3e# zj2td=7OLE|XR56a3`V*kgnMo_J|2h3)i$++0BrQSA97#+NbC+&2s&m8?FAlWm*FQw zGnh{?!qxHwD#X|&!bz>1Y+xiJL+twm9X+<;tE~-IhtxWpzVwQt)=2txJI+ z3J>XS9~Zx0&g*`X7!0l-g9wGm>75jWk{0saFOrr;y@of~NOj+UN+`sJLXGfp)Dl!r zJDf2}HKL_9-gk@t2YSHPY@g6;g4xa7}&QpQLs)l_xDj$cJ7^u!LPC*@pID=}k#DpEMujR$6xaJ-^nXvS=x9XTwWZ;tsZ}J{oF>V)$6`6Yc~!!iiXkcEyK5~D%_)M z!@J~P*Sn(dYqaIXY+6?+}hqgl{R0vcW!Im z?_QW#t{}-!2X_|fYT$e({G?EJCu|3;xRL2K8STf)SS%2%I;CT@%3{1Bcnftp^zb#u zM}Ywtv7ISlhE^OGGvtdk2p$eU@C+A}9XbTsC?99Mv`+PR2Hzyg{_u+Q4)v^~;7yv9 z>frchk>+i$zD&fvRf@hbF)_t(Vu-g72&W1f)x*4!M7tuZHpQ(B5vOSYA^mG%C zA<<%Cf!08o!)^7r%Jiv9Yy)BTmM3Am*NZ=X^kUl1wBZylfWpaz5E9vg5I4dul-Hku zqNch2B2E_bFL?}~>WzJ}40t5$`YuF+u{usN|^b0KIku6$(qRi(ziss7bE^%Uesltm#@4Zg;cVaBNy9tK}+FWjB?Bi125v4g4&q~9r587dL z_-~AUL+MPLfqmzHV0-!M&GIrx97jzu83K*+}47Fq?-5!IcAJtPm?Ov&!7EvpDSm}hg zKu0d;L~Xl+|J*{LES(riwMVH0l*AOOIe;JH*kV6BUs<3K+9=f?=|a>THsy+4N~6$2 zw%FCv5Y1UFdI_3OA9aBs7!0>|b)F}Gi8BB()yNE0L36(SCL@_GP;-0gWe42?KM=h=ZxHLPuysk;;wI zy4|!BSx{nrbeqo)XO6QM;g>Y}uaXJ{?2`iMnJH!O3J@chV7v4!l4fuk#l%;%4oBY` zr*Zq(hd5E>i1C46lr4JD*K(HDW~+!{p7bh2|@6s+o? zYy!zs1x)o$SnHxcy@2b;{hY&D6Y zrwIA+2V9251L3*?LUL2ES&;SmqWeePD_6R}zjlghW+!~A6s(J*@v+@~vRDZjJ=^Yy z?3Nq~ExMEIu7(J0 zqb6;aqSi#qYufKI1!o)njw?;WcWY!+bY7*S7FLs@;i=_7u{s9~woS6IQzMxOB7qfX zEz|e@_%rKO$RVrN=e6o)nge^L6Ml;e^QTqAF?qwPb7UCisqqxW5IjqreFhe?T5^DS z2&t1xNtEd$x8gRoqm9X;*t8fjVXJzqB;F|T5v|LhWk6y*kDr<-@XJM|us-wyAf zb?+>KI9@h-w4^usc}6yRpUd6?5LA66G1Dto#q%7s%mW)53&AYIC;XN-ciPLPmp70J zF6{jGi7Ku>oAY>L4?py9=a3OJZiPJD<9g2%`AKS%erdX_JOm&*&qTPV@2sM;4Av&4 z8Jjk(;jhlxvnz4w6gT)*r9$o>4*WJjn4Y@qD@_=oQSt}$p^J1p$6qER`WU#N$g%sc9$PBYAi&RE$#jq$Dk~~az~|T0dK|;gmf>)xTy`VDr=QhL zTMl^fjQ+lZwbK!LWH+z}>n6<#aO6Dy!NlnT+RfT8a1=SG`gs;^)Dl@n)vIZv#6iPK zSX?X9xc4(ph%~WLf6#tLuj9y)ltprmmw6Ry#a52%=ijrlI?kAfPENUS?EZ1eg_Mt* z+y{a>xu0}?pm9%-*~=4$+gnS~r{7-m5uQp>x@PPyo0QO0a}I|`-Z)+TUOzhQ^rHM~ zOAta&%VypfWWHDfAAp+Ldi4@e*_(Yepbb5q;dZs0;dVJ(-gr5PWw+VcVGPTfNxvGA zd}#$e(fRugsq_9D+4 z(E7omZ_8WxI;d4TKFqfcm)TcK>+**!^`yiL$Q2LXL9Rq~GDK&SObJ~eB~Fw#A_k*q z4%~VOa#e>7dQkIkBUtT+e2W&0P;^bEJ7np1F_5Z5rG`#SI3 zL4HP9M`?WX((uZ;qYuzt5=M1vhc<#*MSVtjdizNV*}$?ur*H4e?T@(NE?d9cVA`+k zFS0nC^OGRO>zv%a{CjhRT5G+Nl{Ha4tv^p_UR06ky&=Y-(^#OCvr0T6s>qLnC@3}o zEvw;C=!>A$>#${H7@AKF({m}f7_|0aBi1J8+9UE4%P9KMwb+$FryNuQ1^Chx}}}^VH7eVJ18{29)QvV&x;XO zQS_jH7JKGwFt2|Oq$dND=I@Z+*;h4&GHJ3VSf{rDQ_;+86<&aMl`D_ab}|KQH(rFp z@gUN6F^7CHiQ(fvQ>d3N_T!9Z-yhPflm9^E9;nT#e4)ITx(NvbdvfNcQ-I;8ACB6w5 zV0D<1y$!x8Wa8O(JE$RQ8&ttQC4+X)f7N96(|5e|@m>Aum)7D(;YG+)a&P2sF5Ljz zBaW;p!@B?F2OAb>#Z+)PQIa0bZ&4*`^(uO*XBtPbM%R<1uM0pW?>qt{i7qy>fdoF` zfu4!|yvv3zi$^2%P}R$yhM}YUq`|(QKlRvtZV8yGWG}};sqYguj-OEF%9DhWuRozl zK<#r+&vTB4yIyEc>PH(dCDRSqnG@YgnUMS?ZDfz@zlI@F{i@8!ZU#2}1ZppwiC_vk zG5BL_hRO0y6jp;9`}H+t2@dmnlJxRUK3O@Ty3E7aj#pd#p-x-JrOk_jEz66+e3^Tq z!-O;p6!xeOUZ(S3 zf*l`u52#MuXYRL&7`H0|5Ps2TERkv|u7m@kzA5332E$~g9B`5p7u1YT8jNQP{&Ek$ z-KfAEBWX{X->rpiP#RS#r6TQYVHUL;dn!ew9lg>!>r_;W=$k#hD&Z)KCIHfF$Gv_C*8 zj|p?)g;fK{63@1V7p!s8y&hp;R7n`sy5<%6e7kyvjt` z=Ogi8K{Zwl7)zpp*hf9I4VGW8X;OiROZe4|#XA)0&ef`Ss}pRp#Tp$74!NUvxqVT= zdzhAnAX~8mbwH8W@ehs*gF||l5Lmqz)G+IJoM2a3;oBD?MHlA$r+lq!8{rQl_q}y4 zquz_$`8Gw`PT$GB51yI5_wKY_9H)L>bsoH7zjN+1K90RSTwY{%2JdIRGBJFmLw1x) zmtrab2gyOKTwpdfb;sFJX;*a`lkun^LDRzsxzI#hRbjKjS_KN|KxfoK_)%#^S}SI_ zf^P+DIg`eAB->GFh=L{`+94}BDhg@g#ndrm!U#?&4m_*ju)#ymEA*HX>B%+TRkEbL))bo_iGW{VgUF+Y&qly{XUF zdU5+%pk+9qAO`cU~->of{JHl5-}?YYe%R6bBms~U`9HS$59{;*B$@}HcTRxbY6D2Gb^sFM$2})N z|IPkG-Cv!*)YgA^|M@@o=M_-@Z)x!UA4LD4*Z(zRK>nn}|MWT-p#I;iLi`6&C_p_R z{H6effAkgRKZpYUUG~H3|IR}|TtDWCF~BQE05qmOz_TB*`QX300DR;82OKBzN9iv( zjva9Q&)_(K0Z71T|KA`CMgKJZ!65wzjXr>Hrv-TZD_8FGpU!-MCTTwr0+QwO~(w&S0mexPgl0Fv|o9^OCRA6g=SAz1^4^cQH$2ax*UCOZSPKA6ZK5(I?} zK_FTE2nHYk$bgd)pi_VOydQJp1DEQ~pco-y4woC#8RF0`vdagaM!llmC9q{)_n!h5u>( zuL2hp%3MMH1t3H`GME|tNdTC{rC|1 zQ298M0nUFvY(73rJ^{UbbfyO2p8uPPAq?o?2m6`+kMu`~K4`}JfE50p6G7=u!v1~o z{(pHY(Ek5+3X`r>{h4Hcr!55_uyEI4Pk^dF-yVFNNmf5_nw5a7e}G;8S9|9J<=0i! z`(M%yl-AZ%p(@mN=v4tm7L?_n)$eETdw%!adw=(LfAdRd zr=gj3Z|?8hv(MdU?|t^!XPW$UJM(u+3^7VC?fpe*!eSN;! z^xcO$2u6}VZi4Vpd-r>~qtPGH{|lZT7??#;;v<09n557R56mJpNqW7C4&4UNo#ih{ zH(5U5rCK`6s7#>G=y~wT&AJcGEVesBYkDY2H&}^R=z~c*WOqP?ojN?fT$*n( z^hqC>U2AvU1aq$4fe$#A%SzH)4fcNJv??d*Puk;!7d|CSFVZt-CLdAv#39ri9QP zy|m}LgPO5mIMO~J(gcD|sp=xsMtxwf`fU#X-7B+VT2GwKyjmBhQ;+CxrOXUY<;M6} zr6)fGc(vZFkkXje#R=B*{ct%+FSh$3(IcE>ywJxsR8W0q;kf3Z8P2y>FDCL_sHdSB zc;~6S7<_WcDJW~gw?XQOZk2zW^88|xftT3*5*XMT98J>iX{Y)CaPUdqB#L|?>q)twKvn(?`DEFI``*avLs_eB!YKS+!&ajyJ$bJ`q9XR{8D_3k9;^dc2!-&C!q`bYE!R`%{~4ZED|D&Y+DnCs z<5Cnv}(bY7*pF4NyC z%XhlY9h@8o^@kHDNiQ?H<&K+Rs=djGF^^W=>1CN8&>{3$~UcI zQCu#^Lo=wL++0o4C-mFzB`fmZ>rB_vu_E)YEx14*&IkW$N79TxXm@BnF#BrVlk`K< zU_oSfPSXEnclynNS+Ni%1rF{NgOBJhNk6L>ulNhSViX5+r$r3LO|F^n*)fK2FDAO{ zXd7r~1}tI{9oJ`)lzU7fWs)85>3(mWue2onF|d-&uH4Hk;q3;w+@62g%K8<%KV)}L zd7nN1s@?Gg_HGmG9LFXQzCJB+(#XTTJQBNB2*jS1B>i3GGWGlk1L9|I4c3Q5Z?+m8 zu=_#X7k>_BK>9PQ%w8`=G9MJ$1z#7npkl!x5Gyk1f+UB3Lo=wYR_it6@F@IpD=w4U z;CdKV8(wk>tz+Z-b*&pTA#;OFl+o6fsGaOrhJo4F+FdvC%iRk9r^rfvCh70n-I?{c zGV7C}zrJ14A3CMrAxqMGB!3rtUD?puG@GFIuFv|FLv8hxr0$>@ngJOND7nw$5gt0C z_eS+XS)^Yb>s+OIqe0!L(6_ci)}9q@wP0OaTYc3el>2G4tOe`hmbGAAsb#HDFPWrI z+Bdq&>bzkrhR|trL-?hhamGriX&l#P?10o#l5(FTW0MsBQp8Y|nxqS@xE^>|?@>z9 zFPX66Fv}cS`1E?$3F&yNb*?U8%8smh(TOcAe_r6R9rf)twka~pf_cejoTdMw%ATKF z7MB_ixX+QLfti$dZo3!s(o1c1L}QSi+UlJ6j6vBupYiNnGG{)=rXkap-(u_e606dj zWC&B_8JD527|+{kVX4Uw_daFludKWzO{}2BcJDzg)VI%Pm~Yr$-Bf#rw*NiP2H!qk z~(gjbiK66z5Hq@J{z$r7dFJ zybn7dV5;{jT`3ODdu!;*xm8JA`aNCqTJUgM_s%6ep&y^`Rbnc!_bQ!ImHueHSBZJi z-m8Rq_@DE=O4rP(N)ML|*AmAp7r^zKOGkpom*}DMYY!e=f zf!J~m^6?@?0w-y8bwZsi)vsCbAQUV5&m~exS{B3ddWP#v@X%uevk0N4_JxcU@WX~1 zKRYdHsK@O*D}aI}#Y`86XagdGMp_}lGD&CkZpo=^vDHobai&;2t`N6;k*ToQsKTd} zM3f!zctj{IRgBUqJrQ0>{QXKxBg~HlJVYuIVo99-TD@bT;G{ux3bgb9iBWweZp2P~ zqvgd$#WFJnX7LjXzYy?6^b{+}LO7OuLt>4s!(cLw;E2gW-8^gzB1ff6XR&a3DN`y% z3pQLE9gt#4(kuzJB+yX0FRI-o6!r^|kV_A@8y*Wz^`(>u74$GcBB1uD2FF{^{pE3| zFRf1J`4DB~VUu_U!g^PR)E7SGtvqW%XR5+kal;B1q){!?MF22?z{?~ZJdLQ~t&kKF zEW29oc_OfIN;#%2KmU&if=En)jUxH?_@QWtEDO1YW@w&Cx=1Z?$thaQf-7{pS>aAQ zTkF-Z#Mh>YMX91x^^`A=fhCim~V#EJ_(}BwHuw~PdQ0r@`~j4e$ehzMqPs4f7+Vr&*;vgG!J@vyMCEY`B_U|z=i|8aHeQf)-}ni z71K?e`Z|%Dpy%iI3f5le(%s;kZ%ykL>*r6Gu{P_WSakC3n_@8aE*KMFu?qj8ZENq(ps{?W- zabmqF^WymddA?K1*(f|=M7!ELz53C3S&-&18ZU#EN8{^F>eL}h_K?6N9gccqp64Rr z+UCWeDb>wazV`w9<%a79`;u;Yf3DrZFc6}QZK&wD_23?fuXYhuP=yVd@X!T6#KKXP zIyA#~f&o3GFAP5Et?oLds{{;%;3OE9<-bfI0LpQy%!<1+q%4d&B<<7dVAGWK`@;2l z$p^y4USOm-a6re)zFuW_MQ54D{{fxt%3MOnllJw84!{8&FK9JuG+13F&NZ+1rq*~zIVGNqwRNa6rck zdbk;#yo-3GijF7si4MR49WUr(&FJJ^#2-}A@uWV{0XU%J1^r~YG5`l;yr2u4kjXXjORC6tQlH2G z9FXyXE@?t0*T~YG5`l;yr3;j$mEpST}8%|`a}lcfQ%P(V-qrY)BcevGM>~YG5`l;yr4HW zA(J=l=_)dw)F(0k2V}gU{Y}W^X4aimWIU-)WB?AxctLkHA(I(8p_cv7F}036WqfaTOg;>JuG+13F&NcQv82IvQubw2F==^@$F^0Ua;sWhHcy^z#-J6e zeSY7|-e9w>UeHkG`)sTfI!WJTDH$Loo8k4OKELl}`}e(|t1I7UiFf$EFZV8d-;?_M zzL)La_kvcmzaRFi^9@K}%RImSl|%BbS6Uo;lB7SZlrSmJbGJ~^UG{#r-RBxg`UOpx z_Yx9R48?msl$1lT4rycCx-h+PcEJ3J^sW!-tjbR@j1=jthLN(sqA0UJB&iQF%X7Cd z(&{(o9!9$R`7lz+Uw$kaLENk#yi*~V&o%j+k0GQ;c&89j&I6mf&U`+68Jf*My;#4V zv#g`U_SQ?Ys~SFfLrEVh$gRJnQ_rvG^hMBNqjLW>-vlRgbX%>Xs}CJ53sH!utR6lU z0w~pQ`a;e!XgPFrlS!P1jv{?Yx-sg3dF~cES}r|Fw-_{~N_Lr8y;19-c4}?ZgaS1A zIQy8M`_1!pADG>2cir@nRcaYYN`azEI1{2=zOQ^tQg$Yc7C8>;CyN}}Q=RiGIrVdk zRw1#e{`E?`Qz>Cl;==D%<|zD>b(@Ek4^yn2hoIIBf6CpjQg631+UqLW(~?)!(+1mx zK-94M%9l;*XSN^`L%SFC-((t=*Ifx|dK}L8*einL$K$k0mZkdoH`d5a>dz09V!hm? zt&w96liVCK!5_zMtQEeD1%_r|l!|7(Y0l4k1U#W-clcKzsviM--{p^w`DTS9kKK3q zeUA;zKuk8De~oj!P>7uq>9A{ke`o*pmaa*7vQX-d-ZkJ+Oi}0D*Y|hZz6U4 z#DP7kv@Z}G7WbCxEkxjyt+o2adR)0o8D84B%LtvX6>;* zC+VB4CXmTbL=$3R-||V@k{r>xLpGK#j9c*ZVy$0F(ihnHnPnydxI)kf(_PBMv7~p{ zYPzGPQ!o}hy>Q{bDfeKO`-pOKeg;R26c3DG3GN}`s|-h?tw`ECLnvp>J~&__->V zoeTo8Q#@v$SKsTkykcal-oyia<^O}e*njpKw$D{@2uAF2Yw%SgmL=$qi~UL3$z1j2 zKxM0Rn~4hs)W9sFlcaa6^zbE~I}4#UytRD5OT@4;*+Alm`c|wvcXDSh>Clh1jw#t) z@evI6V1V&ygXkqN6Y6#;(5E<}my=q=#F^>`^wOteqL=J0azq#B_xRLN_7YSM8!A4* zl_g_G_}Bb|DSR`B)z#l+CAh~t%1Q|nvQs%AsF)Rp_Rvh0^`dsEQ_|cl)=yHO=F2i* zwfkqO4K?ve$q3#*mBafaY6R~Y0zA{a=>CP|Kv68oE>>7&P%H-!RHWwQ?JQOpXf-q(7R#7{xhIVKkvar(ZJuJj_f!Oh5_Q^e}>X^s}>vy(p;p6ay z4J8_K?^f<4{ckZ6#bR-=!4qUL6HCr`I%v|+E*y4`>(jmi#Zj>ttL}*Ql0ejcBQBnO zSH^AQ2{xhFs*NXZ(*LDQi`$uY$!g!BKQiyqANy78kQ-$}qoeg&SyKWW6d)gExO~)T z;ZH@ODj-w@fgp__kci`C?`+*`RpwiV_3I!cVh8Lo;g^p#CX{(xxH3-TAoollAlgQw z<+N;U+6L#mA2a+*)$*+OYAkw-y^gmA(V9xlEgb`2(-nAwqGFe1k~A*?1)~F6-&rFzTpS*0G4BT?F+lw)(iOl)lU`$;GM)w$)lXXDyb1 z7_;U;c~dWC%XvrHW1<;k->D{hkMu~1{6$2z+bGOc^C1zPCr(Q&ePOVGh+EBQo8$E$ zw1OOWMlN@Xp|xM2MQszs^U-F|XA*DMNW~VlP8B7xCTmMMeE3uY{4T*WSkK_8VIamX z@dN2QXdTjiQIfvKG%=(ux9tEHVFTl0Dn$pNLjQ6JK{HH<^83V*u^cZNey5UlN%NGL z1a2t*qD*cT-KQM+%Q}3T4S!GycUDysWsQj?)A~bwqI2G&rzCxYdbT#@=(EU**2Qy! z4lBtVn4uY*C8(7H(%zUM>r}Z?W@_x2d-`UCj;)K~9swZmUc71w(`@@@* zCsU$3%??2>GPe<^PfE^lZ~%pA)!BK}x^&U#iP!HRyY9pP_t94C%11jpkN!!jP?lb2 z=MjORkaO|pgpU3X|B`gOekLivdV`mYjpc@A6yPUYEe7K}VyCEZ>^jlw>@LMAx_HSr zYITKvvmqRAFT7-U%-nf2G!qYV+oldUa7CsLJq^dyPN<9|#pEj(N06H2Wig4xn@F$l*xwG2NCmh)WEpU5?~PwAWJggkR-mX&Pqf1~PfRPF6vG3l;q zNudiu1K+MJ2cvS)ey*)5C1X?Nw2E7{+i9T%(Pb1`c<6?l$c*(4Nv0@2&z7YB+t~Vb z-P@`m?*n4K)LItf9x%Q`so)SW0qUZqYY!W?~bUm`=A81I5HE zNFU&%y z*`RB^#Hmddto2<=+%8&S8epYXKIxfI{P(sy%StACpWU)?e28?L@pwv%tkN#h$GZ#q zSmRO?uiRsg(rul1<5;Wp>yOqe-4SUm4RSOjQnevr?6K!?-|lJ`Z~>xreLKFjQoT$z zaCG^U)GDWXGdaQO&P-Tvf-t9eFI6+yr(e^0CJ%~txqfl>n#Wr8s&=JktrJ4&GUV@5 z>E@bLUVI};oN}I}|uBbpIm6XMmlq;1YInZ5vQYOIiTUbE%JL{B z6MCAGH}DCy4Vof7t(zmA#s99Kd%wj0-Ce~04fdJ0cD6Z)q3vdK0GtUw4h}4c)e`B| zQox8j)`ag~$&Qx3d*xcaC5>Fn(P4$K$0fU3^4C@PRe$^Uj7oU!gh|q8Ucz555(lw) z_9Z+?Z;bHymI`*TvpWlR>*RlJ5bXO+upjI!*u<)L6KsInT78X#6tP~Zi@8>W9DVNF zvaV7po3SoaF6L>`?d;{^&4C@BIR~Dz-@9n_Z$rVpFA}7)Ra6>R)?YW?YF&4-)jDyq^8oYx)+TXZWpv-9#v>dD-Y@BJe3WlW11xX88)uik@ z3@|Z-8E79B$%@;nF=xELH4ippE61&hUu%n|>dQEekr7Uwe3~Ly*vfFeGQc-H z)m!wvth26TJ?@a0_4uywzTRL3U|r)~NYejqNJQ4GIK1etYa2NHG2`%w&K$-G)s4dd zXB-|8Z{ZVhD67O%I&3Ud_)4J7T0N5%0&VE>r}TTT_{~1@M53$^m%D1cGKZ7&cMSc7 zV%!;H<|9T&#`a125w9S_xpgA>&WPw4*RIs7jgqnb8jRqXXF&3!8rU#y_jb5LegxcN z!SE8n+%EIv&du{D4}5X#mWO9`op|g^uY0g2c<9qs`!724U{pL5q2+XEAK)4LrqtZn zNt{N8rN!p{*jmHJK6VcGPHRd`g}J<0VR^9AmW!2GXAMIU$jFs9u?K9J@9Q$1;%~PU zUj#ym@S{~86*k&>Q6rc3U{c6y_;|0Jt4NKndd(p6S2igYLqU4i2yyFFOjeu;BngLO z&Hy(IK1g5v9DU$`%JEqNU!|SBV$u-i2M37!bLFC$TtQ-RNZ=j!_3s(He;bc6DhoeA zlKN`>EQ3nR>Yb#%r$FJwZAK2?`JnUyVz4Jep{by*xB^o|aQqD8h3ZFMk>EZLV%@>t z%cM-0w;?2EpXAaVNx0zFOIWBmJA>l_tvGn;!iwNQdD=wipkCwi&JkeP&pavJa(4B_#TMw6!9V1|S2;wudnd7T3@?^8s7S~9ag zXhUFoZZTFhtWD8x~fd*1N>1D&OJOh=zVTpujxOF zv|cCYO+)}PtdFEU5|k?|u)E}@nbxQ9L?RUv=1@8)UqpckOuHS^>nWQxLyh8@#1R{N zZ-bBUQ!x*53sw7G+*acv)DCMJ1yVNwASFElY!;FoW(g6I&M55`Ql--2SSTkVWteNp zMZT8jWZf!E4(Yl>vU^9nyc!8WU+pm7Lt_&(1RXJt_>5NauSaO%94tx)ly<)64)8W_ zk(Hf#eZ;(VWN@xZ&QS4mAMLz+Z>P{dq{_6XoCcLx{GR*gDd>>0p{h6m3)z zOevPMTOaB;apm(pRSt%Urpyii;e3kQLwB=T9~{?i3J?b3K{0jnK8r4V+vtuzee2kX z|8o4Xdb50`mUk)kTT~P6s{MY`%n#rK+$g*t`iL$L@8NH$nPDC*jM=tYJ-rW68JJ?C zPb&p00JF^vJEC8@nr#d9A+D&4p&O2=0rQ9kDs=o1Zc4n}FHJEe!rh?{!RZO(HQC3? zy&1&diatdtVA(d8qDEx!NbZQYhEeG@e3h{U1YY}`Jg zFXii04)q&@30GP&Xn7`3q>7+eAQNrEv*pAo%+#T*?ogIP)^sQIp)zwa!r*?{rp)>Y zJDE+Vv3G(<($~lJ;SKKU zL?;kA=Jn2$1=(*kirp!JgmO*=I9E^|2wGjnc&&j(@uRKQDP7k++G?FV*?BZSZEE9{ zb!wx@#|5|ugxX-N$9Nv&--ipsdI~-+MtO|()+h%G2BpHdo=`75V~qQk>#4!VRUYkS zvhWsBlMzF~iq#OP#TD9pFAX`!|2~tKj5RbXWEKZZ_i-J24D+{9aSXL%@b7)a=nsD8 z<>TVZ$$E8u-1xG+jxSB4aKJOZOd1dHvn&^t8GEyM1@9xHaQuzT?z?ng0wsk`KZ=L?f`;~F; zDrMOsZO=ppI^P5G(O@*P2{U!`uz6<~%Rl(=ZDV)+))Ttk``8B`9;_Lc zKWGfyRmV{Fexj4Ai_8E#W9S|+5B4!Cr^(?OV?5yu9Tp?$pJ`6SWbnjTeU8i}qhur?qIuzUyD`1@U8SCnxEc04PC=Ps}# zWmxJ9EdMvucV#D7V1}Dv@y7g*b~6&q%ZykZ7hWWy6E&)o^PW!EmvL2F7vp)eWHcZv znbLF7#_uqUv-XTNQl7xXx^<6dr}_Ig9c-Gw{HQg~n>#m7)M59=33%2x_o^Xs-X+Zs ze>P6DW!3=EwuD9bv3sn_V+xb;{ID7()1JWK3#B*gs%=F9`&Ve3*acj3)2zKu(m%UX zm>+2i?R=P|e+H*8@e|dH_TVoyiT3ABwD;7Bc9TCC@JzJnS?Eg`>rGj2gHcCt3ZgwF zp~tw`E8%rR0zqc$K6)zeaacn;{k&+4qi)3bOwkkH4x)XfG*frmIXJTNIr~3RuMv-E z-WE-Oe7SZ4KR(gFDAk z&W%!<-SJxZZ%{9apf0eK+|84u7h1|iQJzJXa&eUM-IkI&NW$=Qp@cBh^pZ-R@2#Y~ zw32dZCFL?pxm@>9^2;qH#(7975`HmXf*XgQEw-#nBH&kA%2iRyHI}k8N_n-VEQ?Zx zEoBalkG%WaZ=knXVQSo!T@%(?yZ`0R?Vet$yA20;*6t_O=9xMf*4-m7*Qh=F9tm`G z_$jd5u-4E3!)obtd21|%Ks0i#?%vT=N6d$23#b`$C*Bfobl z#AhVw&l>$Ux#TnX?9o%cKV{t!z$>^V)vuOOp z3%~GKeK7cbW6%dWGl=nB_x1sJ#vp=U7)1JZEV${|yk(iO%7X%73*Ma(T|A+P7;Z9K z!^xu9-VFgXqK*A4FyqV)CgY)FuMyuO0o@Rl4=x9tc4@rL-RwzvI)UHQk<`qG=)t&N zXDlqXyVl1Vc3E%I`tLNU{$!n0H>n-KGpS~210i8_lOE*f^M)uOv_8H`w7% zjL8HHY-S|s4;tc%s%po(R}M5QNc!n?uMe64ZIYO(YCgH_5f%8AX^5L6&E6qPXMgh4 zfBMvzZxXfTv3I}h_8NckL&lGf)bWE&*t_|Y0nhkBPwJB}%;*Wy|*7PD>8{6(jg{7G6Kf~lxM73FIH zv7}f$H(g>QGbJ5HWU7W*8&>jKaXApT^BAm_TRV-EaeU0(CNv>JCP^8vWoTA8K{!kt z*|$kJDKmNxVGmM~&!v0UqAU#N>!Mxg+=~IqJC40~Y{#*8$-=4&LH{$6BS{~t(|t`N z5Wt1iM#GA!PMr1xD`R1y+dQr%gdfuv5%WT?#MHHKtA|e$e<*{#1{Y7YFB%n{leD5{ zzEc=+1vR6ywJl>T*S$2TP0mKq$CP&vmn~MAx(v69QXag^V<3UGU= zQ)vCMFF&Q8`?{0$lKVB2+|PEFTzrMydu_lois71I@WpaZA2Ab5fy2_RsIYtj`Nm=C z6HH9zqk2~Ae-@ecIjv8ZS?C}UHLhH8dy!KYwx=Rt>o9mL+f@k2*2u0(()Srrf7OZs ziSmA$0~gTR{<4nfxR|<`N`PlXM@38;!F|oGhrzK&CPas*%=j_U9tEDB<%uYa z##o9vQ^`*QcRR&RB|om*Q`}VY^VB`XO(j3@-Ba9Dx}|L@X%5y%w>?U6n`lFn;x^Hu zGRw<0kwQMKuvjmAsFL!#mhxfULsR`|C69Z1ABpnxB24aG{rw24&L}un3=LoZc;)MV zSV<{&8CAalgg3I(Q$U}Tl0{xB>jwG z^SA+alK-ns{{MfS{5Q>r0G`P|12w`*n5#zl;QQQb(vJKykL?aSoDVqh+*gXrg5@Bz z4%E^LwZ?s_S&y57B&m0o6$w0(-DQ&gwb9QTO7A`8Rgo-xYkNv{8X<^07Y(w9spv&e(swD&=Q(3_1;UADG>4cilu)nqrdPth;U6eXXrx z;%AZ)ftsY3+kH^?uzBO_Eag_aUv2j{+x>vu59;o_7JpVx<60xZijc5|k?{mOx%YB7 z1#7}+#YZhayV=D1=^hc0F%vjipg)i#e>2U#P^FEE7++8qP3H+UJ zT!F9!u9QjDjVqk86mN5zq5_F=JPz7ZbU6$oD@ z2!ziK$MTl3JN0&8R$YefQi38h@PYK@vYbgnGeDJX=>t-Ga&2_(3K+e0x1|B^T=1P% z@Y^~UjMDF3FyNgFK4JyGtFGXt73+X^F8E$6__cKfH+f(I?_BVYS;0%|3MO**xMlH8 z+sNLzpr5c@1Dy- + +/*[]*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/main.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/main.c new file mode 100644 index 000000000..3aa26e31c --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn/main.c @@ -0,0 +1,347 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +/* RTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Common Demo includes. */ +#include "serial.h" +#include "BlockQ.h" +#include "blocktim.h" +#include "comtest.h" +#include "countsem.h" +#include "death.h" +#include "dynamic.h" +#include "flash.h" +#include "flop.h" +#include "GenQTest.h" +#include "integer.h" +#include "IntQueue.h" +#include "mevents.h" +#include "partest.h" +#include "PollQ.h" +#include "print.h" +#include "QPeek.h" +#include "semtest.h" +/*---------------------------------------------------------------------------*/ + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) +#define mainCOM_LED ( 3 ) + +/* The number of nano seconds between each processor clock. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOM_TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainFLASH_TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) +/*---------------------------------------------------------------------------*/ + +/* + * Configures the timers and interrupts for the fast interrupt test as + * described at the top of this file. + */ +extern void vSetupTimerTest( void ); +/*---------------------------------------------------------------------------*/ + +/** + * The Check task periodical interrogates each of the running tests to + * ensure that they are still executing correctly. + * If all the tests pass, then the LCD is updated with Pass, the number of + * iterations and the Jitter time calculated but the Fast Interrupt Test. + * If any one of the tests fail, it is indicated with an error code printed on + * the display. This indicator won't disappear until the device is reset. + */ +void vCheckTask( void *pvParameters ); + +/** + * Installs the RTOS interrupt handlers and starts the peripherals. + */ +static void prvHardwareSetup( void ); +/*---------------------------------------------------------------------------*/ + +void main( void ) +{ +unsigned long ulLed = 0; +unsigned long ulIteration = 0; + + /* Place your initialization/startup code here (e.g. MyInst_Start()) */ + prvHardwareSetup(); + + /* Poll the switch connected to P1[7] + * to prevent the Soak test from (re)starting. + */ + while ( 0 != Startup_Release_Switch_Read() ) + { + if ( 100000 <= ulIteration++ ) + { + vParTestToggleLED( ulLed++ ); + ulLed = ulLed % 4; + ulIteration = 0; + } + } + + /* Reset the LEDS. */ + for ( ulLed = 0; ulLed < 4; ulLed++ ) + { + vParTestSetLED( ulLed, pdFALSE ); + } + + /* Start the standard demo tasks. These are just here to exercise the + kernel port and provide examples of how the FreeRTOS API can be used. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartCountingSemaphoreTasks(); + vStartDynamicPriorityTasks(); + vStartMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartQueuePeekTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartLEDFlashTasks( mainFLASH_TEST_TASK_PRIORITY ); + vAltStartComTestTasks( mainCOM_TEST_TASK_PRIORITY, 57600, mainCOM_LED ); + vStartInterruptQueueTasks(); + + /* Start the error checking task. */ + (void)xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + + /* Configure the timers used by the fast interrupt timer test. */ + vSetupTimerTest(); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + vTaskStartScheduler(); + + /* Should never reach here. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ + +void prvHardwareSetup( void ) +{ +/* Port layer functions that need to be copied into the vector table. */ +extern void xPortPendSVHandler( void ); +extern void xPortSysTickHandler( void ); +extern void vPortSVCHandler( void ); +extern cyisraddress CyRamVectors[]; + + /* Install the OS Interrupt Handlers. */ + CyRamVectors[11] = (cyisraddress)vPortSVCHandler; + CyRamVectors[14] = (cyisraddress)xPortPendSVHandler; + CyRamVectors[15] = (cyisraddress)xPortSysTickHandler; + + /* Start-up the peripherals. */ + + /* Enable and clear the LCD Display. */ + LCD_Character_Display_Start(); + LCD_Character_Display_ClearDisplay(); + LCD_Character_Display_Position(0,0); + LCD_Character_Display_PrintString("www.FreeRTOS.org "); + LCD_Character_Display_Position(1,0); + LCD_Character_Display_PrintString("CY8C5588AX-060 "); + + /* Start the UART. */ + UART_1_Start(); + + /* Initialise the LEDs. */ + vParTestInitialise(); + + /* Start the PWM modules that drive the IntQueue tests. */ + High_Frequency_PWM_0_Start(); + High_Frequency_PWM_1_Start(); + + /* Start the timers for the Jitter test. */ + Timer_20KHz_Start(); + Timer_48MHz_Start(); +} +/*---------------------------------------------------------------------------*/ + +void vCheckTask( void *pvParameters ) +{ +unsigned long ulRow = 0; +portTickType xDelay = 0; +unsigned short usErrorCode = 0; +unsigned long ulIteration = 0; +extern unsigned portSHORT usMaxJitter; + + /* Intialise the sleeper. */ + xDelay = xTaskGetTickCount(); + + for ( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xDelay, mainCHECK_DELAY ); + + /* Check that all of the Demo tasks are still running. */ + if ( pdTRUE != xAreBlockingQueuesStillRunning() ) + { + usErrorCode |= 0x1; + } + + if ( pdTRUE != xAreBlockTimeTestTasksStillRunning() ) + { + usErrorCode |= 0x2; + } + + if ( pdTRUE != xAreCountingSemaphoreTasksStillRunning() ) + { + usErrorCode |= 0x4; + } + + if ( pdTRUE != xIsCreateTaskStillRunning() ) + { + usErrorCode |= 0x8; + } + + if ( pdTRUE != xAreDynamicPriorityTasksStillRunning() ) + { + usErrorCode |= 0x10; + } + + if ( pdTRUE != xAreMathsTaskStillRunning() ) + { + usErrorCode |= 0x20; + } + + if ( pdTRUE != xAreGenericQueueTasksStillRunning() ) + { + usErrorCode |= 0x40; + } + + if ( pdTRUE != xAreIntegerMathsTaskStillRunning() ) + { + usErrorCode |= 0x80; + } + + if ( pdTRUE != xArePollingQueuesStillRunning() ) + { + usErrorCode |= 0x100; + } + + if ( pdTRUE != xAreQueuePeekTasksStillRunning() ) + { + usErrorCode |= 0x200; + } + + if ( pdTRUE != xAreSemaphoreTasksStillRunning() ) + { + usErrorCode |= 0x400; + } + + if ( pdTRUE != xAreComTestTasksStillRunning() ) + { + usErrorCode |= 0x800; + } + + if ( pdTRUE != xAreIntQueueTasksStillRunning() ) + { + usErrorCode |= 0x1000; + } + + /* Clear the display. */ + LCD_Character_Display_ClearDisplay(); + if ( 0 == usErrorCode ) + { + LCD_Character_Display_Position( (ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Pass: "); + LCD_Character_Display_PrintNumber(ulIteration++); + LCD_Character_Display_Position( (++ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Jitter(ns):"); + LCD_Character_Display_PrintNumber((usMaxJitter * mainNS_PER_CLOCK)); + } + else + { + /* Do something to indicate the failure. */ + LCD_Character_Display_Position( (ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Fail at: "); + LCD_Character_Display_PrintNumber(ulIteration); + LCD_Character_Display_Position( (++ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Error: 0x"); + LCD_Character_Display_PrintHexUint16(usErrorCode); + } + } +} +/*---------------------------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ) +{ + /* The stack space has been execeeded for a task, considering allocating more. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + /* The heap space has been execeeded. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo Workspace.cywrk b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo Workspace.cywrk new file mode 100644 index 000000000..b922d029d --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo Workspace.cywrk @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h new file mode 100644 index 000000000..4180c4c6a --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h @@ -0,0 +1,120 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#include + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) BCLK__BUS_CLK__HZ ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 100 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 32 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 + +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_MALLOC_FAILED_HOOK 1 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/** + * Configure the number of priority bits. This is normally + * __NVIC_PRIO_BITS but PSoC Creator beta 5 contained a larger + * value for the priority than is implemented in the hardware so + * set it here to what the data sheet describes. + */ +#define configPRIO_BITS 3 /* 8 priority levels */ + +/* The lowest priority. */ +#define configKERNEL_INTERRUPT_PRIORITY ( 7 << (8 - configPRIO_BITS) ) + +/* Priority 5, or 160 as only the top three bits are implemented. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << (8 - configPRIO_BITS) ) + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr new file mode 100644 index 0000000000000000000000000000000000000000..239418cc3fe1ff9a39dfdfe4af41942f06f50e21 GIT binary patch literal 23143 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 literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj new file mode 100644 index 000000000..ff529603f --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj @@ -0,0 +1,1003 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.c new file mode 100644 index 000000000..94787b3d4 --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.c @@ -0,0 +1,98 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include +#include "FreeRTOS.h" +#include "task.h" +/*---------------------------------------------------------------------------*/ + +extern portBASE_TYPE xFirstTimerHandler( void ); +extern portBASE_TYPE xSecondTimerHandler( void ); +/*---------------------------------------------------------------------------*/ + +CY_ISR_PROTO(vHighFrequencyFirstISR); +CY_ISR_PROTO(vHighFrequencySecondISR); +/*---------------------------------------------------------------------------*/ + +/** + * Installs and starts the ISRs that drive the Interupt Queue Tests. + */ +void vInitialiseTimerForIntQueueTest( void ) +{ + taskENTER_CRITICAL(); + { + /* Initialise and start the First Timer ISR. */ + isr_High_Frequency_2000Hz_ClearPending(); + isr_High_Frequency_2000Hz_StartEx((cyisraddress)vHighFrequencyFirstISR); + + /* Initialise and start the Second Timer ISR. */ + isr_High_Frequency_2001Hz_ClearPending(); + isr_High_Frequency_2001Hz_StartEx((cyisraddress)vHighFrequencySecondISR); + } + taskEXIT_CRITICAL(); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vHighFrequencyFirstISR) +{ + /* Call back into the test code and context switch if necessary. */ + portEND_SWITCHING_ISR( xFirstTimerHandler() ); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vHighFrequencySecondISR) +{ + /* Call back into the test code and context switch if necessary. */ + portEND_SWITCHING_ISR( xSecondTimerHandler() ); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.h b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.h new file mode 100644 index 000000000..a022717fd --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/IntQueueTimer.h @@ -0,0 +1,62 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef INT_QUEUE_TIMER_H_ +#define INT_QUEUE_TIMER_H_ + +/** + * Install and start the ISRs that drive the Interupt Queue Tests. + */ +void vInitialiseTimerForIntQueueTest( void ); + +#endif /* INT_QUEUE_TIMER_H_ */ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/ParTest.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/ParTest.c new file mode 100644 index 000000000..e98e673de --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/ParTest.c @@ -0,0 +1,117 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" +/*---------------------------------------------------------------------------*/ + +#define partstMAX_LED ( 4 ) +/*---------------------------------------------------------------------------*/ + +static volatile char cLedOutput[ partstMAX_LED ]; +/*---------------------------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ +long lIndex; + for ( lIndex = 0; lIndex < partstMAX_LED; lIndex++ ) + { + cLedOutput[ lIndex ] = 0; + } +} +/*---------------------------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + taskENTER_CRITICAL(); + { + switch ( uxLED ) + { + case 0: + Pin_LED_0_Write( xValue & 0x1 ); + break; + case 1: + Pin_LED_1_Write( xValue & 0x1 ); + break; + case 2: + Pin_LED_2_Write( xValue & 0x1 ); + break; + case 3: + Pin_LED_3_Write( xValue & 0x1 ); + break; + default: + /* Do nothing. */ + break; + } + } + taskEXIT_CRITICAL(); + + /* Record the output for the sake of toggling. */ + if ( uxLED < partstMAX_LED ) + { + cLedOutput[ uxLED ] = ( xValue & 0x1 ); + } +} +/*---------------------------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ + if ( uxLED < partstMAX_LED ) + { + vParTestSetLED( uxLED, !cLedOutput[ uxLED ] ); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/Serial.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/Serial.c new file mode 100644 index 000000000..a82d0c00a --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/Serial.c @@ -0,0 +1,226 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include +#include "FreeRTOS.h" +#include "queue.h" +#include "task.h" +#include "serial.h" +/*---------------------------------------------------------------------------*/ + +#define serialSTRING_DELAY_TICKS ( portMAX_DELAY ) +/*---------------------------------------------------------------------------*/ + +CY_ISR_PROTO(vUartRxISR); +CY_ISR_PROTO(vUartTxISR); +/*---------------------------------------------------------------------------*/ + +static xQueueHandle xSerialTxQueue = NULL; +static xQueueHandle xSerialRxQueue = NULL; +/*---------------------------------------------------------------------------*/ + +xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength ) +{ + /* Configure Rx. */ + xSerialRxQueue = xQueueCreate( uxQueueLength, sizeof( signed char ) ); + isr_UART1_RX_BYTE_RECEIVED_ClearPending(); + isr_UART1_RX_BYTE_RECEIVED_StartEx(vUartRxISR); + + /* Configure Tx */ + xSerialTxQueue = xQueueCreate( uxQueueLength, sizeof( signed char ) ); + isr_UART1_TX_BYTE_COMPLETE_ClearPending() ; + isr_UART1_TX_BYTE_COMPLETE_StartEx(vUartTxISR); + + /* Clear the interrupt modes for the Tx for the time being. */ + UART_1_SetTxInterruptMode( 0 ); + + /* Both configured successfully. */ + return (xComPortHandle)( xSerialTxQueue && xSerialRxQueue ); +} +/*---------------------------------------------------------------------------*/ + +void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength ) +{ +unsigned short usIndex = 0; + for ( usIndex = 0; usIndex < usStringLength; usIndex++ ) + { + /* Check for pre-mature end of line. */ + if ( '\0' == pcString[ usIndex ] ) + { + break; + } + + /* Send out, one character at a time. */ + if ( pdTRUE != xSerialPutChar( NULL, pcString[ usIndex ], serialSTRING_DELAY_TICKS ) ) + { + /* Failed to send, this will be picked up in the receive comtest task. */ + } + } +} +/*---------------------------------------------------------------------------*/ + +signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFALSE; + if ( pdTRUE == xQueueReceive( xSerialRxQueue, pcRxedChar, xBlockTime ) ) + { + /* Picked up a character. */ + xReturn = pdTRUE; + } + return xReturn; +} +/*---------------------------------------------------------------------------*/ + +signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFALSE; + + /* The ISR is processing characters is so just add to the end of the queue. */ + if ( pdTRUE == xQueueSend( xSerialTxQueue, &cOutChar, xBlockTime ) ) + { + xReturn = pdTRUE; + } + else + { + /* The queue is probably full. */ + xReturn = pdFALSE; + } + + /* Make sure that the interrupt will fire in the case where: + * Currently sending so the Tx Complete will fire. + * Not sending so the Empty will fire. + */ + taskENTER_CRITICAL(); + UART_1_SetTxInterruptMode( UART_1_TX_STS_COMPLETE | UART_1_TX_STS_FIFO_EMPTY ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vUartRxISR) +{ +portBASE_TYPE xTaskWoken = pdFALSE; +volatile unsigned char ucStatus = 0; +signed char cInChar = 0; +unsigned long ulMask = 0; + + /* Read the status to acknowledge. */ + ucStatus = UART_1_ReadRxStatus(); + + /* Only interested in a character being received. */ + if ( 0 != ( ucStatus & UART_1_RX_STS_FIFO_NOTEMPTY ) ) + { + /* Get the character. */ + cInChar = UART_1_GetChar(); + + /* Mask off the other RTOS interrupts to interact with the queue. */ + ulMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Try to deliver the character. */ + if ( pdTRUE != xQueueSendFromISR( xSerialRxQueue, &cInChar, &xTaskWoken ) ) + { + /* Run out of space. */ + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulMask ); + } + + /* If we delivered the character then a context switch might be required. */ + portEND_SWITCHING_ISR( xTaskWoken ); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vUartTxISR) +{ +portBASE_TYPE xTaskWoken = pdFALSE; +volatile unsigned char ucStatus = 0; +signed char cOutChar = 0; +unsigned long ulMask = 0; + + /* Read the status to acknowledge. */ + ucStatus = UART_1_ReadTxStatus(); + + /* Check to see whether this is a genuine interrupt. */ + if ( ( 0 != ( ucStatus & UART_1_TX_STS_COMPLETE ) ) + || ( 0 != ( ucStatus & UART_1_TX_STS_FIFO_EMPTY ) ) ) + { + /* Mask off the other RTOS interrupts to interact with the queue. */ + ulMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if ( pdTRUE == xQueueReceiveFromISR( xSerialTxQueue, &cOutChar, &xTaskWoken ) ) + { + /* Send the next character. */ + UART_1_PutChar( cOutChar ); + + /* If we are firing, then the only interrupt we are interested in + * is the Complete. The application code will add the Empty interrupt + * when there is something else to be done. + */ + UART_1_SetTxInterruptMode( UART_1_TX_STS_COMPLETE ); + } + else + { + /* There is no work left so disable the interrupt + * until the application puts more into the queue. + */ + UART_1_SetTxInterruptMode( 0 ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulMask ); + } + + /* If we delivered the character then a context switch might be required. */ + portEND_SWITCHING_ISR( xTaskWoken ); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TimerTest.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TimerTest.c new file mode 100644 index 000000000..3087d1683 --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TimerTest.c @@ -0,0 +1,128 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* High speed timer test as described in main.c. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( ( unsigned portSHORT ) 20000 ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The number of interrupts to pass before we start looking at the jitter. */ +#define timerSETTLE_TIME 5 +/*---------------------------------------------------------------------------*/ + +/* + * Configures the two timers used to perform the test. + */ +void vSetupTimerTest( void ); + +/* Interrupt handler in which the jitter is measured. */ +CY_ISR_PROTO(vTimer20KHzISR); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +volatile unsigned portSHORT usMaxJitter = 0; +/*---------------------------------------------------------------------------*/ + +void vSetupTimerTest( void ) +{ + /* Install the ISR. */ + isrTimer_20KHz_TC_StartEx(vTimer20KHzISR); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vTimer20KHzISR) +{ +static unsigned short usLastCount = 0, usSettleCount = 0, usMaxDifference = 0; +unsigned short usThisCount, usDifference; + + /* Capture the free running timer value as we enter the interrupt. */ + usThisCount = Timer_48MHz_ReadCounter(); + + if( usSettleCount >= timerSETTLE_TIME ) + { + /* What is the difference between the timer value in this interrupt + and the value from the last interrupt. Timer counts down. */ + usDifference = usLastCount + ~usThisCount + 1; + + /* Store the difference in the timer values if it is larger than the + currently stored largest value. The difference over and above the + expected difference will give the 'jitter' in the processing of these + interrupts. */ + if( usDifference > usMaxDifference ) + { + usMaxDifference = usDifference; + + /* Calculate the Jitter based on the difference we expect. */ + usMaxJitter = usMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + else + { + /* Don't bother storing any values for the first couple of + interrupts. */ + usSettleCount++; + } + + /* Remember what the timer value was this time through, so we can calculate + the difference the next time through. */ + usLastCount = usThisCount; +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch new file mode 100644 index 0000000000000000000000000000000000000000..eb724d6d6eacb442c26431faa416192e9957d1ad GIT binary patch literal 122349 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 + +/*[]*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/main.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/main.c new file mode 100644 index 000000000..3aa26e31c --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_Keil/FreeRTOS_Demo.cydsn/main.c @@ -0,0 +1,347 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +/* RTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Common Demo includes. */ +#include "serial.h" +#include "BlockQ.h" +#include "blocktim.h" +#include "comtest.h" +#include "countsem.h" +#include "death.h" +#include "dynamic.h" +#include "flash.h" +#include "flop.h" +#include "GenQTest.h" +#include "integer.h" +#include "IntQueue.h" +#include "mevents.h" +#include "partest.h" +#include "PollQ.h" +#include "print.h" +#include "QPeek.h" +#include "semtest.h" +/*---------------------------------------------------------------------------*/ + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) +#define mainCOM_LED ( 3 ) + +/* The number of nano seconds between each processor clock. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOM_TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainFLASH_TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) +/*---------------------------------------------------------------------------*/ + +/* + * Configures the timers and interrupts for the fast interrupt test as + * described at the top of this file. + */ +extern void vSetupTimerTest( void ); +/*---------------------------------------------------------------------------*/ + +/** + * The Check task periodical interrogates each of the running tests to + * ensure that they are still executing correctly. + * If all the tests pass, then the LCD is updated with Pass, the number of + * iterations and the Jitter time calculated but the Fast Interrupt Test. + * If any one of the tests fail, it is indicated with an error code printed on + * the display. This indicator won't disappear until the device is reset. + */ +void vCheckTask( void *pvParameters ); + +/** + * Installs the RTOS interrupt handlers and starts the peripherals. + */ +static void prvHardwareSetup( void ); +/*---------------------------------------------------------------------------*/ + +void main( void ) +{ +unsigned long ulLed = 0; +unsigned long ulIteration = 0; + + /* Place your initialization/startup code here (e.g. MyInst_Start()) */ + prvHardwareSetup(); + + /* Poll the switch connected to P1[7] + * to prevent the Soak test from (re)starting. + */ + while ( 0 != Startup_Release_Switch_Read() ) + { + if ( 100000 <= ulIteration++ ) + { + vParTestToggleLED( ulLed++ ); + ulLed = ulLed % 4; + ulIteration = 0; + } + } + + /* Reset the LEDS. */ + for ( ulLed = 0; ulLed < 4; ulLed++ ) + { + vParTestSetLED( ulLed, pdFALSE ); + } + + /* Start the standard demo tasks. These are just here to exercise the + kernel port and provide examples of how the FreeRTOS API can be used. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartCountingSemaphoreTasks(); + vStartDynamicPriorityTasks(); + vStartMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartQueuePeekTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartLEDFlashTasks( mainFLASH_TEST_TASK_PRIORITY ); + vAltStartComTestTasks( mainCOM_TEST_TASK_PRIORITY, 57600, mainCOM_LED ); + vStartInterruptQueueTasks(); + + /* Start the error checking task. */ + (void)xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + + /* Configure the timers used by the fast interrupt timer test. */ + vSetupTimerTest(); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + vTaskStartScheduler(); + + /* Should never reach here. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ + +void prvHardwareSetup( void ) +{ +/* Port layer functions that need to be copied into the vector table. */ +extern void xPortPendSVHandler( void ); +extern void xPortSysTickHandler( void ); +extern void vPortSVCHandler( void ); +extern cyisraddress CyRamVectors[]; + + /* Install the OS Interrupt Handlers. */ + CyRamVectors[11] = (cyisraddress)vPortSVCHandler; + CyRamVectors[14] = (cyisraddress)xPortPendSVHandler; + CyRamVectors[15] = (cyisraddress)xPortSysTickHandler; + + /* Start-up the peripherals. */ + + /* Enable and clear the LCD Display. */ + LCD_Character_Display_Start(); + LCD_Character_Display_ClearDisplay(); + LCD_Character_Display_Position(0,0); + LCD_Character_Display_PrintString("www.FreeRTOS.org "); + LCD_Character_Display_Position(1,0); + LCD_Character_Display_PrintString("CY8C5588AX-060 "); + + /* Start the UART. */ + UART_1_Start(); + + /* Initialise the LEDs. */ + vParTestInitialise(); + + /* Start the PWM modules that drive the IntQueue tests. */ + High_Frequency_PWM_0_Start(); + High_Frequency_PWM_1_Start(); + + /* Start the timers for the Jitter test. */ + Timer_20KHz_Start(); + Timer_48MHz_Start(); +} +/*---------------------------------------------------------------------------*/ + +void vCheckTask( void *pvParameters ) +{ +unsigned long ulRow = 0; +portTickType xDelay = 0; +unsigned short usErrorCode = 0; +unsigned long ulIteration = 0; +extern unsigned portSHORT usMaxJitter; + + /* Intialise the sleeper. */ + xDelay = xTaskGetTickCount(); + + for ( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xDelay, mainCHECK_DELAY ); + + /* Check that all of the Demo tasks are still running. */ + if ( pdTRUE != xAreBlockingQueuesStillRunning() ) + { + usErrorCode |= 0x1; + } + + if ( pdTRUE != xAreBlockTimeTestTasksStillRunning() ) + { + usErrorCode |= 0x2; + } + + if ( pdTRUE != xAreCountingSemaphoreTasksStillRunning() ) + { + usErrorCode |= 0x4; + } + + if ( pdTRUE != xIsCreateTaskStillRunning() ) + { + usErrorCode |= 0x8; + } + + if ( pdTRUE != xAreDynamicPriorityTasksStillRunning() ) + { + usErrorCode |= 0x10; + } + + if ( pdTRUE != xAreMathsTaskStillRunning() ) + { + usErrorCode |= 0x20; + } + + if ( pdTRUE != xAreGenericQueueTasksStillRunning() ) + { + usErrorCode |= 0x40; + } + + if ( pdTRUE != xAreIntegerMathsTaskStillRunning() ) + { + usErrorCode |= 0x80; + } + + if ( pdTRUE != xArePollingQueuesStillRunning() ) + { + usErrorCode |= 0x100; + } + + if ( pdTRUE != xAreQueuePeekTasksStillRunning() ) + { + usErrorCode |= 0x200; + } + + if ( pdTRUE != xAreSemaphoreTasksStillRunning() ) + { + usErrorCode |= 0x400; + } + + if ( pdTRUE != xAreComTestTasksStillRunning() ) + { + usErrorCode |= 0x800; + } + + if ( pdTRUE != xAreIntQueueTasksStillRunning() ) + { + usErrorCode |= 0x1000; + } + + /* Clear the display. */ + LCD_Character_Display_ClearDisplay(); + if ( 0 == usErrorCode ) + { + LCD_Character_Display_Position( (ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Pass: "); + LCD_Character_Display_PrintNumber(ulIteration++); + LCD_Character_Display_Position( (++ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Jitter(ns):"); + LCD_Character_Display_PrintNumber((usMaxJitter * mainNS_PER_CLOCK)); + } + else + { + /* Do something to indicate the failure. */ + LCD_Character_Display_Position( (ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Fail at: "); + LCD_Character_Display_PrintNumber(ulIteration); + LCD_Character_Display_Position( (++ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Error: 0x"); + LCD_Character_Display_PrintHexUint16(usErrorCode); + } + } +} +/*---------------------------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ) +{ + /* The stack space has been execeeded for a task, considering allocating more. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + /* The heap space has been execeeded. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo Workspace.cywrk b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo Workspace.cywrk new file mode 100644 index 000000000..fc16c439d --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo Workspace.cywrk @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h new file mode 100644 index 000000000..4180c4c6a --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOSConfig.h @@ -0,0 +1,120 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#include + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) BCLK__BUS_CLK__HZ ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 100 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 32 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 + +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_MALLOC_FAILED_HOOK 1 + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/** + * Configure the number of priority bits. This is normally + * __NVIC_PRIO_BITS but PSoC Creator beta 5 contained a larger + * value for the priority than is implemented in the hardware so + * set it here to what the data sheet describes. + */ +#define configPRIO_BITS 3 /* 8 priority levels */ + +/* The lowest priority. */ +#define configKERNEL_INTERRUPT_PRIORITY ( 7 << (8 - configPRIO_BITS) ) + +/* Priority 5, or 160 as only the top three bits are implemented. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << (8 - configPRIO_BITS) ) + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cydwr new file mode 100644 index 0000000000000000000000000000000000000000..239418cc3fe1ff9a39dfdfe4af41942f06f50e21 GIT binary patch literal 23143 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 literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj new file mode 100644 index 000000000..d00e7ed6d --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/FreeRTOS_Demo.cyprj @@ -0,0 +1,1003 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.c new file mode 100644 index 000000000..94787b3d4 --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.c @@ -0,0 +1,98 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include +#include "FreeRTOS.h" +#include "task.h" +/*---------------------------------------------------------------------------*/ + +extern portBASE_TYPE xFirstTimerHandler( void ); +extern portBASE_TYPE xSecondTimerHandler( void ); +/*---------------------------------------------------------------------------*/ + +CY_ISR_PROTO(vHighFrequencyFirstISR); +CY_ISR_PROTO(vHighFrequencySecondISR); +/*---------------------------------------------------------------------------*/ + +/** + * Installs and starts the ISRs that drive the Interupt Queue Tests. + */ +void vInitialiseTimerForIntQueueTest( void ) +{ + taskENTER_CRITICAL(); + { + /* Initialise and start the First Timer ISR. */ + isr_High_Frequency_2000Hz_ClearPending(); + isr_High_Frequency_2000Hz_StartEx((cyisraddress)vHighFrequencyFirstISR); + + /* Initialise and start the Second Timer ISR. */ + isr_High_Frequency_2001Hz_ClearPending(); + isr_High_Frequency_2001Hz_StartEx((cyisraddress)vHighFrequencySecondISR); + } + taskEXIT_CRITICAL(); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vHighFrequencyFirstISR) +{ + /* Call back into the test code and context switch if necessary. */ + portEND_SWITCHING_ISR( xFirstTimerHandler() ); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vHighFrequencySecondISR) +{ + /* Call back into the test code and context switch if necessary. */ + portEND_SWITCHING_ISR( xSecondTimerHandler() ); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.h b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.h new file mode 100644 index 000000000..a022717fd --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/IntQueueTimer.h @@ -0,0 +1,62 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#ifndef INT_QUEUE_TIMER_H_ +#define INT_QUEUE_TIMER_H_ + +/** + * Install and start the ISRs that drive the Interupt Queue Tests. + */ +void vInitialiseTimerForIntQueueTest( void ); + +#endif /* INT_QUEUE_TIMER_H_ */ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/ParTest.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/ParTest.c new file mode 100644 index 000000000..e98e673de --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/ParTest.c @@ -0,0 +1,117 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" +/*---------------------------------------------------------------------------*/ + +#define partstMAX_LED ( 4 ) +/*---------------------------------------------------------------------------*/ + +static volatile char cLedOutput[ partstMAX_LED ]; +/*---------------------------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ +long lIndex; + for ( lIndex = 0; lIndex < partstMAX_LED; lIndex++ ) + { + cLedOutput[ lIndex ] = 0; + } +} +/*---------------------------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + taskENTER_CRITICAL(); + { + switch ( uxLED ) + { + case 0: + Pin_LED_0_Write( xValue & 0x1 ); + break; + case 1: + Pin_LED_1_Write( xValue & 0x1 ); + break; + case 2: + Pin_LED_2_Write( xValue & 0x1 ); + break; + case 3: + Pin_LED_3_Write( xValue & 0x1 ); + break; + default: + /* Do nothing. */ + break; + } + } + taskEXIT_CRITICAL(); + + /* Record the output for the sake of toggling. */ + if ( uxLED < partstMAX_LED ) + { + cLedOutput[ uxLED ] = ( xValue & 0x1 ); + } +} +/*---------------------------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ + if ( uxLED < partstMAX_LED ) + { + vParTestSetLED( uxLED, !cLedOutput[ uxLED ] ); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/Serial.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/Serial.c new file mode 100644 index 000000000..a82d0c00a --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/Serial.c @@ -0,0 +1,226 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include +#include "FreeRTOS.h" +#include "queue.h" +#include "task.h" +#include "serial.h" +/*---------------------------------------------------------------------------*/ + +#define serialSTRING_DELAY_TICKS ( portMAX_DELAY ) +/*---------------------------------------------------------------------------*/ + +CY_ISR_PROTO(vUartRxISR); +CY_ISR_PROTO(vUartTxISR); +/*---------------------------------------------------------------------------*/ + +static xQueueHandle xSerialTxQueue = NULL; +static xQueueHandle xSerialRxQueue = NULL; +/*---------------------------------------------------------------------------*/ + +xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength ) +{ + /* Configure Rx. */ + xSerialRxQueue = xQueueCreate( uxQueueLength, sizeof( signed char ) ); + isr_UART1_RX_BYTE_RECEIVED_ClearPending(); + isr_UART1_RX_BYTE_RECEIVED_StartEx(vUartRxISR); + + /* Configure Tx */ + xSerialTxQueue = xQueueCreate( uxQueueLength, sizeof( signed char ) ); + isr_UART1_TX_BYTE_COMPLETE_ClearPending() ; + isr_UART1_TX_BYTE_COMPLETE_StartEx(vUartTxISR); + + /* Clear the interrupt modes for the Tx for the time being. */ + UART_1_SetTxInterruptMode( 0 ); + + /* Both configured successfully. */ + return (xComPortHandle)( xSerialTxQueue && xSerialRxQueue ); +} +/*---------------------------------------------------------------------------*/ + +void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength ) +{ +unsigned short usIndex = 0; + for ( usIndex = 0; usIndex < usStringLength; usIndex++ ) + { + /* Check for pre-mature end of line. */ + if ( '\0' == pcString[ usIndex ] ) + { + break; + } + + /* Send out, one character at a time. */ + if ( pdTRUE != xSerialPutChar( NULL, pcString[ usIndex ], serialSTRING_DELAY_TICKS ) ) + { + /* Failed to send, this will be picked up in the receive comtest task. */ + } + } +} +/*---------------------------------------------------------------------------*/ + +signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFALSE; + if ( pdTRUE == xQueueReceive( xSerialRxQueue, pcRxedChar, xBlockTime ) ) + { + /* Picked up a character. */ + xReturn = pdTRUE; + } + return xReturn; +} +/*---------------------------------------------------------------------------*/ + +signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFALSE; + + /* The ISR is processing characters is so just add to the end of the queue. */ + if ( pdTRUE == xQueueSend( xSerialTxQueue, &cOutChar, xBlockTime ) ) + { + xReturn = pdTRUE; + } + else + { + /* The queue is probably full. */ + xReturn = pdFALSE; + } + + /* Make sure that the interrupt will fire in the case where: + * Currently sending so the Tx Complete will fire. + * Not sending so the Empty will fire. + */ + taskENTER_CRITICAL(); + UART_1_SetTxInterruptMode( UART_1_TX_STS_COMPLETE | UART_1_TX_STS_FIFO_EMPTY ); + taskEXIT_CRITICAL(); + + return xReturn; +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vUartRxISR) +{ +portBASE_TYPE xTaskWoken = pdFALSE; +volatile unsigned char ucStatus = 0; +signed char cInChar = 0; +unsigned long ulMask = 0; + + /* Read the status to acknowledge. */ + ucStatus = UART_1_ReadRxStatus(); + + /* Only interested in a character being received. */ + if ( 0 != ( ucStatus & UART_1_RX_STS_FIFO_NOTEMPTY ) ) + { + /* Get the character. */ + cInChar = UART_1_GetChar(); + + /* Mask off the other RTOS interrupts to interact with the queue. */ + ulMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Try to deliver the character. */ + if ( pdTRUE != xQueueSendFromISR( xSerialRxQueue, &cInChar, &xTaskWoken ) ) + { + /* Run out of space. */ + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulMask ); + } + + /* If we delivered the character then a context switch might be required. */ + portEND_SWITCHING_ISR( xTaskWoken ); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vUartTxISR) +{ +portBASE_TYPE xTaskWoken = pdFALSE; +volatile unsigned char ucStatus = 0; +signed char cOutChar = 0; +unsigned long ulMask = 0; + + /* Read the status to acknowledge. */ + ucStatus = UART_1_ReadTxStatus(); + + /* Check to see whether this is a genuine interrupt. */ + if ( ( 0 != ( ucStatus & UART_1_TX_STS_COMPLETE ) ) + || ( 0 != ( ucStatus & UART_1_TX_STS_FIFO_EMPTY ) ) ) + { + /* Mask off the other RTOS interrupts to interact with the queue. */ + ulMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if ( pdTRUE == xQueueReceiveFromISR( xSerialTxQueue, &cOutChar, &xTaskWoken ) ) + { + /* Send the next character. */ + UART_1_PutChar( cOutChar ); + + /* If we are firing, then the only interrupt we are interested in + * is the Complete. The application code will add the Empty interrupt + * when there is something else to be done. + */ + UART_1_SetTxInterruptMode( UART_1_TX_STS_COMPLETE ); + } + else + { + /* There is no work left so disable the interrupt + * until the application puts more into the queue. + */ + UART_1_SetTxInterruptMode( 0 ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulMask ); + } + + /* If we delivered the character then a context switch might be required. */ + portEND_SWITCHING_ISR( xTaskWoken ); +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TimerTest.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TimerTest.c new file mode 100644 index 000000000..3087d1683 --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TimerTest.c @@ -0,0 +1,128 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +/* High speed timer test as described in main.c. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( ( unsigned portSHORT ) 20000 ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The number of interrupts to pass before we start looking at the jitter. */ +#define timerSETTLE_TIME 5 +/*---------------------------------------------------------------------------*/ + +/* + * Configures the two timers used to perform the test. + */ +void vSetupTimerTest( void ); + +/* Interrupt handler in which the jitter is measured. */ +CY_ISR_PROTO(vTimer20KHzISR); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +volatile unsigned portSHORT usMaxJitter = 0; +/*---------------------------------------------------------------------------*/ + +void vSetupTimerTest( void ) +{ + /* Install the ISR. */ + isrTimer_20KHz_TC_StartEx(vTimer20KHzISR); +} +/*---------------------------------------------------------------------------*/ + +CY_ISR(vTimer20KHzISR) +{ +static unsigned short usLastCount = 0, usSettleCount = 0, usMaxDifference = 0; +unsigned short usThisCount, usDifference; + + /* Capture the free running timer value as we enter the interrupt. */ + usThisCount = Timer_48MHz_ReadCounter(); + + if( usSettleCount >= timerSETTLE_TIME ) + { + /* What is the difference between the timer value in this interrupt + and the value from the last interrupt. Timer counts down. */ + usDifference = usLastCount + ~usThisCount + 1; + + /* Store the difference in the timer values if it is larger than the + currently stored largest value. The difference over and above the + expected difference will give the 'jitter' in the processing of these + interrupts. */ + if( usDifference > usMaxDifference ) + { + usMaxDifference = usDifference; + + /* Calculate the Jitter based on the difference we expect. */ + usMaxJitter = usMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + else + { + /* Don't bother storing any values for the first couple of + interrupts. */ + usSettleCount++; + } + + /* Remember what the timer value was this time through, so we can calculate + the difference the next time through. */ + usLastCount = usThisCount; +} +/*---------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/TopDesign/TopDesign.cysch new file mode 100644 index 0000000000000000000000000000000000000000..eb724d6d6eacb442c26431faa416192e9957d1ad GIT binary patch literal 122349 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 + +/*[]*/ diff --git a/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/main.c b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/main.c new file mode 100644 index 000000000..3aa26e31c --- /dev/null +++ b/Demo/CORTEX_CY8C5588_PSoC_Creator_RVDS/FreeRTOS_Demo.cydsn/main.c @@ -0,0 +1,347 @@ +/* + FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS books - available as PDF or paperback * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + 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 exception 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. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include + +/* RTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Common Demo includes. */ +#include "serial.h" +#include "BlockQ.h" +#include "blocktim.h" +#include "comtest.h" +#include "countsem.h" +#include "death.h" +#include "dynamic.h" +#include "flash.h" +#include "flop.h" +#include "GenQTest.h" +#include "integer.h" +#include "IntQueue.h" +#include "mevents.h" +#include "partest.h" +#include "PollQ.h" +#include "print.h" +#include "QPeek.h" +#include "semtest.h" +/*---------------------------------------------------------------------------*/ + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) +#define mainCOM_LED ( 3 ) + +/* The number of nano seconds between each processor clock. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOM_TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainFLASH_TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) +/*---------------------------------------------------------------------------*/ + +/* + * Configures the timers and interrupts for the fast interrupt test as + * described at the top of this file. + */ +extern void vSetupTimerTest( void ); +/*---------------------------------------------------------------------------*/ + +/** + * The Check task periodical interrogates each of the running tests to + * ensure that they are still executing correctly. + * If all the tests pass, then the LCD is updated with Pass, the number of + * iterations and the Jitter time calculated but the Fast Interrupt Test. + * If any one of the tests fail, it is indicated with an error code printed on + * the display. This indicator won't disappear until the device is reset. + */ +void vCheckTask( void *pvParameters ); + +/** + * Installs the RTOS interrupt handlers and starts the peripherals. + */ +static void prvHardwareSetup( void ); +/*---------------------------------------------------------------------------*/ + +void main( void ) +{ +unsigned long ulLed = 0; +unsigned long ulIteration = 0; + + /* Place your initialization/startup code here (e.g. MyInst_Start()) */ + prvHardwareSetup(); + + /* Poll the switch connected to P1[7] + * to prevent the Soak test from (re)starting. + */ + while ( 0 != Startup_Release_Switch_Read() ) + { + if ( 100000 <= ulIteration++ ) + { + vParTestToggleLED( ulLed++ ); + ulLed = ulLed % 4; + ulIteration = 0; + } + } + + /* Reset the LEDS. */ + for ( ulLed = 0; ulLed < 4; ulLed++ ) + { + vParTestSetLED( ulLed, pdFALSE ); + } + + /* Start the standard demo tasks. These are just here to exercise the + kernel port and provide examples of how the FreeRTOS API can be used. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartCountingSemaphoreTasks(); + vStartDynamicPriorityTasks(); + vStartMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartQueuePeekTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartLEDFlashTasks( mainFLASH_TEST_TASK_PRIORITY ); + vAltStartComTestTasks( mainCOM_TEST_TASK_PRIORITY, 57600, mainCOM_LED ); + vStartInterruptQueueTasks(); + + /* Start the error checking task. */ + (void)xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + + /* Configure the timers used by the fast interrupt timer test. */ + vSetupTimerTest(); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Will only get here if there was insufficient memory to create the idle + task. The idle task is created within vTaskStartScheduler(). */ + vTaskStartScheduler(); + + /* Should never reach here. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ + +void prvHardwareSetup( void ) +{ +/* Port layer functions that need to be copied into the vector table. */ +extern void xPortPendSVHandler( void ); +extern void xPortSysTickHandler( void ); +extern void vPortSVCHandler( void ); +extern cyisraddress CyRamVectors[]; + + /* Install the OS Interrupt Handlers. */ + CyRamVectors[11] = (cyisraddress)vPortSVCHandler; + CyRamVectors[14] = (cyisraddress)xPortPendSVHandler; + CyRamVectors[15] = (cyisraddress)xPortSysTickHandler; + + /* Start-up the peripherals. */ + + /* Enable and clear the LCD Display. */ + LCD_Character_Display_Start(); + LCD_Character_Display_ClearDisplay(); + LCD_Character_Display_Position(0,0); + LCD_Character_Display_PrintString("www.FreeRTOS.org "); + LCD_Character_Display_Position(1,0); + LCD_Character_Display_PrintString("CY8C5588AX-060 "); + + /* Start the UART. */ + UART_1_Start(); + + /* Initialise the LEDs. */ + vParTestInitialise(); + + /* Start the PWM modules that drive the IntQueue tests. */ + High_Frequency_PWM_0_Start(); + High_Frequency_PWM_1_Start(); + + /* Start the timers for the Jitter test. */ + Timer_20KHz_Start(); + Timer_48MHz_Start(); +} +/*---------------------------------------------------------------------------*/ + +void vCheckTask( void *pvParameters ) +{ +unsigned long ulRow = 0; +portTickType xDelay = 0; +unsigned short usErrorCode = 0; +unsigned long ulIteration = 0; +extern unsigned portSHORT usMaxJitter; + + /* Intialise the sleeper. */ + xDelay = xTaskGetTickCount(); + + for ( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xDelay, mainCHECK_DELAY ); + + /* Check that all of the Demo tasks are still running. */ + if ( pdTRUE != xAreBlockingQueuesStillRunning() ) + { + usErrorCode |= 0x1; + } + + if ( pdTRUE != xAreBlockTimeTestTasksStillRunning() ) + { + usErrorCode |= 0x2; + } + + if ( pdTRUE != xAreCountingSemaphoreTasksStillRunning() ) + { + usErrorCode |= 0x4; + } + + if ( pdTRUE != xIsCreateTaskStillRunning() ) + { + usErrorCode |= 0x8; + } + + if ( pdTRUE != xAreDynamicPriorityTasksStillRunning() ) + { + usErrorCode |= 0x10; + } + + if ( pdTRUE != xAreMathsTaskStillRunning() ) + { + usErrorCode |= 0x20; + } + + if ( pdTRUE != xAreGenericQueueTasksStillRunning() ) + { + usErrorCode |= 0x40; + } + + if ( pdTRUE != xAreIntegerMathsTaskStillRunning() ) + { + usErrorCode |= 0x80; + } + + if ( pdTRUE != xArePollingQueuesStillRunning() ) + { + usErrorCode |= 0x100; + } + + if ( pdTRUE != xAreQueuePeekTasksStillRunning() ) + { + usErrorCode |= 0x200; + } + + if ( pdTRUE != xAreSemaphoreTasksStillRunning() ) + { + usErrorCode |= 0x400; + } + + if ( pdTRUE != xAreComTestTasksStillRunning() ) + { + usErrorCode |= 0x800; + } + + if ( pdTRUE != xAreIntQueueTasksStillRunning() ) + { + usErrorCode |= 0x1000; + } + + /* Clear the display. */ + LCD_Character_Display_ClearDisplay(); + if ( 0 == usErrorCode ) + { + LCD_Character_Display_Position( (ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Pass: "); + LCD_Character_Display_PrintNumber(ulIteration++); + LCD_Character_Display_Position( (++ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Jitter(ns):"); + LCD_Character_Display_PrintNumber((usMaxJitter * mainNS_PER_CLOCK)); + } + else + { + /* Do something to indicate the failure. */ + LCD_Character_Display_Position( (ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Fail at: "); + LCD_Character_Display_PrintNumber(ulIteration); + LCD_Character_Display_Position( (++ulRow) & 0x1, 0); + LCD_Character_Display_PrintString("Error: 0x"); + LCD_Character_Display_PrintHexUint16(usErrorCode); + } + } +} +/*---------------------------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ) +{ + /* The stack space has been execeeded for a task, considering allocating more. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + /* The heap space has been execeeded. */ + for (;;); +} +/*---------------------------------------------------------------------------*/ -- 2.39.5