From 79d0a86ab8b82d6dd24e5d19c15fd54895decea6 Mon Sep 17 00:00:00 2001 From: rtel Date: Mon, 10 Feb 2014 14:16:39 +0000 Subject: [PATCH] Update the Win32/MingW demo to match the latest Win32/MSVC demo. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2194 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- FreeRTOS/Demo/WIN32-MingW/FreeRTOSConfig.h | 2 +- .../Trace_Recorder_Configuration/trcConfig.h | 101 +++- .../trcHardwarePort.h | 474 ------------------ FreeRTOS/Demo/WIN32-MingW/main.c | 20 +- FreeRTOS/Demo/WIN32-MingW/main_blinky.c | 32 +- FreeRTOS/Demo/WIN32-MingW/main_full.c | 102 +++- 6 files changed, 190 insertions(+), 541 deletions(-) delete mode 100644 FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcHardwarePort.h diff --git a/FreeRTOS/Demo/WIN32-MingW/FreeRTOSConfig.h b/FreeRTOS/Demo/WIN32-MingW/FreeRTOSConfig.h index ddf9b1bf8..4e84d8f06 100644 --- a/FreeRTOS/Demo/WIN32-MingW/FreeRTOSConfig.h +++ b/FreeRTOS/Demo/WIN32-MingW/FreeRTOSConfig.h @@ -140,7 +140,7 @@ functions anyway. */ #define INCLUDE_pcTaskGetTaskName 1 #define INCLUDE_eTaskGetState 1 #define INCLUDE_xSemaphoreGetMutexHolder 1 -#define INCLUDE_xTimerPendFunctionCallFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 1 /* It is a good idea to define configASSERT() while developing. configASSERT() uses the same semantics as the standard C assert() macro. */ diff --git a/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcConfig.h b/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcConfig.h index 091d9ec81..2ebabeb75 100644 --- a/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcConfig.h +++ b/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcConfig.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Tracealyzer v2.4.1 Recorder Library + * Tracealyzer v2.6.0 Recorder Library * Percepio AB, www.percepio.com * * trcConfig.h @@ -43,8 +43,6 @@ #ifndef TRCCONFIG_H #define TRCCONFIG_H -#include - /******************************************************************************* * CONFIGURATION RELATED TO CAPACITY AND ALLOCATION ******************************************************************************/ @@ -93,10 +91,16 @@ * stores User Events labels and names of deleted tasks, queues, or other kernel * objects. Note that the names of active objects not stored here but in the * Object Table. Thus, if you don't use User Events or delete any kernel - * objects you set this to zero (0) to minimize RAM usage. + * objects you set this to a very low value, e.g. 4, but not zero (0) since + * this causes a declaration of a zero-sized array, for which the C compiler + * behavior is not standardized and may cause misaligned data. ******************************************************************************/ #define SYMBOL_TABLE_SIZE 5000 +#if (SYMBOL_TABLE_SIZE == 0) +#error "SYMBOL_TABLE_SIZE may not be zero!" +#endif + /******************************************************************************* * USE_SEPARATE_USER_EVENT_BUFFER * @@ -158,10 +162,9 @@ * check the actual usage in Tracealyzer. This is shown by selecting * View -> Trace Details -> Resource Usage -> Object Table * - * NOTE 2: Remember to account for all tasks created by the kernel, such as the - * IDLE task, timer task, and any tasks created by other 3rd party - * software components, such as communication stacks. The recorder also has an - * optional monitor task to account for, if this is used. + * NOTE 2: Remember to account for all tasks and other objects created by + * the kernel, such as the IDLE task, any timer tasks, and any tasks created + * by other 3rd party software components, such as communication stacks. * Moreover, one task slot is used to indicate "(startup)", i.e., a fictive * task that represent the time before the scheduler starts. * NTask should thus be at least 2-3 slots larger than your application task count. @@ -172,6 +175,8 @@ #define NQueue 60 #define NSemaphore 60 #define NMutex 60 +#define NTimer 200 +#define NEventGroup 60 /* Maximum object name length for each class (includes zero termination) */ #define NameLenTask 15 @@ -179,6 +184,8 @@ #define NameLenQueue 15 #define NameLenSemaphore 15 #define NameLenMutex 15 +#define NameLenTimer 15 +#define NameLenEventGroup 15 /****************************************************************************** * TRACE_DESCRIPTION @@ -267,8 +274,7 @@ * much faster than a printf and can therefore be used in timing critical code. * See vTraceUserEvent() and vTracePrintF() in trcUser.h * - * Note that Tracealyzer Standard Edition or Professional Edition is required - * for User Events, they are not displayed in Tracealyzer Free Edition. + * Note that User Events are not displayed in FreeRTOS+Trace Free Edition. *****************************************************************************/ #define INCLUDE_USER_EVENTS 1 @@ -320,7 +326,7 @@ * traced kernel objects are deleted at runtime. If no deletes are made, this * can be set to 0 in order to exclude the delete-handling code. *****************************************************************************/ -#define INCLUDE_OBJECT_DELETE 0 +#define INCLUDE_OBJECT_DELETE 1 /****************************************************************************** * CONFIGURATION RELATED TO BEHAVIOR @@ -497,14 +503,77 @@ #define TRACE_PROGRESS_MONITOR_TASK_PERIOD 1000 #endif + /****************************************************************************** - * TEAM_LICENSE_CODE + * USE_16BIT_OBJECT_HANDLES + * + * Macro which should be defined as either zero (0) or one (1). + * Default is 0. + * + * If set to 0 (zero), the recorder uses 8-bit handles to identify kernel + * objects such as tasks and queues. This limits the supported number of + * concurrently active objects to 255 of each type (object class). * - * Macro which defines a string - the team license code. - * If no team license is available, this should be an empty string "". - * This should be maximum 32 chars, including zero-termination. + * If set to 1 (one), the recorder uses 16-bit handles to identify kernel + * objects such as tasks and queues. This limits the supported number of + * concurrent objects to 65535 of each type (object class). However, since the + * object property table is limited to 64 KB, the practical limit is about + * 3000 objects in total. + * + * NOTE: An object with a high ID (> 255) will generate an extra event + * (= 4 byte) in the event buffer. + * + * NOTE: Some internal tables in the recorder gets larger when using 16-bit + * handles. The additional RAM usage is 5-10 byte plus 1 byte per kernel object + *, i.e., task, queue, semaphore, mutex, etc. *****************************************************************************/ -#define TEAM_LICENSE_CODE "" +#define USE_16BIT_OBJECT_HANDLES 0 + +/****** Port Name ******************** Code ** Official ** OS Platform ****** +* PORT_APPLICATION_DEFINED -2 - - +* PORT_NOT_SET -1 - - +* PORT_HWIndependent 0 Yes Any +* PORT_Win32 1 Yes FreeRTOS Win32 +* PORT_Atmel_AT91SAM7 2 No Any +* PORT_Atmel_UC3A0 3 No Any +* PORT_ARM_CortexM 4 Yes Any +* PORT_Renesas_RX600 5 Yes Any +* PORT_Microchip_dsPIC_AND_PIC24 6 Yes Any +* PORT_TEXAS_INSTRUMENTS_TMS570 7 No Any +* PORT_TEXAS_INSTRUMENTS_MSP430 8 No Any +* PORT_MICROCHIP_PIC32 9 No Any +* PORT_XILINX_PPC405 10 No FreeRTOS +* PORT_XILINX_PPC440 11 No FreeRTOS +* PORT_XILINX_MICROBLAZE 12 No Any +* PORT_NXP_LPC210X 13 No Any +*****************************************************************************/ +#define SELECTED_PORT PORT_Win32 + +#if (SELECTED_PORT == PORT_NOT_SET) +#error "You need to define SELECTED_PORT here!" +#endif + +/****************************************************************************** +* USE_PRIMASK_CS (for Cortex M devices only) +* +* An integer constant that selects between two options for the critical +* sections of the recorder library. + * +* 0: The default FreeRTOS critical section (BASEPRI) - default setting +* 1: Always disable ALL interrupts (using PRIMASK) + * +* Option 0 uses the standard FreeRTOS macros for critical sections. +* However, on Cortex-M devices they only disable interrupts with priorities +* below a certain configurable level, while higher priority ISRs remain active. +* Such high-priority ISRs may not use the recorder functions in this mode. +* +* Option 1 allows you to safely call the recorder from any ISR, independent of +* the interrupt priority. This mode may however cause higher IRQ latencies +* (some microseconds) since ALL configurable interrupts are disabled during +* the recorder's critical sections in this mode, using the PRIMASK register. + ******************************************************************************/ +#define USE_PRIMASK_CS 0 + #endif diff --git a/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcHardwarePort.h b/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcHardwarePort.h deleted file mode 100644 index ac8347765..000000000 --- a/FreeRTOS/Demo/WIN32-MingW/Trace_Recorder_Configuration/trcHardwarePort.h +++ /dev/null @@ -1,474 +0,0 @@ -/******************************************************************************* - * Tracealyzer v2.4.1 Recorder Library - * Percepio AB, www.percepio.com - * - * trcHardwarePort.h - * - * Contains together with trcHardwarePort.c all hardware portability issues of - * the trace recorder library. - * - * Terms of Use - * This software is copyright Percepio AB. The recorder library is free for - * use together with Percepio products. You may distribute the recorder library - * in its original form, including modifications in trcPort.c and trcPort.h - * given that these modification are clearly marked as your own modifications - * and documented in the initial comment section of these source files. - * This software is the intellectual property of Percepio AB and may not be - * sold or in other ways commercially redistributed without explicit written - * permission by Percepio AB. - * - * Disclaimer - * The trace tool and recorder library is being delivered to you AS IS and - * Percepio AB makes no warranty as to its use or performance. Percepio AB does - * not and cannot warrant the performance or results you may obtain by using the - * software or documentation. Percepio AB make no warranties, express or - * implied, as to noninfringement of third party rights, merchantability, or - * fitness for any particular purpose. In no event will Percepio AB, its - * technology partners, or distributors be liable to you for any consequential, - * incidental or special damages, including any lost profits or lost savings, - * even if a representative of Percepio AB has been advised of the possibility - * of such damages, or for any claim by any third party. Some jurisdictions do - * not allow the exclusion or limitation of incidental, consequential or special - * damages, or the exclusion of implied warranties or limitations on how long an - * implied warranty may last, so the above limitations may not apply to you. - * - * Copyright Percepio AB, 2013. - * www.percepio.com - ******************************************************************************/ - -#ifndef TRCPORT_H -#define TRCPORT_H - -#include "trcKernelPort.h" - -/* If Win32 port */ -#ifdef WIN32 - - #undef _WIN32_WINNT - #define _WIN32_WINNT 0x0600 - - /* Standard includes. */ - #include - #include - #include - -/******************************************************************************* - * The Win32 port by default saves the trace to file and then kills the - * program when the recorder is stopped, to facilitate quick, simple tests - * of the recorder. - ******************************************************************************/ - #define WIN32_PORT_SAVE_WHEN_STOPPED 1 - #define WIN32_PORT_EXIT_WHEN_STOPPED 1 - -#endif - -#define DIRECTION_INCREMENTING 1 -#define DIRECTION_DECREMENTING 2 - -/****************************************************************************** - * Supported ports - * - * PORT_HWIndependent - * A hardware independent fallback option for event timestamping. Provides low - * resolution timestamps based on the OS tick. - * This may be used on the Win32 port, but may also be used on embedded hardware - * platforms. All time durations will be truncated to the OS tick frequency, - * typically 1 KHz. This means that a task or ISR that executes in less than - * 1 ms get an execution time of zero. - * - * PORT_Win32 - * "Accurate" timestamping based on the Windows performance counter. Note that - * this gives the host machine time. - * - * Officially supported hardware timer ports: - * - PORT_Atmel_AT91SAM7 - * - PORT_Atmel_UC3A0 - * - PORT_ARM_CortexM - * - PORT_Renesas_RX600 - * - PORT_Microchip_dsPIC_AND_PIC24 - * - * We also provide several "unofficial" hardware-specific ports. There have - * been developed by external contributors, and have not yet been verified - * by Percepio AB. Let us know if you have problems getting these to work. - * - * Unofficial hardware specific ports provided are: - * - PORT_TEXAS_INSTRUMENTS_TMS570 - * - PORT_TEXAS_INSTRUMENTS_MSP430 - * - PORT_MICROCHIP_PIC32 - * - PORT_XILINX_PPC405 - * - PORT_XILINX_PPC440 - * - PORT_XILINX_MICROBLAZE - * - PORT_NXP_LPC210X - * - *****************************************************************************/ - -#define PORT_NOT_SET -1 - -/*** Officially supported hardware timer ports *******************************/ -#define PORT_HWIndependent 0 -#define PORT_Win32 1 -#define PORT_Atmel_AT91SAM7 2 -#define PORT_Atmel_UC3A0 3 -#define PORT_ARM_CortexM 4 -#define PORT_Renesas_RX600 5 -#define PORT_Microchip_dsPIC_AND_PIC24 6 - -/*** Unofficial ports, provided by external developers, not yet verified *****/ -#define PORT_TEXAS_INSTRUMENTS_TMS570 7 -#define PORT_TEXAS_INSTRUMENTS_MSP430 8 -#define PORT_MICROCHIP_PIC32 9 -#define PORT_XILINX_PPC405 10 -#define PORT_XILINX_PPC440 11 -#define PORT_XILINX_MICROBLAZE 12 -#define PORT_NXP_LPC210X 13 - -/*** Select your port here! **************************************************/ -#define SELECTED_PORT PORT_Win32 -/*****************************************************************************/ - -#if (SELECTED_PORT == PORT_NOT_SET) -#error "You need to define SELECTED_PORT here!" -#endif - -/******************************************************************************* - * IRQ_PRIORITY_ORDER - * - * Macro which should be defined as an integer of 0 or 1. - * - * This should be 0 if lower IRQ priority values implies higher priority - * levels, such as on ARM Cortex M. If the opposite scheme is used, i.e., - * if higher IRQ priority values means higher priority, this should be 1. - * - * This setting is not critical. It is used only to sort and colorize the - * interrupts in priority order, in case you record interrupts using - * the vTraceStoreISRBegin and vTraceStoreISREnd routines. - * - * We provide this setting for some hardware architectures below: - * - ARM Cortex M: 0 (lower IRQ priority values are more significant) - * - Atmel AT91SAM7x: 1 (higher IRQ priority values are more significant) - * - Atmel AVR32: 1 (higher IRQ priority values are more significant) - * - Renesas RX600: 1 (higher IRQ priority values are more significant) - * - Microchip PIC24: 0 (lower IRQ priority values are more significant) - * - Microchip dsPIC: 0 (lower IRQ priority values are more significant) - * - TI TMS570: 0 (lower IRQ priority values are more significant) - * - Freescale HCS08: 0 (lower IRQ priority values are more significant) - * - Freescale HCS12: 0 (lower IRQ priority values are more significant) - * - PowerPC 405: 0 (lower IRQ priority values are more significant) - * - PowerPC 440: 0 (lower IRQ priority values are more significant) - * - Freescale ColdFire: 1 (higher IRQ priority values are more significant) - * - NXP LPC210x: 0 (lower IRQ priority values are more significant) - * - MicroBlaze: 0 (lower IRQ priority values are more significant) - * - * If your chip is not on the above list, and you perhaps know this detail by - * heart, please inform us by e-mail to support@percepio.com. - * - ****************************************************************************** - * - * HWTC Macros - * - * These four HWTC macros provides a hardware isolation layer representing a - * generic hardware timer/counter used for driving the operating system tick, - * such as the SysTick feature of ARM Cortex M3/M4, or the PIT of the Atmel - * AT91SAM7X. - * - * HWTC_COUNT: The current value of the counter. This is expected to be reset - * a each tick interrupt. Thus, when the tick handler starts, the counter has - * already wrapped. - * - * HWTC_COUNT_DIRECTION: Should be one of: - * - DIRECTION_INCREMENTING - for hardware timer/counters of incrementing type - * such as the PIT on Atmel AT91SAM7X. - * When the counter value reach HWTC_PERIOD, it is reset to zero and the - * interrupt is signaled. - * - DIRECTION_DECREMENTING - for hardware timer/counters of decrementing type - * such as the SysTick on ARM Cortex M3/M4 chips. - * When the counter value reach 0, it is reset to HWTC_PERIOD and the - * interrupt is signaled. - * - * HWTC_PERIOD: The number of increments or decrements of HWTC_COUNT between - * two tick interrupts. This should preferably be mapped to the reload - * register of the hardware timer, to make it more portable between chips in the - * same family. The macro should in most cases be (reload register + 1). - * - * HWTC_DIVISOR: If the timer frequency is very high, like on the Cortex M chips - * (where the SysTick runs at the core clock frequency), the "differential - * timestamping" used in the recorder will more frequently insert extra XTS - * events to store the timestamps, which increases the event buffer usage. - * In such cases, to reduce the number of XTS events and thereby get longer - * traces, you use HWTC_DIVISOR to scale down the timestamps and frequency. - * Assuming a OS tick rate of 1 KHz, it is suggested to keep the effective timer - * frequency below 65 MHz to avoid an excessive amount of XTS events. Thus, a - * Cortex M chip running at 72 MHZ should use a HWTC_DIVISOR of 2, while a - * faster chip require a higher HWTC_DIVISOR value. - * - * The HWTC macros and vTracePortGetTimeStamp is the main porting issue - * or the trace recorder library. Typically you should not need to change - * the code of vTracePortGetTimeStamp if using the HWTC macros. - * - ******************************************************************************/ - -#if (SELECTED_PORT == PORT_Win32) - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (ulGetRunTimeCounterValue()) - #define HWTC_PERIOD 0 - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 1 // Please update according to your hardware... - -#elif (SELECTED_PORT == PORT_HWIndependent) - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT 0 - #define HWTC_PERIOD 1 - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 1 // Please update according to your hardware... - -#elif (SELECTED_PORT == PORT_Atmel_AT91SAM7) - - /* HWTC_PERIOD is hardcoded for AT91SAM7X256-EK Board (48 MHz) - A more generic solution is to get the period from pxPIT->PITC_PIMR */ - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (AT91C_BASE_PITC->PITC_PIIR & 0xFFFFF) - #define HWTC_PERIOD 2995 - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 1 // higher IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_Atmel_UC3A0) - - /* For Atmel AVR32 (AT32UC3A) */ - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT sysreg_read(AVR32_COUNT) - #define HWTC_PERIOD ( TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ ) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 1 // higher IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_ARM_CortexM) - - /* For all chips using ARM Cortex M cores */ - - #define HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING - #define HWTC_COUNT (*((uint32_t*)0xE000E018)) - #define HWTC_PERIOD ((*(uint32_t*)0xE000E014) + 1) - #define HWTC_DIVISOR 2 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_Renesas_RX600) - - #include "iodefine.h" - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (CMT0.CMCNT) - #define HWTC_PERIOD ((((TRACE_PERIPHERAL_CLOCK_HZ/TRACE_TICK_RATE_HZ)-1)/8)) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 1 // higher IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_Microchip_dsPIC_AND_PIC24) - - /* For Microchip PIC24 and dsPIC (16 bit) */ - - /* Note: The trace library was originally designed for 32-bit MCUs, and is slower - than intended on 16-bit MCUs. Storing an event on a PIC24 takes about 70 µs. - In comparison, 32-bit MCUs are often 10-20 times faster. If recording overhead - becomes a problem on PIC24, use the filters to exclude less interesting tasks - or system calls. */ - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (TMR1) - #define HWTC_PERIOD (PR1+1) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_NXP_LPC210X) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - /* Tested with LPC2106, but should work with most LPC21XX chips. */ - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT *((uint32_t *)0xE0004008 ) - #define HWTC_PERIOD ( TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ ) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_TEXAS_INSTRUMENTS_TMS570) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - #define RTIFRC0 *((uint32_t *)0xFFFFFC10) - #define RTICOMP0 *((uint32_t *)0xFFFFFC50) - #define RTIUDCP0 *((uint32_t *)0xFFFFFC54) - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (RTIFRC0 - (RTICOMP0 - RTIUDCP0)) - #define HWTC_PERIOD (RTIUDCP0) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_TEXAS_INSTRUMENTS_MSP430) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (TA0R) - #define HWTC_PERIOD TRACE_CPU_CLOCKS_PER_TICK - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 1 // higher IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_MICROCHIP_PIC32) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - #define HWTC_COUNT_DIRECTION DIRECTION_INCREMENTING - #define HWTC_COUNT (ReadTimer1()) /* Should be available in BSP */ - #define HWTC_PERIOD (ReadPeriod1()+1) /* Should be available in BSP */ - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_XILINX_PPC405) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - #define HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING - #define HWTC_COUNT mfspr( 0x3db) - #define HWTC_PERIOD ( TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ ) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_XILINX_PPC440) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - /* This should work with most PowerPC chips */ - - #define HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING - #define HWTC_COUNT mfspr( 0x016 ) - #define HWTC_PERIOD ( TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ ) - #define HWTC_DIVISOR 1 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT == PORT_XILINX_MICROBLAZE) - /* UNOFFICIAL PORT - NOT YET VERIFIED BY PERCEPIO */ - - /* This should work with most Microblaze configurations. - * It uses the AXI Timer 0 - the tick interrupt source. - * If an AXI Timer 0 peripheral is available on your hardware platform, no modifications are required. - */ - #include "xtmrctr_l.h" - - #define HWTC_COUNT_DIRECTION DIRECTION_DECREMENTING - #define HWTC_COUNT XTmrCtr_GetTimerCounterReg( XPAR_TMRCTR_0_BASEADDR, 0 ) - #define HWTC_PERIOD ( TRACE_CPU_CLOCK_HZ / TRACE_TICK_RATE_HZ ) - #define HWTC_DIVISOR 16 - - #define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant - -#elif (SELECTED_PORT != PORT_NOT_SET) - - #error "SELECTED_PORT had unsupported value!" - #define SELECTED_PORT PORT_NOT_SET - -#endif - -#if (SELECTED_PORT != PORT_NOT_SET) - - #ifndef HWTC_COUNT_DIRECTION - #error "HWTC_COUNT_DIRECTION is not set!" - #endif - - #ifndef HWTC_COUNT - #error "HWTC_COUNT is not set!" - #endif - - #ifndef HWTC_PERIOD - #error "HWTC_PERIOD is not set!" - #endif - - #ifndef HWTC_DIVISOR - #error "HWTC_DIVISOR is not set!" - #endif - - #ifndef IRQ_PRIORITY_ORDER - #error "IRQ_PRIORITY_ORDER is not set!" - #elif (IRQ_PRIORITY_ORDER != 0) && (IRQ_PRIORITY_ORDER != 1) - #error "IRQ_PRIORITY_ORDER has bad value!" - #endif - - #if (HWTC_DIVISOR < 1) - #error "HWTC_DIVISOR must be a non-zero positive value!" - #endif - -#endif -/******************************************************************************* - * vTraceConsoleMessage - * - * A wrapper for your system-specific console "printf" console output function. - * This needs to be correctly defined to see status reports from the trace - * status monitor task (this is defined in trcUser.c). - ******************************************************************************/ -#if (SELECTED_PORT == PORT_Atmel_AT91SAM7) -/* Port specific includes */ -#include "console.h" -#endif - -#define vTraceConsoleMessage(x) - -/******************************************************************************* - * vTracePortGetTimeStamp - * - * Returns the current time based on the HWTC macros which provide a hardware - * isolation layer towards the hardware timer/counter. - * - * The HWTC macros and vTracePortGetTimeStamp is the main porting issue - * or the trace recorder library. Typically you should not need to change - * the code of vTracePortGetTimeStamp if using the HWTC macros. - * - ******************************************************************************/ -void vTracePortGetTimeStamp(uint32_t *puiTimestamp); - -/******************************************************************************* - * vTracePortEnd - * - * This function is called when the recorder is stopped due to full buffer. - * Mainly intended to show a message in the console. - * This is used by the Win32 port to store the trace to a file. The file path is - * set using vTracePortSetFileName. - ******************************************************************************/ -void vTracePortEnd(void); - -#if (INCLUDE_SAVE_TO_FILE == 1) - -/******************************************************************************* - * vTracePortSetOutFile - * - * Sets the filename/path used in vTracePortSave. - * This is set in a separate function, since the Win32 port calls vTracePortSave - * in vTracePortEnd if WIN32_PORT_SAVE_WHEN_STOPPED is set. - ******************************************************************************/ -void vTracePortSetOutFile(char* path); - -/****************************************************************************** - * vTracePortSave - * - * Saves the trace to a file on a target-side file system. The path is set in a - * separate function, vTracePortSetOutFile, since the Win32 port may call - * vTracePortSave in vTracePortEnd, if using WIN32_PORT_SAVE_WHEN_STOPPED. - ******************************************************************************/ -void vTracePortSave(void); - -#else - -#define vTraceConsoleMessage(x) -#define vTracePortSetOutFile(path) -#define vTracePortSave(void) - -#endif - -#endif diff --git a/FreeRTOS/Demo/WIN32-MingW/main.c b/FreeRTOS/Demo/WIN32-MingW/main.c index 5a141dba0..551f2c37f 100644 --- a/FreeRTOS/Demo/WIN32-MingW/main.c +++ b/FreeRTOS/Demo/WIN32-MingW/main.c @@ -200,16 +200,20 @@ void vApplicationIdleHook( void ) function, because it is the responsibility of the idle task to clean up memory allocated by the kernel to any task that has since been deleted. */ - /* The trace can be stopped with any key press. */ - if( _kbhit() != pdFALSE ) - { - if( xTraceRunning == pdTRUE ) + /* Uncomment the following code to allow the trace to be stopped with any + key press. The code is commented out by default as the kbhit() function + interferes with the run time behaviour. */ + /* + if( _kbhit() != pdFALSE ) { - vTraceStop(); - prvSaveTraceFile(); - xTraceRunning = pdFALSE; + if( xTraceRunning == pdTRUE ) + { + vTraceStop(); + prvSaveTraceFile(); + xTraceRunning = pdFALSE; + } } - } + */ #if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1 ) { diff --git a/FreeRTOS/Demo/WIN32-MingW/main_blinky.c b/FreeRTOS/Demo/WIN32-MingW/main_blinky.c index d1606d3a3..3756021c9 100644 --- a/FreeRTOS/Demo/WIN32-MingW/main_blinky.c +++ b/FreeRTOS/Demo/WIN32-MingW/main_blinky.c @@ -69,21 +69,21 @@ * application. It is provided as a convenient development and demonstration * test bed only. This was tested using Windows XP on a dual core laptop. * - * Windows will not be running the FreeRTOS simulator threads continuously, so - * the timing information in the FreeRTOS+Trace logs have no meaningful units. - * See the documentation page for the Windows simulator for an explanation of + * Windows will not be running the FreeRTOS simulator threads continuously, so + * the timing information in the FreeRTOS+Trace logs have no meaningful units. + * See the documentation page for the Windows simulator for an explanation of * the slow timing: * http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT - * * NOTE 2: This project provides two demo applications. A simple blinky style * project, and a more comprehensive test and demo application. The - * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select - * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select + * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY * in main.c. This file implements the simply blinky style version. * * NOTE 3: This file only contains the source code that is specific to the - * basic demo. Generic functions, such FreeRTOS hook functions, are defined + * basic demo. Generic functions, such FreeRTOS hook functions, are defined * in main.c. ****************************************************************************** * @@ -94,9 +94,9 @@ * The queue send task is implemented by the prvQueueSendTask() function in * this file. prvQueueSendTask() sits in a loop that causes it to repeatedly * block for 200 (simulated as far as the scheduler is concerned, but in - * reality much longer - see notes above) milliseconds, before sending the - * value 100 to the queue that was created within main_blinky(). Once the - * value is sent, the task loops back around to block for another 200 + * reality much longer - see notes above) milliseconds, before sending the + * value 100 to the queue that was created within main_blinky(). Once the + * value is sent, the task loops back around to block for another 200 * (simulated) milliseconds. * * The Queue Receive Task: @@ -104,13 +104,13 @@ * in this file. prvQueueReceiveTask() sits in a loop where it repeatedly * blocks on attempts to read data from the queue that was created within * main_blinky(). When data is received, the task checks the value of the - * data, and if the value equals the expected 100, outputs a message. The - * 'block time' parameter passed to the queue receive function specifies that - * the task should be held in the Blocked state indefinitely to wait for data + * data, and if the value equals the expected 100, outputs a message. The + * 'block time' parameter passed to the queue receive function specifies that + * the task should be held in the Blocked state indefinitely to wait for data * to be available on the queue. The queue receive task will only leave the * Blocked state when the queue send task writes to the queue. As the queue - * send task writes to the queue every 200 (simulated - see notes above) - * milliseconds, the queue receive task leaves the Blocked state every 200 + * send task writes to the queue every 200 (simulated - see notes above) + * milliseconds, the queue receive task leaves the Blocked state every 200 * milliseconds, and therefore outputs a message every 200 milliseconds. */ @@ -191,7 +191,7 @@ static void prvQueueSendTask( void *pvParameters ) portTickType xNextWakeTime; const unsigned long ulValueToSend = 100UL; - /* Remove compiler warning in the case that configASSERT() is not + /* Remove compiler warning in the case that configASSERT() is not defined. */ ( void ) pvParameters; @@ -222,7 +222,7 @@ static void prvQueueReceiveTask( void *pvParameters ) { unsigned long ulReceivedValue; - /* Remove compiler warning in the case that configASSERT() is not + /* Remove compiler warning in the case that configASSERT() is not defined. */ ( void ) pvParameters; diff --git a/FreeRTOS/Demo/WIN32-MingW/main_full.c b/FreeRTOS/Demo/WIN32-MingW/main_full.c index 62c95bd8a..dcc496bf6 100644 --- a/FreeRTOS/Demo/WIN32-MingW/main_full.c +++ b/FreeRTOS/Demo/WIN32-MingW/main_full.c @@ -1,5 +1,5 @@ /* - FreeRTOS V8.0.0:rc1 - Copyright (C) 2014 Real Time Engineers Ltd. + FreeRTOS V8.0.0:rc1 - Copyright (C) 2014 Real Time Engineers Ltd. All rights reserved VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. @@ -70,27 +70,27 @@ * application. It is provided as a convenient development and demonstration * test bed only. This was tested using Windows XP on a dual core laptop. * - * Windows will not be running the FreeRTOS simulator threads continuously, so - * the timing information in the FreeRTOS+Trace logs have no meaningful units. - * See the documentation page for the Windows simulator for an explanation of + * Windows will not be running the FreeRTOS simulator threads continuously, so + * the timing information in the FreeRTOS+Trace logs have no meaningful units. + * See the documentation page for the Windows simulator for an explanation of * the slow timing: * http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT - * * NOTE 2: This project provides two demo applications. A simple blinky style * project, and a more comprehensive test and demo application. The - * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select - * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select + * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY * in main.c. This file implements the comprehensive test and demo version. * * NOTE 3: This file only contains the source code that is specific to the - * basic demo. Generic functions, such FreeRTOS hook functions, are defined in + * basic demo. Generic functions, such FreeRTOS hook functions, are defined in * main.c. ******************************************************************************* * - * main() creates all the demo application tasks, then starts the scheduler. - * The web documentation provides more details of the standard demo application - * tasks, which provide no particular functionality but do provide a good + * main() creates all the demo application tasks, then starts the scheduler. + * The web documentation provides more details of the standard demo application + * tasks, which provide no particular functionality but do provide a good * example of how to use the FreeRTOS API. * * In addition to the standard demo tasks, the following tasks and tests are @@ -141,7 +141,6 @@ #define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) #define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) #define mainFLASH_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) -#define mainuIP_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) #define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) #define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) #define mainFLOP_TASK_PRIORITY ( tskIDLE_PRIORITY ) @@ -152,7 +151,7 @@ /* Task function prototypes. */ static void prvCheckTask( void *pvParameters ); -/* A task that is created from the idle task to test the functionality of +/* A task that is created from the idle task to test the functionality of eTaskStateGet(). */ static void prvTestTask( void *pvParameters ); @@ -162,6 +161,18 @@ static void prvTestTask( void *pvParameters ); */ static void prvDemonstrateTaskStateAndHandleGetFunctions( void ); +/* + * Called from the idle task hook function to demonstrate the use of + * xTimerPendFunctionCall() as xTimerPendFunctionCall() is not demonstrated by + * any of the standard demo tasks. + */ +static void prvDemonstratePendingFunctionCall( void ); + +/* + * The function that is pended by prvDemonstratePendingFunctionCall(). + */ +static void prvPendedFunction( void *pvParameter1, uint32_t ulParameter2 ); + /* * A task to demonstrate the use of the xQueueSpacesAvailable() function. */ @@ -219,7 +230,7 @@ int main_full( void ) /* Start the scheduler itself. */ vTaskStartScheduler(); - /* Should never get here unless there was not enough heap space to create + /* Should never get here unless there was not enough heap space to create the idle and other system tasks. */ return 0; } @@ -259,9 +270,9 @@ const portTickType xCycleFrequency = 2500 / portTICK_RATE_MS; else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) { pcStatusMessage = "Error: IntMath"; - } + } else if( xAreGenericQueueTasksStillRunning() != pdTRUE ) - { + { pcStatusMessage = "Error: GenQueue"; } else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) @@ -309,7 +320,7 @@ const portTickType xCycleFrequency = 2500 / portTICK_RATE_MS; pcStatusMessage = "Error: Queue overwrite"; } - /* This is the only task that uses stdout so its ok to call printf() + /* This is the only task that uses stdout so its ok to call printf() directly. */ printf( ( char * ) "%s - %u\r\n", pcStatusMessage, ( unsigned int ) xTaskGetTickCount() ); fflush( stdout ); @@ -346,7 +357,7 @@ void *pvAllocated; direct use from application code, hence their prototypes are not in queue.h. */ extern void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned portBASE_TYPE uxQueueNumber ); extern unsigned portBASE_TYPE uxQueueGetQueueNumber( xQueueHandle pxQueue ); -extern unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ); +extern uint8_t ucQueueGetQueueType( xQueueHandle pxQueue ); extern void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle ); extern unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ); @@ -358,8 +369,12 @@ extern unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ); the standard demo tasks. */ prvDemonstrateTaskStateAndHandleGetFunctions(); + /* Demonstrate the use of xTimerPendFunctionCall(), which is not + demonstrated by any of the standard demo tasks. */ + prvDemonstratePendingFunctionCall(); + /* If xMutexToDelete has not already been deleted, then delete it now. - This is done purely to demonstrate the use of, and test, the + This is done purely to demonstrate the use of, and test, the vSemaphoreDelete() macro. Care must be taken not to delete a semaphore that has tasks blocked on it. */ if( xMutexToDelete != NULL ) @@ -378,7 +393,7 @@ extern unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ); xMutexToDelete = NULL; } - /* Exercise heap_4 a bit. The malloc failed hook will trap failed + /* Exercise heap_4 a bit. The malloc failed hook will trap failed allocations so there is no need to test here. */ pvAllocated = pvPortMalloc( ( rand() % 100 ) + 1 ); vPortFree( pvAllocated ); @@ -400,9 +415,44 @@ void vFullDemoTickHookFunction( void ) /* Call the periodic queue overwrite from ISR demo. */ vQueueOverwritePeriodicISRDemo(); - /* Write to a queue that is in use as part of the queue set demo to + /* Write to a queue that is in use as part of the queue set demo to demonstrate using queue sets from an ISR. */ vQueueSetAccessQueueSetFromISR(); + + /* Exercise event groups from interrupts. */ + vPeriodicEventGroupsProcessing(); +} +/*-----------------------------------------------------------*/ + +static void prvPendedFunction( void *pvParameter1, uint32_t ulParameter2 ) +{ +static uint32_t ulLastParameter1 = 1000UL, ulLastParameter2 = 0UL; +uint32_t ulParameter1; + + ulParameter1 = ( uint32_t ) pvParameter1; + + /* Ensure the parameters are as expected. */ + configASSERT( ulParameter1 == ( ulLastParameter1 + 1 ) ); + configASSERT( ulParameter2 == ( ulLastParameter2 + 1 ) ); + + /* Remember the parameters for the next time the function is called. */ + ulLastParameter1 = ulParameter1; + ulLastParameter2 = ulParameter2; +} +/*-----------------------------------------------------------*/ + +static void prvDemonstratePendingFunctionCall( void ) +{ +static uint32_t ulParameter1 = 1000UL, ulParameter2 = 0UL; +const TickType_t xDontBlock = 0; /* This is called from the idle task so must *not* attempt to block. */ + + /* prvPendedFunction() just expects the parameters to be incremented by one + each time it is called. */ + ulParameter1++; + ulParameter2++; + + /* Pend the function call, sending the parameters. */ + xTimerPendFunctionCall( prvPendedFunction, ( void * ) ulParameter1, ulParameter2, xDontBlock ); } /*-----------------------------------------------------------*/ @@ -414,7 +464,7 @@ char *pcTaskName; static portBASE_TYPE xPerformedOneShotTests = pdFALSE; xTaskHandle xTestTask; - /* Demonstrate the use of the xTimerGetTimerDaemonTaskHandle() and + /* Demonstrate the use of the xTimerGetTimerDaemonTaskHandle() and xTaskGetIdleTaskHandle() functions. Also try using the function that sets the task number. */ xIdleTaskHandle = xTaskGetIdleTaskHandle(); @@ -422,7 +472,7 @@ xTaskHandle xTestTask; vTaskSetTaskNumber( xIdleTaskHandle, ( unsigned long ) ucConstTaskNumber ); configASSERT( uxTaskGetTaskNumber( xIdleTaskHandle ) == ucConstTaskNumber ); - /* This is the idle hook, so the current task handle should equal the + /* This is the idle hook, so the current task handle should equal the returned idle task handle. */ if( xTaskGetCurrentTaskHandle() != xIdleTaskHandle ) { @@ -431,7 +481,7 @@ xTaskHandle xTestTask; /* Check the timer task handle was returned correctly. */ pcTaskName = pcTaskGetTaskName( xTimerTaskHandle ); - if( strcmp( ( char * ) pcTaskName, "Tmr Svc" ) != 0 ) + if( strcmp( pcTaskName, "Tmr Svc" ) != 0 ) { pcStatusMessage = "Error: Returned timer task handle was incorrect"; } @@ -503,7 +553,7 @@ unsigned portBASE_TYPE uxReturn, x; { /* Ask how many messages are available... */ uxReturn = uxQueueMessagesWaiting( xQueue ); - + /* Check the number of messages being reported as being available is as expected, and force an assert if not. */ if( uxReturn != x ) @@ -515,7 +565,7 @@ unsigned portBASE_TYPE uxReturn, x; /* Ask how many spaces remain in the queue... */ uxReturn = uxQueueSpacesAvailable( xQueue ); - + /* Check the number of spaces being reported as being available is as expected, and force an assert if not. */ if( uxReturn != ( uxQueueLength - x ) ) @@ -537,7 +587,7 @@ unsigned portBASE_TYPE uxReturn, x; } uxReturn = uxQueueSpacesAvailable( xQueue ); - + if( uxReturn != 0 ) { configASSERT( xQueue == NULL ); -- 2.39.2