Please see my note book http://mbed.org/users/kenjiArai/notebook/freertos-on-mbed-board-with-mbed-cloud-ide--never-/

This is too old.
Below is another FreeRTOS on mbed.
http://developer.mbed.org/users/rgrover1/code/FreeRTOS/
I don't know it works well or not.
I have not evaluated it.

Committer:
kenjiArai
Date:
Sat Jan 01 11:17:45 2011 +0000
Revision:
0:d4960fcea8ff

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:d4960fcea8ff 1 /*
kenjiArai 0:d4960fcea8ff 2 FreeRTOS V6.0.3 - Copyright (C) 2010 Real Time Engineers Ltd.
kenjiArai 0:d4960fcea8ff 3
kenjiArai 0:d4960fcea8ff 4 ***************************************************************************
kenjiArai 0:d4960fcea8ff 5 * *
kenjiArai 0:d4960fcea8ff 6 * If you are: *
kenjiArai 0:d4960fcea8ff 7 * *
kenjiArai 0:d4960fcea8ff 8 * + New to FreeRTOS, *
kenjiArai 0:d4960fcea8ff 9 * + Wanting to learn FreeRTOS or multitasking in general quickly *
kenjiArai 0:d4960fcea8ff 10 * + Looking for basic training, *
kenjiArai 0:d4960fcea8ff 11 * + Wanting to improve your FreeRTOS skills and productivity *
kenjiArai 0:d4960fcea8ff 12 * *
kenjiArai 0:d4960fcea8ff 13 * then take a look at the FreeRTOS eBook *
kenjiArai 0:d4960fcea8ff 14 * *
kenjiArai 0:d4960fcea8ff 15 * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
kenjiArai 0:d4960fcea8ff 16 * http://www.FreeRTOS.org/Documentation *
kenjiArai 0:d4960fcea8ff 17 * *
kenjiArai 0:d4960fcea8ff 18 * A pdf reference manual is also available. Both are usually delivered *
kenjiArai 0:d4960fcea8ff 19 * to your inbox within 20 minutes to two hours when purchased between 8am *
kenjiArai 0:d4960fcea8ff 20 * and 8pm GMT (although please allow up to 24 hours in case of *
kenjiArai 0:d4960fcea8ff 21 * exceptional circumstances). Thank you for your support! *
kenjiArai 0:d4960fcea8ff 22 * *
kenjiArai 0:d4960fcea8ff 23 ***************************************************************************
kenjiArai 0:d4960fcea8ff 24
kenjiArai 0:d4960fcea8ff 25 This file is part of the FreeRTOS distribution.
kenjiArai 0:d4960fcea8ff 26
kenjiArai 0:d4960fcea8ff 27 FreeRTOS is free software; you can redistribute it and/or modify it under
kenjiArai 0:d4960fcea8ff 28 the terms of the GNU General Public License (version 2) as published by the
kenjiArai 0:d4960fcea8ff 29 Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
kenjiArai 0:d4960fcea8ff 30 ***NOTE*** The exception to the GPL is included to allow you to distribute
kenjiArai 0:d4960fcea8ff 31 a combined work that includes FreeRTOS without being obliged to provide the
kenjiArai 0:d4960fcea8ff 32 source code for proprietary components outside of the FreeRTOS kernel.
kenjiArai 0:d4960fcea8ff 33 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
kenjiArai 0:d4960fcea8ff 34 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
kenjiArai 0:d4960fcea8ff 35 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
kenjiArai 0:d4960fcea8ff 36 more details. You should have received a copy of the GNU General Public
kenjiArai 0:d4960fcea8ff 37 License and the FreeRTOS license exception along with FreeRTOS; if not it
kenjiArai 0:d4960fcea8ff 38 can be viewed here: http://www.freertos.org/a00114.html and also obtained
kenjiArai 0:d4960fcea8ff 39 by writing to Richard Barry, contact details for whom are available on the
kenjiArai 0:d4960fcea8ff 40 FreeRTOS WEB site.
kenjiArai 0:d4960fcea8ff 41
kenjiArai 0:d4960fcea8ff 42 1 tab == 4 spaces!
kenjiArai 0:d4960fcea8ff 43
kenjiArai 0:d4960fcea8ff 44 http://www.FreeRTOS.org - Documentation, latest information, license and
kenjiArai 0:d4960fcea8ff 45 contact details.
kenjiArai 0:d4960fcea8ff 46
kenjiArai 0:d4960fcea8ff 47 http://www.SafeRTOS.com - A version that is certified for use in safety
kenjiArai 0:d4960fcea8ff 48 critical systems.
kenjiArai 0:d4960fcea8ff 49
kenjiArai 0:d4960fcea8ff 50 http://www.OpenRTOS.com - Commercial support, development, porting,
kenjiArai 0:d4960fcea8ff 51 licensing and training services.
kenjiArai 0:d4960fcea8ff 52 */
kenjiArai 0:d4960fcea8ff 53
kenjiArai 0:d4960fcea8ff 54 /*
kenjiArai 0:d4960fcea8ff 55 * This version of integer. c is for use on systems that have limited stack
kenjiArai 0:d4960fcea8ff 56 * space and no display facilities. The complete version can be found in
kenjiArai 0:d4960fcea8ff 57 * the Demo/Common/Full directory.
kenjiArai 0:d4960fcea8ff 58 *
kenjiArai 0:d4960fcea8ff 59 * As with the full version, the tasks created in this file are a good test
kenjiArai 0:d4960fcea8ff 60 * of the scheduler context switch mechanism. The processor has to access
kenjiArai 0:d4960fcea8ff 61 * 32bit variables in two or four chunks (depending on the processor). The low
kenjiArai 0:d4960fcea8ff 62 * priority of these tasks means there is a high probability that a context
kenjiArai 0:d4960fcea8ff 63 * switch will occur mid calculation. See flop. c documentation for
kenjiArai 0:d4960fcea8ff 64 * more information.
kenjiArai 0:d4960fcea8ff 65 *
kenjiArai 0:d4960fcea8ff 66 */
kenjiArai 0:d4960fcea8ff 67
kenjiArai 0:d4960fcea8ff 68 /*
kenjiArai 0:d4960fcea8ff 69 Changes from V1.2.1
kenjiArai 0:d4960fcea8ff 70
kenjiArai 0:d4960fcea8ff 71 + The constants used in the calculations are larger to ensure the
kenjiArai 0:d4960fcea8ff 72 optimiser does not truncate them to 16 bits.
kenjiArai 0:d4960fcea8ff 73
kenjiArai 0:d4960fcea8ff 74 Changes from V1.2.3
kenjiArai 0:d4960fcea8ff 75
kenjiArai 0:d4960fcea8ff 76 + uxTaskCheck is now just used as a boolean. Instead of incrementing
kenjiArai 0:d4960fcea8ff 77 the variable each cycle of the task, the variable is simply set to
kenjiArai 0:d4960fcea8ff 78 true. sAreIntegerMathsTaskStillRunning() sets it back to false and
kenjiArai 0:d4960fcea8ff 79 expects it to have been set back to true by the time it is called
kenjiArai 0:d4960fcea8ff 80 again.
kenjiArai 0:d4960fcea8ff 81 + A division has been included in the calculation.
kenjiArai 0:d4960fcea8ff 82 */
kenjiArai 0:d4960fcea8ff 83
kenjiArai 0:d4960fcea8ff 84 #include <stdlib.h>
kenjiArai 0:d4960fcea8ff 85
kenjiArai 0:d4960fcea8ff 86 /* Scheduler include files. */
kenjiArai 0:d4960fcea8ff 87 #include "FreeRTOS.h"
kenjiArai 0:d4960fcea8ff 88 #include "task.h"
kenjiArai 0:d4960fcea8ff 89
kenjiArai 0:d4960fcea8ff 90 /* Demo program include files. */
kenjiArai 0:d4960fcea8ff 91 #include "integer.h"
kenjiArai 0:d4960fcea8ff 92
kenjiArai 0:d4960fcea8ff 93 /* The constants used in the calculation. */
kenjiArai 0:d4960fcea8ff 94 #define intgCONST1 ( ( long ) 123 )
kenjiArai 0:d4960fcea8ff 95 #define intgCONST2 ( ( long ) 234567 )
kenjiArai 0:d4960fcea8ff 96 #define intgCONST3 ( ( long ) -3 )
kenjiArai 0:d4960fcea8ff 97 #define intgCONST4 ( ( long ) 7 )
kenjiArai 0:d4960fcea8ff 98 #define intgEXPECTED_ANSWER ( ( ( intgCONST1 + intgCONST2 ) * intgCONST3 ) / intgCONST4 )
kenjiArai 0:d4960fcea8ff 99
kenjiArai 0:d4960fcea8ff 100 #define intgSTACK_SIZE configMINIMAL_STACK_SIZE
kenjiArai 0:d4960fcea8ff 101
kenjiArai 0:d4960fcea8ff 102 /* As this is the minimal version, we will only create one task. */
kenjiArai 0:d4960fcea8ff 103 #define intgNUMBER_OF_TASKS ( 1 )
kenjiArai 0:d4960fcea8ff 104
kenjiArai 0:d4960fcea8ff 105 /* The task function. Repeatedly performs a 32 bit calculation, checking the
kenjiArai 0:d4960fcea8ff 106 result against the expected result. If the result is incorrect then the
kenjiArai 0:d4960fcea8ff 107 context switch must have caused some corruption. */
kenjiArai 0:d4960fcea8ff 108 static portTASK_FUNCTION_PROTO( vCompeteingIntMathTask, pvParameters );
kenjiArai 0:d4960fcea8ff 109
kenjiArai 0:d4960fcea8ff 110 /* Variables that are set to true within the calculation task to indicate
kenjiArai 0:d4960fcea8ff 111 that the task is still executing. The check task sets the variable back to
kenjiArai 0:d4960fcea8ff 112 false, flagging an error if the variable is still false the next time it
kenjiArai 0:d4960fcea8ff 113 is called. */
kenjiArai 0:d4960fcea8ff 114 static volatile signed portBASE_TYPE xTaskCheck[ intgNUMBER_OF_TASKS ] = { ( signed portBASE_TYPE ) pdFALSE };
kenjiArai 0:d4960fcea8ff 115
kenjiArai 0:d4960fcea8ff 116 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 117
kenjiArai 0:d4960fcea8ff 118 void vStartIntegerMathTasks( unsigned portBASE_TYPE uxPriority )
kenjiArai 0:d4960fcea8ff 119 {
kenjiArai 0:d4960fcea8ff 120 short sTask;
kenjiArai 0:d4960fcea8ff 121
kenjiArai 0:d4960fcea8ff 122 for( sTask = 0; sTask < intgNUMBER_OF_TASKS; sTask++ )
kenjiArai 0:d4960fcea8ff 123 {
kenjiArai 0:d4960fcea8ff 124 xTaskCreate( vCompeteingIntMathTask, ( signed char * ) "IntMath", intgSTACK_SIZE, ( void * ) &( xTaskCheck[ sTask ] ), uxPriority, ( xTaskHandle * ) NULL );
kenjiArai 0:d4960fcea8ff 125 }
kenjiArai 0:d4960fcea8ff 126 }
kenjiArai 0:d4960fcea8ff 127 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 128
kenjiArai 0:d4960fcea8ff 129 static portTASK_FUNCTION( vCompeteingIntMathTask, pvParameters )
kenjiArai 0:d4960fcea8ff 130 {
kenjiArai 0:d4960fcea8ff 131 /* These variables are all effectively set to constants so they are volatile to
kenjiArai 0:d4960fcea8ff 132 ensure the compiler does not just get rid of them. */
kenjiArai 0:d4960fcea8ff 133 volatile long lValue;
kenjiArai 0:d4960fcea8ff 134 short sError = pdFALSE;
kenjiArai 0:d4960fcea8ff 135 volatile signed portBASE_TYPE *pxTaskHasExecuted;
kenjiArai 0:d4960fcea8ff 136
kenjiArai 0:d4960fcea8ff 137 /* Set a pointer to the variable we are going to set to true each
kenjiArai 0:d4960fcea8ff 138 iteration. This is also a good test of the parameter passing mechanism
kenjiArai 0:d4960fcea8ff 139 within each port. */
kenjiArai 0:d4960fcea8ff 140 pxTaskHasExecuted = ( volatile signed portBASE_TYPE * ) pvParameters;
kenjiArai 0:d4960fcea8ff 141
kenjiArai 0:d4960fcea8ff 142 /* Keep performing a calculation and checking the result against a constant. */
kenjiArai 0:d4960fcea8ff 143 for( ;; )
kenjiArai 0:d4960fcea8ff 144 {
kenjiArai 0:d4960fcea8ff 145 /* Perform the calculation. This will store partial value in
kenjiArai 0:d4960fcea8ff 146 registers, resulting in a good test of the context switch mechanism. */
kenjiArai 0:d4960fcea8ff 147 lValue = intgCONST1;
kenjiArai 0:d4960fcea8ff 148 lValue += intgCONST2;
kenjiArai 0:d4960fcea8ff 149
kenjiArai 0:d4960fcea8ff 150 /* Yield in case cooperative scheduling is being used. */
kenjiArai 0:d4960fcea8ff 151 #if configUSE_PREEMPTION == 0
kenjiArai 0:d4960fcea8ff 152 {
kenjiArai 0:d4960fcea8ff 153 taskYIELD();
kenjiArai 0:d4960fcea8ff 154 }
kenjiArai 0:d4960fcea8ff 155 #endif
kenjiArai 0:d4960fcea8ff 156
kenjiArai 0:d4960fcea8ff 157 /* Finish off the calculation. */
kenjiArai 0:d4960fcea8ff 158 lValue *= intgCONST3;
kenjiArai 0:d4960fcea8ff 159 lValue /= intgCONST4;
kenjiArai 0:d4960fcea8ff 160
kenjiArai 0:d4960fcea8ff 161 /* If the calculation is found to be incorrect we stop setting the
kenjiArai 0:d4960fcea8ff 162 TaskHasExecuted variable so the check task can see an error has
kenjiArai 0:d4960fcea8ff 163 occurred. */
kenjiArai 0:d4960fcea8ff 164 if( lValue != intgEXPECTED_ANSWER ) /*lint !e774 volatile used to prevent this being optimised out. */
kenjiArai 0:d4960fcea8ff 165 {
kenjiArai 0:d4960fcea8ff 166 sError = pdTRUE;
kenjiArai 0:d4960fcea8ff 167 }
kenjiArai 0:d4960fcea8ff 168
kenjiArai 0:d4960fcea8ff 169 if( sError == pdFALSE )
kenjiArai 0:d4960fcea8ff 170 {
kenjiArai 0:d4960fcea8ff 171 /* We have not encountered any errors, so set the flag that show
kenjiArai 0:d4960fcea8ff 172 we are still executing. This will be periodically cleared by
kenjiArai 0:d4960fcea8ff 173 the check task. */
kenjiArai 0:d4960fcea8ff 174 portENTER_CRITICAL();
kenjiArai 0:d4960fcea8ff 175 *pxTaskHasExecuted = pdTRUE;
kenjiArai 0:d4960fcea8ff 176 portEXIT_CRITICAL();
kenjiArai 0:d4960fcea8ff 177 }
kenjiArai 0:d4960fcea8ff 178
kenjiArai 0:d4960fcea8ff 179 /* Yield in case cooperative scheduling is being used. */
kenjiArai 0:d4960fcea8ff 180 #if configUSE_PREEMPTION == 0
kenjiArai 0:d4960fcea8ff 181 {
kenjiArai 0:d4960fcea8ff 182 taskYIELD();
kenjiArai 0:d4960fcea8ff 183 }
kenjiArai 0:d4960fcea8ff 184 #endif
kenjiArai 0:d4960fcea8ff 185 }
kenjiArai 0:d4960fcea8ff 186 }
kenjiArai 0:d4960fcea8ff 187 /*-----------------------------------------------------------*/
kenjiArai 0:d4960fcea8ff 188
kenjiArai 0:d4960fcea8ff 189 /* This is called to check that all the created tasks are still running. */
kenjiArai 0:d4960fcea8ff 190 portBASE_TYPE xAreIntegerMathsTaskStillRunning( void )
kenjiArai 0:d4960fcea8ff 191 {
kenjiArai 0:d4960fcea8ff 192 portBASE_TYPE xReturn = pdTRUE;
kenjiArai 0:d4960fcea8ff 193 short sTask;
kenjiArai 0:d4960fcea8ff 194
kenjiArai 0:d4960fcea8ff 195 /* Check the maths tasks are still running by ensuring their check variables
kenjiArai 0:d4960fcea8ff 196 are still being set to true. */
kenjiArai 0:d4960fcea8ff 197 for( sTask = 0; sTask < intgNUMBER_OF_TASKS; sTask++ )
kenjiArai 0:d4960fcea8ff 198 {
kenjiArai 0:d4960fcea8ff 199 if( xTaskCheck[ sTask ] == pdFALSE )
kenjiArai 0:d4960fcea8ff 200 {
kenjiArai 0:d4960fcea8ff 201 /* The check has not incremented so an error exists. */
kenjiArai 0:d4960fcea8ff 202 xReturn = pdFALSE;
kenjiArai 0:d4960fcea8ff 203 }
kenjiArai 0:d4960fcea8ff 204
kenjiArai 0:d4960fcea8ff 205 /* Reset the check variable so we can tell if it has been set by
kenjiArai 0:d4960fcea8ff 206 the next time around. */
kenjiArai 0:d4960fcea8ff 207 xTaskCheck[ sTask ] = pdFALSE;
kenjiArai 0:d4960fcea8ff 208 }
kenjiArai 0:d4960fcea8ff 209
kenjiArai 0:d4960fcea8ff 210 return xReturn;
kenjiArai 0:d4960fcea8ff 211 }
kenjiArai 0:d4960fcea8ff 212