From: richardbarry Date: Sun, 17 Mar 2013 12:12:20 +0000 (+0000) Subject: Complete RL78/G14 demo. X-Git-Tag: V7.4.1~35 X-Git-Url: https://git.sur5r.net/?p=freertos;a=commitdiff_plain;h=204a2b4e1d405fadd69231b51b72a57e34128540 Complete RL78/G14 demo. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1840 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOSConfig.h b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOSConfig.h index e89a91b7c..79752de04 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOSConfig.h +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOSConfig.h @@ -122,12 +122,12 @@ to exclude the API function. */ #define INCLUDE_vTaskDelete 0 #define INCLUDE_vTaskCleanUpResources 0 #define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 #define INCLUDE_xTaskGetIdleTaskHandle 0 #define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 -#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled() +#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } #endif /* FREERTOS_CONFIG_H */ diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/port.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/port.c index 41cace60c..2d87b9aaf 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/port.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/FreeRTOS_Source/portable/GCC/RL78/port.c @@ -144,7 +144,7 @@ unsigned long *pulLocal; /* Write in the parameter value. */ pulLocal = ( unsigned long * ) pxTopOfStack; - *pulLocal = ( unsigned long ) pvParameters; + *pulLocal = ( portSTACK_TYPE ) pvParameters; pxTopOfStack--; /* These values are just spacers. The return address of the function diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/hardware_setup.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/hardware_setup.c index 211185831..05fee28d5 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/hardware_setup.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/hardware_setup.c @@ -19,8 +19,6 @@ void HardwareSetup( void ) { -unsigned char ucResetFlag = RESF; - portDISABLE_INTERRUPTS(); /* Set fMX */ diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c index cfea1f084..aedbc70cd 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main.c @@ -72,289 +72,67 @@ mission critical applications that require provable dependability. */ -/* +/****************************************************************************** + * 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 (defined in this file) is used to + * select between the two. The simply blinky demo is implemented and described + * in main_blinky.c. The more comprehensive test and demo application is + * implemented and described in main_full.c. + * + * This file implements the code that is not demo specific, including the + * hardware setup and FreeRTOS hook functions. + * * * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT! * - * - * main() creates the demo application tasks and timers, then starts the - * scheduler. - * - * This demo is configured to run on the RL78/G13 Promotion Board, which is - * fitted with a R5F100LEA microcontroller. The R5F100LEA contains a little - * under 4K bytes of usable internal RAM. The RAM size restricts the number of - * demo tasks that can be created, and the demo creates 13 tasks, 4 queues and - * two timers. The RL78 range does however include parts with up to 32K bytes - * of RAM (at the time of writing). Using FreeRTOS on such a part will allow an - * application to make a more comprehensive use of FreeRTOS tasks, and other - * FreeRTOS features. - * - * In addition to the standard demo tasks, the following tasks, tests and timers - * are created within this file: - * - * "Reg test" tasks - These fill the registers with known values, then check - * that each register still contains its expected value. Each task uses a - * different set of values. The reg test tasks execute with a very low priority, - * so get preempted very frequently. A register containing an unexpected value - * is indicative of an error in the context switching mechanism. - * - * The "Demo" Timer and Callback Function: - * The demo timer callback function does nothing more than increment a variable. - * The period of the demo timer is set relative to the period of the check timer - * (described below). This allows the check timer to know how many times the - * demo timer callback function should execute between each execution of the - * check timer callback function. The variable incremented in the demo timer - * callback function is used to determine how many times the callback function - * has executed. - * - * The "Check" Timer and Callback Function: - * The check timer period is initially set to three seconds. The check timer - * callback function checks that all the standard demo tasks, the reg test tasks, - * and the demo timer are not only still executing, but are executing without - * reporting any errors. If the check timer discovers that a task or timer has - * stalled, or reported an error, then it changes its own period from the - * initial three seconds, to just 200ms. The check timer callback function also - * toggles the user LED each time it is called. This provides a visual - * indication of the system status: If the LED toggles every three seconds, - * then no issues have been discovered. If the LED toggles every 200ms, then an - * issue has been discovered with at least one task. - * */ /* Scheduler include files. */ #include "FreeRTOS.h" #include "task.h" -#include "timers.h" - -/* Standard demo includes. */ -#include "dynamic.h" -#include "PollQ.h" -#include "blocktim.h" - -/* Hardware includes. */ -#include "port_iodefine.h" -#include "port_iodefine_ext.h" -#include "LED.h" -/* The period at which the check timer will expire, in ms, provided no errors -have been reported by any of the standard demo tasks. ms are converted to the -equivalent in ticks using the portTICK_RATE_MS constant. */ -#define mainCHECK_TIMER_PERIOD_MS ( 3000UL / portTICK_RATE_MS ) - -/* The period at which the check timer will expire, in ms, if an error has been -reported in one of the standard demo tasks, the check tasks, or the demo timer. -ms are converted to the equivalent in ticks using the portTICK_RATE_MS -constant. */ -#define mainERROR_CHECK_TIMER_PERIOD_MS ( 200UL / portTICK_RATE_MS ) - -/* These two definitions are used to set the period of the demo timer. The demo -timer period is always relative to the check timer period, so the check timer -can determine if the demo timer has expired the expected number of times between -its own executions. */ -#define mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT ( 100UL ) -#define mainDEMO_TIMER_PERIOD_MS ( mainCHECK_TIMER_PERIOD_MS / mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT ) - -/* A block time of zero simple means "don't block". */ -#define mainDONT_BLOCK ( 0U ) - -/* Values that are passed as parameters into the reg test tasks (purely to -ensure task parameters are passed correctly). */ -#define mainREG_TEST_1_PARAMETER ( ( void * ) 0x1234 ) -#define mainREG_TEST_2_PARAMETER ( ( void * ) 0x5678 ) +/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo, +or 0 to run the more comprehensive test and demo application. */ +#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 0 /*-----------------------------------------------------------*/ /* - * The 'check' timer callback function, as described at the top of this file. - */ -static void prvCheckTimerCallback( xTimerHandle xTimer ); - -/* - * The 'demo' timer callback function, as described at the top of this file. - */ -static void prvDemoTimerCallback( xTimerHandle xTimer ); - -/* - * Functions that define the RegTest tasks, as described at the top of this - * file. The RegTest tasks are written (necessarily) in assembler. Their - * entry points are written in C to allow for easy checking of the task - * parameter values. + * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1. + * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0. */ -extern void vRegTest1Task( void ); -extern void vRegTest2Task( void ); -static void prvRegTest1Entry( void *pvParameters ); -static void prvRegTest2Entry( void *pvParameters ); +extern void main_blinky( void ); +extern void main_full( void ); -/* - * Called if a RegTest task discovers an error as a mechanism to stop the - * tasks loop counter incrementing (so the check task can detect that an - * error exists). - */ -void vRegTestError( void ); +/* Prototypes for the standard FreeRTOS callback/hook functions implemented +within this file. */ +void vApplicationMallocFailedHook( void ); +void vApplicationIdleHook( void ); +void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName ); +void vApplicationTickHook( void ); /*-----------------------------------------------------------*/ -/* Variables that are incremented on each cycle of the two reg tests to allow -the check timer to know that they are still executing. */ -unsigned short usRegTest1LoopCounter = 0, usRegTest2LoopCounter; - -/* The check timer. This uses prvCheckTimerCallback() as its callback -function. */ -static xTimerHandle xCheckTimer = NULL; - -/* The demo timer. This uses prvDemoTimerCallback() as its callback function. */ -static xTimerHandle xDemoTimer = NULL; - -/* This variable is incremented each time the demo timer expires. */ -static volatile unsigned long ulDemoSoftwareTimerCounter = 0UL; - -/*-----------------------------------------------------------*/ - -short main( void ) +int main( void ) { - /* Creates all the tasks and timers, then starts the scheduler. */ - - /* First create the 'standard demo' tasks. These are used to demonstrate - API functions being used and also to test the kernel port. More information - is provided on the FreeRTOS.org WEB site. */ - vStartDynamicPriorityTasks(); - vStartPolledQueueTasks( tskIDLE_PRIORITY ); - vCreateBlockTimeTasks(); - - /* Create the RegTest tasks as described at the top of this file. */ - xTaskCreate( prvRegTest1Entry, "Reg1", configMINIMAL_STACK_SIZE, mainREG_TEST_1_PARAMETER, tskIDLE_PRIORITY, NULL ); - xTaskCreate( prvRegTest2Entry, "Reg2", configMINIMAL_STACK_SIZE, mainREG_TEST_2_PARAMETER, tskIDLE_PRIORITY, NULL ); - - /* Create the software timer that performs the 'check' functionality, - as described at the top of this file. */ - xCheckTimer = xTimerCreate( ( const signed char * ) "CheckTimer",/* A text name, purely to help debugging. */ - ( mainCHECK_TIMER_PERIOD_MS ), /* The timer period, in this case 3000ms (3s). */ - pdTRUE, /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */ - ( void * ) 0, /* The ID is not used, so can be set to anything. */ - prvCheckTimerCallback /* The callback function that inspects the status of all the other tasks. */ - ); - - /* Create the software timer that just increments a variable for demo - purposes. */ - xDemoTimer = xTimerCreate( ( const signed char * ) "DemoTimer",/* A text name, purely to help debugging. */ - ( mainDEMO_TIMER_PERIOD_MS ), /* The timer period, in this case it is always calculated relative to the check timer period (see the definition of mainDEMO_TIMER_PERIOD_MS). */ - pdTRUE, /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */ - ( void * ) 0, /* The ID is not used, so can be set to anything. */ - prvDemoTimerCallback /* The callback function that inspects the status of all the other tasks. */ - ); - - /* Start both the check timer and the demo timer. The timers won't actually - start until the scheduler is started. */ - xTimerStart( xCheckTimer, mainDONT_BLOCK ); - xTimerStart( xDemoTimer, mainDONT_BLOCK ); - - /* Finally start the scheduler running. */ - vTaskStartScheduler(); - - /* If all is well execution will never reach here as the scheduler will be - running. If this null loop is reached then it is likely there was - insufficient FreeRTOS heap available for the idle task and/or timer task to - be created. See http://www.freertos.org/a00111.html. */ - for( ;; ); -} -/*-----------------------------------------------------------*/ - -static void prvDemoTimerCallback( xTimerHandle xTimer ) -{ - /* The demo timer has expired. All it does is increment a variable. The - period of the demo timer is relative to that of the check timer, so the - check timer knows how many times this variable should have been incremented - between each execution of the check timer's own callback. */ - ulDemoSoftwareTimerCounter++; -} -/*-----------------------------------------------------------*/ - -static void prvCheckTimerCallback( xTimerHandle xTimer ) -{ -static portBASE_TYPE xChangedTimerPeriodAlready = pdFALSE, xErrorStatus = pdPASS; -static unsigned short usLastRegTest1Counter = 0, usLastRegTest2Counter = 0; - - /* Inspect the status of the standard demo tasks. */ - if( xAreDynamicPriorityTasksStillRunning() != pdTRUE ) + /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top + of this file. */ + #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 { - xErrorStatus = pdFAIL; + main_blinky(); } - - if( xArePollingQueuesStillRunning() != pdTRUE ) - { - xErrorStatus = pdFAIL; - } - - if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) - { - xErrorStatus = pdFAIL; - } - - /* Indicate an error if either of the reg test loop counters have not - incremented since the last time this function was called. */ - if( usLastRegTest1Counter == usRegTest1LoopCounter ) - { - xErrorStatus = pdFAIL; - } - else - { - usLastRegTest1Counter = usRegTest1LoopCounter; - } - - if( usLastRegTest2Counter == usRegTest2LoopCounter ) + #else { - xErrorStatus = pdFAIL; - } - else - { - usLastRegTest2Counter = usRegTest2LoopCounter; - } - - /* Ensure that the demo software timer has expired - mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT times in between - each call of this function. A critical section is not required to access - ulDemoSoftwareTimerCounter as the variable is only accessed from another - software timer callback, and only one software timer callback can be - executing at any time. */ - if( ( ulDemoSoftwareTimerCounter < ( mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT - 1 ) ) || - ( ulDemoSoftwareTimerCounter > ( mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT + 1 ) ) - ) - { - xErrorStatus = pdFAIL; - } - else - { - ulDemoSoftwareTimerCounter = 0UL; - } - - if( ( xErrorStatus == pdFAIL ) && ( xChangedTimerPeriodAlready == pdFALSE ) ) - { - /* An error has occurred, but the timer's period has not yet been changed, - change it now, and remember that it has been changed. Shortening the - timer's period means the LED will toggle at a faster rate, giving a - visible indication that something has gone wrong. */ - xChangedTimerPeriodAlready = pdTRUE; - - /* This call to xTimerChangePeriod() uses a zero block time. Functions - called from inside of a timer callback function must *never* attempt to - block. */ - xTimerChangePeriod( xCheckTimer, ( mainERROR_CHECK_TIMER_PERIOD_MS ), mainDONT_BLOCK ); + main_full(); } + #endif - /* Toggle the LED. The toggle rate will depend on whether or not an error - has been found in any tasks. */ - LED_BIT = !LED_BIT; -} -/*-----------------------------------------------------------*/ - -void vRegTestError( void ) -{ - /* Called by both reg test tasks if an error is found. There is no way out - of this function so the loop counter of the calling task will stop - incrementing, which will result in the check timer signaling an error. */ - for( ;; ); + /* Should not get here. See the definitions of main_blinky() and + main_full(). */ + return 0; } /*-----------------------------------------------------------*/ @@ -395,50 +173,16 @@ volatile size_t xFreeHeapSpace; configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up RAM. */ xFreeHeapSpace = xPortGetFreeHeapSize(); -} -/*-----------------------------------------------------------*/ -static void prvRegTest1Entry( void *pvParameters ) -{ - /* If the parameter has its expected value then start the first reg test - task (this is only done to test that the RTOS port is correctly handling - task parameters. */ - if( pvParameters == mainREG_TEST_1_PARAMETER ) - { - vRegTest1Task(); - } - else - { - vRegTestError(); - } - - /* It is not possible to get here as neither of the two functions called - above will ever return. */ -} -/*-----------------------------------------------------------*/ - -static void prvRegTest2Entry( void *pvParameters ) -{ - /* If the parameter has its expected value then start the first reg test - task (this is only done to test that the RTOS port is correctly handling - task parameters. */ - if( pvParameters == mainREG_TEST_2_PARAMETER ) - { - vRegTest2Task(); - } - else - { - vRegTestError(); - } - - /* It is not possible to get here as neither of the two functions called - above will ever return. */ + /* Remove compiler warning about xFreeHeapSpace being set but never used. */ + ( void ) xFreeHeapSpace; } /*-----------------------------------------------------------*/ void vAssertCalled( void ) { volatile unsigned long ul = 0; + taskENTER_CRITICAL(); { /* Set ul to a non-zero value using the debugger to step out of this diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c new file mode 100644 index 000000000..14e000103 --- /dev/null +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_blinky.c @@ -0,0 +1,241 @@ +/* + FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. + + FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT + http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and 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 modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. 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 itcan be + viewed here: http://www.freertos.org/a00114.html and also obtained by + writing to Real Time Engineers Ltd., contact details for whom are available + on the FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, and our new + fully thread aware and reentrant UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems, who sell the code with commercial support, + indemnification and middleware, under the OpenRTOS brand. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. +*/ + +/****************************************************************************** + * NOTE 1: This project provides two demo applications. A simple blinky style + * project, and a more comprehensive test and demo application. The + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select + * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY + * in main.c. This file implements the simply blinky style version. + * + * NOTE 2: This file only contains the source code that is specific to the + * basic demo. Generic functions, such FreeRTOS hook functions, and functions + * required to configure the hardware, are defined in main.c. + ****************************************************************************** + * + * main_blinky() creates one queue, and two tasks. It then starts the + * scheduler. + * + * The Queue Send Task: + * The queue send task is implemented by the prvQueueSendTask() function in + * this file. prvQueueSendTask() sits in a loop that causes it to repeatedly + * block for 200 milliseconds, before sending the value 100 to the queue that + * was created within main_blinky(). Once the value is sent, the task loops + * back around to block for another 200 milliseconds. + * + * The Queue Receive Task: + * The queue receive task is implemented by the prvQueueReceiveTask() function + * in this file. prvQueueReceiveTask() sits in a loop where it repeatedly + * blocks on attempts to read data from the queue that was created within + * main_blinky(). When data is received, the task checks the value of the + * data, and if the value equals the expected 100, toggles the LED. The 'block + * time' parameter passed to the queue receive function specifies that the + * task should be held in the Blocked state indefinitely to wait for data to + * be available on the queue. The queue receive task will only leave the + * Blocked state when the queue send task writes to the queue. As the queue + * send task writes to the queue every 200 milliseconds, the queue receive + * task leaves the Blocked state every 200 milliseconds, and therefore toggles + * the LED every 200 milliseconds. + */ + +/* Standard includes. */ +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Eval board specific definitions. */ +#include "port_iodefine.h" +#include "port_iodefine_ext.h" +#include "LED.h" + +/* Priorities at which the tasks are created. */ +#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The rate at which data is sent to the queue. The 200ms value is converted +to ticks using the portTICK_RATE_MS constant. */ +#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_RATE_MS ) + +/* The number of items the queue can hold. This is 1 as the receive task +will remove items as they are added, meaning the send task should always find +the queue empty. */ +#define mainQUEUE_LENGTH ( 1 ) + + +/*-----------------------------------------------------------*/ + +/* + * The tasks as described in the comments at the top of this file. + */ +static void prvQueueReceiveTask( void *pvParameters ); +static void prvQueueSendTask( void *pvParameters ); + +/* + * Called by main() to create the simply blinky style application if + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1. + */ +void main_blinky( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used by both tasks. */ +static xQueueHandle xQueue = NULL; + +/*-----------------------------------------------------------*/ + +void main_blinky( void ) +{ + /* Create the queue. */ + xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) ); + + if( xQueue != NULL ) + { + /* Start the two tasks as described in the comments at the top of this + file. */ + xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */ + ( signed char * ) "Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */ + configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ + NULL, /* The parameter passed to the task - not used in this case. */ + mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */ + NULL ); /* The task handle is not required, so NULL is passed. */ + + xTaskCreate( prvQueueSendTask, ( signed char * ) "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL ); + + /* Start the tasks and timer running. */ + vTaskStartScheduler(); + } + + /* If all is well, the scheduler will now be running, and the following + line will never be reached. If the following line does execute, then + there was insufficient FreeRTOS heap memory available for the idle and/or + timer tasks to be created. See the memory management section on the + FreeRTOS web site for more details. http://www.freertos.org/a00111.html. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvQueueSendTask( void *pvParameters ) +{ +portTickType xNextWakeTime; +const unsigned long ulValueToSend = 100UL; + + /* Remove compiler warning about unused parameter. */ + ( void ) pvParameters; + + /* Initialise xNextWakeTime - this only needs to be done once. */ + xNextWakeTime = xTaskGetTickCount(); + + for( ;; ) + { + /* Place this task in the blocked state until it is time to run again. */ + vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS ); + + /* Send to the queue - causing the queue receive task to unblock and + toggle the LED. 0 is used as the block time so the sending operation + will not block - it shouldn't need to block as the queue should always + be empty at this point in the code. */ + xQueueSend( xQueue, &ulValueToSend, 0U ); + } +} +/*-----------------------------------------------------------*/ + +static void prvQueueReceiveTask( void *pvParameters ) +{ +unsigned long ulReceivedValue; +const unsigned long ulExpectedValue = 100UL; + + /* Remove compiler warning about unused parameter. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Wait until something arrives in the queue - this task will block + indefinitely provided INCLUDE_vTaskSuspend is set to 1 in + FreeRTOSConfig.h. */ + xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY ); + + /* To get here something must have been received from the queue, but + is it the expected value? If it is, toggle the LED. */ + if( ulReceivedValue == ulExpectedValue ) + { + LED_BIT = !LED_BIT; + ulReceivedValue = 0U; + } + } +} +/*-----------------------------------------------------------*/ + diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c new file mode 100644 index 000000000..5892e78d8 --- /dev/null +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/main_full.c @@ -0,0 +1,418 @@ +/* + FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd. + + FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME. PLEASE VISIT + http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and 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 modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. 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 itcan be + viewed here: http://www.freertos.org/a00114.html and also obtained by + writing to Real Time Engineers Ltd., contact details for whom are available + on the FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, and our new + fully thread aware and reentrant UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems, who sell the code with commercial support, + indemnification and middleware, under the OpenRTOS brand. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. +*/ + +/****************************************************************************** + * NOTE 1: This project provides two demo applications. A simple blinky style + * project, and a more comprehensive test and demo application. The + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select + * between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY + * in main.c. This file implements the comprehensive test and demo version. + * + * NOTE 2: This file only contains the source code that is specific to the + * full demo. Generic functions, such FreeRTOS hook functions, and functions + * required to configure the hardware, are defined in main.c. + ****************************************************************************** + * + * main_full() creates all the demo application tasks and two software timers, + * 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, tests and + * timers are created within this file: + * + * "Reg test" tasks - These fill the registers with known values, then check + * that each register still contains its expected value. Each task uses a + * different set of values. The reg test tasks execute with a very low priority, + * so get preempted very frequently. A register containing an unexpected value + * is indicative of an error in the context switching mechanism. + * + * The "Demo" Timer and Callback Function: + * The demo timer callback function does nothing more than increment a variable. + * The period of the demo timer is set relative to the period of the check timer + * (described below). This allows the check timer to know how many times the + * demo timer callback function should execute between each execution of the + * check timer callback function. The variable incremented in the demo timer + * callback function is used to determine how many times the callback function + * has executed. + * + * The "Check" Timer and Callback Function: + * The check timer period is initially set to three seconds. The check timer + * callback function checks that all the standard demo tasks, the reg test + * tasks, and the demo timer are not only still executing, but are executing + * without reporting any errors. If the check timer discovers that a task or + * timer has stalled, or reported an error, then it changes its own period from + * the initial three seconds, to just 200ms. The check timer callback function + * also toggles an LED each time it is called. This provides a visual + * indication of the system status: If the LED toggles every three seconds, + * then no issues have been discovered. If the LED toggles every 200ms, then + * an issue has been discovered with at least one task. + * + * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON + * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO + * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT! + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" + +/* Standard demo includes. */ +#include "dynamic.h" +#include "PollQ.h" +#include "blocktim.h" + +/* Hardware includes. */ +#include "port_iodefine.h" +#include "port_iodefine_ext.h" +#include "LED.h" + +/* The period at which the check timer will expire, in ms, provided no errors +have been reported by any of the standard demo tasks. ms are converted to the +equivalent in ticks using the portTICK_RATE_MS constant. */ +#define mainCHECK_TIMER_PERIOD_MS ( 3000UL / portTICK_RATE_MS ) + +/* The period at which the check timer will expire, in ms, if an error has been +reported in one of the standard demo tasks, the check tasks, or the demo timer. +ms are converted to the equivalent in ticks using the portTICK_RATE_MS +constant. */ +#define mainERROR_CHECK_TIMER_PERIOD_MS ( 200UL / portTICK_RATE_MS ) + +/* These two definitions are used to set the period of the demo timer. The demo +timer period is always relative to the check timer period, so the check timer +can determine if the demo timer has expired the expected number of times between +its own executions. */ +#define mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT ( 100UL ) +#define mainDEMO_TIMER_PERIOD_MS ( mainCHECK_TIMER_PERIOD_MS / mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT ) + +/* A block time of zero simply means "don't block". */ +#define mainDONT_BLOCK ( 0U ) + +/* Values that are passed as parameters into the reg test tasks (purely to +ensure task parameters are passed correctly). */ +#define mainREG_TEST_1_PARAMETER ( ( void * ) 0x1234 ) +#define mainREG_TEST_2_PARAMETER ( ( void * ) 0x5678 ) + +/*-----------------------------------------------------------*/ + +/* + * The 'check' timer callback function, as described at the top of this file. + */ +static void prvCheckTimerCallback( xTimerHandle xTimer ); + +/* + * The 'demo' timer callback function, as described at the top of this file. + */ +static void prvDemoTimerCallback( xTimerHandle xTimer ); + +/* + * Functions that define the RegTest tasks, as described at the top of this + * file. The RegTest tasks are written (necessarily) in assembler. Their + * entry points are written in C to allow for easy checking of the task + * parameter values. + */ +extern void vRegTest1Task( void ); +extern void vRegTest2Task( void ); +static void prvRegTest1Entry( void *pvParameters ); +static void prvRegTest2Entry( void *pvParameters ); + +/* + * Called if a RegTest task discovers an error as a mechanism to stop the + * tasks loop counter incrementing (so the check task can detect that an + * error exists). + */ +void vRegTestError( void ); + +/* + * Called by main() to create the more comprehensive application if + * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0. + */ +void main_full( void ); + +/*-----------------------------------------------------------*/ + +/* Variables that are incremented on each cycle of the two reg tests to allow +the check timer to know that they are still executing. */ +unsigned short usRegTest1LoopCounter = 0, usRegTest2LoopCounter; + +/* The check timer. This uses prvCheckTimerCallback() as its callback +function. */ +static xTimerHandle xCheckTimer = NULL; + +/* The demo timer. This uses prvDemoTimerCallback() as its callback function. */ +static xTimerHandle xDemoTimer = NULL; + +/* This variable is incremented each time the demo timer expires. */ +static volatile unsigned long ulDemoSoftwareTimerCounter = 0UL; + +/*-----------------------------------------------------------*/ + +void main_full( void ) +{ + /* Creates all the tasks and timers, then starts the scheduler. */ + + /* First create the 'standard demo' tasks. These are used to demonstrate + API functions being used and also to test the kernel port. More information + is provided on the FreeRTOS.org WEB site. */ + vStartDynamicPriorityTasks(); + vStartPolledQueueTasks( tskIDLE_PRIORITY ); + vCreateBlockTimeTasks(); + + /* Create the RegTest tasks as described at the top of this file. */ + xTaskCreate( prvRegTest1Entry, /* The function that implements the task. */ + ( const signed char * ) "Reg1",/* Text name for the task - to assist debugging only, not used by the kernel. */ + configMINIMAL_STACK_SIZE, /* The size of the stack allocated to the task (in words, not bytes). */ + mainREG_TEST_1_PARAMETER, /* The parameter passed into the task. */ + tskIDLE_PRIORITY, /* The priority at which the task will execute. */ + NULL ); /* Used to pass the handle of the created task out to the function caller - not used in this case. */ + + xTaskCreate( prvRegTest2Entry, ( const signed char * ) "Reg2", configMINIMAL_STACK_SIZE, mainREG_TEST_2_PARAMETER, tskIDLE_PRIORITY, NULL ); + + /* Create the software timer that performs the 'check' functionality, + as described at the top of this file. */ + xCheckTimer = xTimerCreate( ( const signed char * ) "CheckTimer",/* A text name, purely to help debugging. */ + ( mainCHECK_TIMER_PERIOD_MS ), /* The timer period, in this case 3000ms (3s). */ + pdTRUE, /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */ + ( void * ) 0, /* The ID is not used, so can be set to anything. */ + prvCheckTimerCallback /* The callback function that inspects the status of all the other tasks. */ + ); + + /* Create the software timer that just increments a variable for demo + purposes. */ + xDemoTimer = xTimerCreate( ( const signed char * ) "DemoTimer",/* A text name, purely to help debugging. */ + ( mainDEMO_TIMER_PERIOD_MS ), /* The timer period, in this case it is always calculated relative to the check timer period (see the definition of mainDEMO_TIMER_PERIOD_MS). */ + pdTRUE, /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */ + ( void * ) 0, /* The ID is not used, so can be set to anything. */ + prvDemoTimerCallback /* The callback function that inspects the status of all the other tasks. */ + ); + + /* Start both the check timer and the demo timer. The timers won't actually + start until the scheduler is started. */ + xTimerStart( xCheckTimer, mainDONT_BLOCK ); + xTimerStart( xDemoTimer, mainDONT_BLOCK ); + + /* Finally start the scheduler running. */ + vTaskStartScheduler(); + + /* If all is well execution will never reach here as the scheduler will be + running. If this null loop is reached then it is likely there was + insufficient FreeRTOS heap available for the idle task and/or timer task to + be created. See http://www.freertos.org/a00111.html. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvDemoTimerCallback( xTimerHandle xTimer ) +{ + /* Remove compiler warning about unused parameter. */ + ( void ) xTimer; + + /* The demo timer has expired. All it does is increment a variable. The + period of the demo timer is relative to that of the check timer, so the + check timer knows how many times this variable should have been incremented + between each execution of the check timer's own callback. */ + ulDemoSoftwareTimerCounter++; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTimerCallback( xTimerHandle xTimer ) +{ +static portBASE_TYPE xChangedTimerPeriodAlready = pdFALSE, xErrorStatus = pdPASS; +static unsigned short usLastRegTest1Counter = 0, usLastRegTest2Counter = 0; + + /* Remove compiler warning about unused parameter. */ + ( void ) xTimer; + + /* Inspect the status of the standard demo tasks. */ + if( xAreDynamicPriorityTasksStillRunning() != pdTRUE ) + { + xErrorStatus = pdFAIL; + } + + if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xErrorStatus = pdFAIL; + } + + if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xErrorStatus = pdFAIL; + } + + /* Indicate an error if either of the reg test loop counters have not + incremented since the last time this function was called. */ + if( usLastRegTest1Counter == usRegTest1LoopCounter ) + { + xErrorStatus = pdFAIL; + } + else + { + usLastRegTest1Counter = usRegTest1LoopCounter; + } + + if( usLastRegTest2Counter == usRegTest2LoopCounter ) + { + xErrorStatus = pdFAIL; + } + else + { + usLastRegTest2Counter = usRegTest2LoopCounter; + } + + /* Ensure that the demo software timer has expired + mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT times in between + each call of this function. A critical section is not required to access + ulDemoSoftwareTimerCounter as the variable is only accessed from another + software timer callback, and only one software timer callback can be + executing at any time. */ + if( ( ulDemoSoftwareTimerCounter < ( mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT - 1 ) ) || + ( ulDemoSoftwareTimerCounter > ( mainDEMO_TIMER_INCREMENTS_PER_CHECK_TIMER_TIMEOUT + 1 ) ) + ) + { + xErrorStatus = pdFAIL; + } + else + { + ulDemoSoftwareTimerCounter = 0UL; + } + + if( ( xErrorStatus == pdFAIL ) && ( xChangedTimerPeriodAlready == pdFALSE ) ) + { + /* An error has occurred, but the timer's period has not yet been changed, + change it now, and remember that it has been changed. Shortening the + timer's period means the LED will toggle at a faster rate, giving a + visible indication that something has gone wrong. */ + xChangedTimerPeriodAlready = pdTRUE; + + /* This call to xTimerChangePeriod() uses a zero block time. Functions + called from inside of a timer callback function must *never* attempt to + block. */ + xTimerChangePeriod( xCheckTimer, ( mainERROR_CHECK_TIMER_PERIOD_MS ), mainDONT_BLOCK ); + } + + /* Toggle the LED. The toggle rate will depend on whether or not an error + has been found in any tasks. */ + LED_BIT = !LED_BIT; +} +/*-----------------------------------------------------------*/ + +void vRegTestError( void ) +{ + /* Called by both reg test tasks if an error is found. There is no way out + of this function so the loop counter of the calling task will stop + incrementing, which will result in the check timer signaling an error. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvRegTest1Entry( void *pvParameters ) +{ + /* If the parameter has its expected value then start the first reg test + task (this is only done to test that the RTOS port is correctly handling + task parameters. */ + if( pvParameters == mainREG_TEST_1_PARAMETER ) + { + vRegTest1Task(); + } + else + { + vRegTestError(); + } + + /* It is not possible to get here as neither of the two functions called + above will ever return. */ +} +/*-----------------------------------------------------------*/ + +static void prvRegTest2Entry( void *pvParameters ) +{ + /* If the parameter has its expected value then start the first reg test + task (this is only done to test that the RTOS port is correctly handling + task parameters. */ + if( pvParameters == mainREG_TEST_2_PARAMETER ) + { + vRegTest2Task(); + } + else + { + vRegTestError(); + } + + /* It is not possible to get here as neither of the two functions called + above will ever return. */ +} +/*-----------------------------------------------------------*/ + diff --git a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/vector_table.c b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/vector_table.c index e029f61c4..7b4496dee 100644 --- a/FreeRTOS/Demo/RL78_E2Studio_GCC/src/vector_table.c +++ b/FreeRTOS/Demo/RL78_E2Studio_GCC/src/vector_table.c @@ -8,7 +8,7 @@ /* */ /* This file is generated by e2studio. */ /* */ -/***********************************************************************/ +/***********************************************************************/ #include "interrupt_handlers.h" @@ -16,9 +16,8 @@ extern void PowerON_Reset( void ); extern void vPortTickISR( void ); extern void vPortYield( void ); -#warning Check the options bytes. const unsigned char Option_Bytes[] __attribute__ ((section (".option_bytes"))) = { - 0x6e, 0xff, 0xe8, 0x85 /* 0x00U, 0xFFU, 0xF8U, 0x81U */ + 0x6e, 0xff, 0xe8, 0x85 }; const unsigned char Security_Id[] __attribute__ ((section (".security_id"))) = {