|
|
|
/*
|
|
|
|
FreeRTOS V6.0.5 - 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 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.
|
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* NOTE 1: The CPU must be in Supervisor mode when the scheduler is started.
|
|
|
|
* The PowerON_Reset_PC() supplied in resetprg.c with this demo has
|
|
|
|
* Change_PSW_PM_to_UserMode() commented out to ensure this is the case.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Hardware specific includes. */
|
|
|
|
#include "iodefine.h"
|
|
|
|
#include "rskrx62ndef.h"
|
|
|
|
|
|
|
|
/* Kernel includes. */
|
|
|
|
#include "FreeRTOS.h"
|
|
|
|
#include "task.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* vApplicationMallocFailedHook() will only be called if
|
|
|
|
* configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook
|
|
|
|
* function that will execute if a call to pvPortMalloc() fails.
|
|
|
|
* pvPortMalloc() is called internally by the kernel whenever a task, queue or
|
|
|
|
* semaphore is created. It is also called by various parts of the demo
|
|
|
|
* application.
|
|
|
|
*/
|
|
|
|
void vApplicationMallocFailedHook( void );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set to 1
|
|
|
|
* in FreeRTOSConfig.h. It is a hook function that is called on each iteration
|
|
|
|
* of the idle task. It is essential that code added to this hook function
|
|
|
|
* never attempts to block in any way (for example, call xQueueReceive() with
|
|
|
|
* a block time specified). If the application makes use of the vTaskDelete()
|
|
|
|
* API function (as this demo application does) then it is also important that
|
|
|
|
* vApplicationIdleHook() is permitted to return to its calling 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.
|
|
|
|
*/
|
|
|
|
void vApplicationIdleHook( void );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* vApplicationStackOverflowHook() will only be called if
|
|
|
|
* configCHECK_FOR_STACK_OVERFLOW is set to a non-zero value. The handle and
|
|
|
|
* name of the offending task should be passed in the function parameters, but
|
|
|
|
* it is possible that the stack overflow will have corrupted these - in which
|
|
|
|
* case pxCurrentTCB can be inspected to find the same information.
|
|
|
|
*/
|
|
|
|
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The reg test tasks as described at the top of this file.
|
|
|
|
*/
|
|
|
|
void vRegTest1Task( void *pvParameters );
|
|
|
|
void vRegTest2Task( void *pvParameters );
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
void main(void)
|
|
|
|
{
|
|
|
|
extern void HardwareSetup( void );
|
|
|
|
|
|
|
|
/* Renesas provided CPU configuration routine. The clocks are configured in
|
|
|
|
here. */
|
|
|
|
HardwareSetup();
|
|
|
|
|
|
|
|
/* Start the reg test tasks which test the context switching mechanism. */
|
|
|
|
xTaskCreate( vRegTest1Task, "RegTst1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
|
|
|
|
xTaskCreate( vRegTest2Task, "RegTst2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
|
|
|
|
|
|
|
|
/* Start the tasks running. */
|
|
|
|
vTaskStartScheduler();
|
|
|
|
|
|
|
|
/* If all is well we will never reach here as the scheduler will now be
|
|
|
|
running. If we do reach here then it is likely that there was insufficient
|
|
|
|
heap available for the idle task to be created. */
|
|
|
|
for( ;; );
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
void vApplicationSetupTimerInterrupt( void )
|
|
|
|
{
|
|
|
|
/* Cascade two 8bit timer channels to generate the tick interrupt. */
|
|
|
|
|
|
|
|
/* Enable the timer. */
|
|
|
|
SYSTEM.MSTPCRA.BIT.MSTPA5 = 0;
|
|
|
|
|
|
|
|
/* Enable compare match A interrupt request. */
|
|
|
|
TMR0.TCR.BIT.CMIEA = 1;
|
|
|
|
|
|
|
|
/* Clear the timer on compare match A. */
|
|
|
|
TMR0.TCR.BIT.CCLR = 1;
|
|
|
|
|
|
|
|
/* Set the compare match value. */
|
|
|
|
TMR01.TCORA = ( unsigned short ) ( ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) -1 ) / 8 );
|
|
|
|
|
|
|
|
/* 16 bit operation (count from timer 1). */
|
|
|
|
TMR0.TCCR.BIT.CSS = 3;
|
|
|
|
|
|
|
|
/* Use PCLK as the input. */
|
|
|
|
TMR1.TCCR.BIT.CSS = 1;
|
|
|
|
|
|
|
|
/* Divide PCLK by 8. */
|
|
|
|
TMR1.TCCR.BIT.CKS = 2;
|
|
|
|
|
|
|
|
/* Enable TMR 0 */
|
|
|
|
ICU.IER[15].BIT.IEN6 = 1;
|
|
|
|
|
|
|
|
/* Ensure the timer interrupt is using the configured kernel priority. */
|
|
|
|
ICU.IPR[68].BIT.IPR = configKERNEL_INTERRUPT_PRIORITY;
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
/* This function is explained by the comments above its prototype at the top
|
|
|
|
of this file. */
|
|
|
|
void vApplicationMallocFailedHook( void )
|
|
|
|
{
|
|
|
|
for( ;; );
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
/* This function is explained by the comments above its prototype at the top
|
|
|
|
of this file. */
|
|
|
|
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )
|
|
|
|
{
|
|
|
|
for( ;; );
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
/* This function is explained by the comments above its prototype at the top
|
|
|
|
of this file. */
|
|
|
|
void vApplicationIdleHook( void )
|
|
|
|
{
|
|
|
|
taskENTER_CRITICAL();
|
|
|
|
taskEXIT_CRITICAL();
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
void vRegTest1Task( void *pvParameters )
|
|
|
|
{
|
|
|
|
volatile unsigned long ul = 0;
|
|
|
|
|
|
|
|
for( ;; )
|
|
|
|
{
|
|
|
|
ul += 2;
|
|
|
|
ul -= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
|
|
|
|
void vRegTest2Task( void *pvParameters )
|
|
|
|
{
|
|
|
|
volatile unsigned long ul = 0;
|
|
|
|
|
|
|
|
for( ;; )
|
|
|
|
{
|
|
|
|
ul += 4;
|
|
|
|
ul -= 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|