This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
FreeRTOS-Kernel/Demo/PIC18_MPLAB/main2.c

183 lines
7.3 KiB
C
Raw Normal View History

2006-05-02 17:39:15 +08:00
/*
2010-01-09 22:48:45 +08:00
FreeRTOS V6.0.2 - Copyright (C) 2010 Real Time Engineers Ltd.
2006-05-02 17:39:15 +08:00
2009-10-13 19:05:41 +08:00
***************************************************************************
* *
* 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 eBook *
* *
* "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.
2006-05-02 17:39:15 +08:00
2009-10-13 19:05:41 +08:00
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
2009-10-13 19:05:41 +08:00
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.
2009-10-13 19:05:41 +08:00
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
2009-10-13 19:05:41 +08:00
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.
2009-03-15 03:20:12 +08:00
1 tab == 4 spaces!
2007-04-02 04:47:49 +08:00
http://www.FreeRTOS.org - Documentation, latest information, license and
contact details.
2008-02-04 03:45:58 +08:00
http://www.SafeRTOS.com - A version that is certified for use in safety
critical systems.
2008-02-04 03:45:58 +08:00
http://www.OpenRTOS.com - Commercial support, development, porting,
licensing and training services.
2006-05-02 17:39:15 +08:00
*/
/*
* Instead of the normal single demo application, the PIC18F demo is split
* into several smaller programs of which this is the second. This enables the
* demo's to be executed on the RAM limited 40 pin devices. The 64 and 80 pin
* devices require a more costly development platform and are not so readily
* available.
*
* The RTOSDemo2 project is configured for a PIC18F452 device. Main2.c starts
* 5 tasks (including the idle task).
*
* The first, second and third tasks do nothing but flash an LED. This gives
* visual feedback that everything is executing as expected. One task flashes
* an LED every 333ms (i.e. on and off every 333/2 ms), then next every 666ms
* and the last every 999ms.
*
* The last task runs at the idle priority. It repeatedly performs a 32bit
* calculation and checks it's result against the expected value. This checks
* that the temporary storage utilised by the compiler to hold intermediate
* results does not get corrupted when the task gets switched in and out.
* should the calculation ever provide an incorrect result the final LED is
* turned on.
*
* On entry to main() an 'X' is transmitted. Monitoring the serial port using a
* dumb terminal allows for verification that the device is not continuously
* being reset (no more than one 'X' should be transmitted).
*
* http://www.FreeRTOS.org contains important information on the use of the
* PIC18F port.
*/
/*
Changes from V2.0.0
+ Delay periods are now specified using variables and constants of
portTickType rather than unsigned long.
2006-05-02 17:39:15 +08:00
*/
/* Scheduler include files. */
#include "FreeRTOS.h"
#include "task.h"
/* Demo app include files. */
#include "flash.h"
#include "partest.h"
#include "serial.h"
/* Priority definitions for the LED tasks. Other tasks just use the idle
priority. */
#define mainLED_FLASH_PRIORITY ( tskIDLE_PRIORITY + ( unsigned portBASE_TYPE ) 1 )
/* The LED that is lit when should the calculation fail. */
#define mainCHECK_TASK_LED ( ( unsigned portBASE_TYPE ) 3 )
/* Constants required for the communications. Only one character is ever
transmitted. */
#define mainCOMMS_QUEUE_LENGTH ( ( unsigned portBASE_TYPE ) 5 )
#define mainNO_BLOCK ( ( portTickType ) 0 )
#define mainBAUD_RATE ( ( unsigned long ) 9600 )
2006-05-02 17:39:15 +08:00
/*
* The task that performs the 32 bit calculation at the idle priority.
*/
static void vCalculationTask( void *pvParameters );
/*-----------------------------------------------------------*/
/* Creates the tasks, then starts the scheduler. */
void main( void )
{
/* Initialise the required hardware. */
vParTestInitialise();
vPortInitialiseBlocks();
/* Send a character so we have some visible feedback of a reset. */
xSerialPortInitMinimal( mainBAUD_RATE, mainCOMMS_QUEUE_LENGTH );
xSerialPutChar( NULL, 'X', mainNO_BLOCK );
/* Start the standard LED flash tasks as defined in demo/common/minimal. */
vStartLEDFlashTasks( mainLED_FLASH_PRIORITY );
/* Start the check task defined in this file. */
xTaskCreate( vCalculationTask, ( const char * const ) "Check", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
2006-05-02 17:39:15 +08:00
/* Start the scheduler. */
vTaskStartScheduler();
}
/*-----------------------------------------------------------*/
static void vCalculationTask( void *pvParameters )
{
volatile unsigned long ulCalculatedValue; /* Volatile to ensure optimisation is minimal. */
/* Continuously perform a calculation. If the calculation result is ever
incorrect turn the LED on. */
for( ;; )
{
/* A good optimising compiler would just remove all this! */
ulCalculatedValue = 1234UL;
ulCalculatedValue *= 99UL;
if( ulCalculatedValue != 122166UL )
{
vParTestSetLED( mainCHECK_TASK_LED, pdTRUE );
}
ulCalculatedValue *= 9876UL;
if( ulCalculatedValue != 1206511416UL )
{
vParTestSetLED( mainCHECK_TASK_LED, pdTRUE );
}
ulCalculatedValue /= 15UL;
if( ulCalculatedValue != 80434094UL )
{
vParTestSetLED( mainCHECK_TASK_LED, pdTRUE );
}
ulCalculatedValue += 918273UL;
if( ulCalculatedValue != 81352367UL )
{
vParTestSetLED( mainCHECK_TASK_LED, pdTRUE );
}
}
}
/*-----------------------------------------------------------*/