00001
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 #include <stdio.h>
00087 #include <stdlib.h>
00088 #include <string.h>
00089
00090
00091 #include "power_clocks_lib.h"
00092
00093
00094 #include "FreeRTOS.h"
00095 #include "task.h"
00096
00097
00098 #include "partest.h"
00099 #include "serial.h"
00100 #include "integer.h"
00101 #include "comtest.h"
00102 #include "flash.h"
00103 #include "PollQ.h"
00104 #include "semtest.h"
00105 #include "dynamic.h"
00106 #include "BlockQ.h"
00107 #include "death.h"
00108 #include "flop.h"
00109
00113
00114 #define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
00115 #define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
00116 #define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
00117 #define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
00118 #define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 3 )
00119 #define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
00120 #define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
00122
00124 #define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 57600 )
00125
00128 #define mainCOM_TEST_LED ( 3 )
00129
00133 #define mainCHECK_TASK_LED ( 6 )
00134
00136 #define mainERROR_LED ( 7 )
00137
00139 #define mainCHECK_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
00140
00143 #define mainERROR_FLASH_RATE ( (portTickType) 500 / portTICK_RATE_MS )
00144
00147
00148 #define mainCOUNT_INITIAL_VALUE ( ( unsigned portLONG ) 0 )
00149 #define mainNO_TASK ( 0 )
00151
00152
00154
00155 #define mainMEM_CHECK_SIZE_1 ( ( size_t ) 51 )
00156 #define mainMEM_CHECK_SIZE_2 ( ( size_t ) 52 )
00157 #define mainMEM_CHECK_SIZE_3 ( ( size_t ) 15 )
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 static void vErrorChecks( void *pvParameters );
00169
00170
00171
00172
00173
00174 static portBASE_TYPE prvCheckOtherTasksAreStillRunning( void );
00175
00176
00177
00178
00179 static void vMemCheckTask( void *pvParameters );
00180
00181
00182
00183
00184
00185 static void prvIndicateError( void );
00186
00187
00188
00189 int main( void )
00190 {
00191
00192
00193
00194 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00195
00196 portDBG_TRACE("Starting the FreeRTOS AVR32 UC3 Demo...");
00197
00198
00199 vParTestInitialise();
00200
00201
00202
00203 vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
00204 vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
00205 vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
00206 vStartIntegerMathTasks( tskIDLE_PRIORITY );
00207 vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
00208 vStartDynamicPriorityTasks();
00209 #if BOARD != EVK1101
00210 vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
00211 vStartMathTasks( tskIDLE_PRIORITY );
00212 #endif
00213
00214
00215
00216 xTaskCreate(
00217 vErrorChecks
00218 , (const signed portCHAR *)"ErrCheck"
00219 , configMINIMAL_STACK_SIZE
00220 , NULL
00221 , mainCHECK_TASK_PRIORITY
00222 , NULL );
00223
00224
00225 vTaskStartScheduler();
00226
00227
00228
00229
00230 return 0;
00231 }
00232
00233
00237 static void vErrorChecks( void *pvParameters )
00238 {
00239 static volatile unsigned portLONG ulDummyVariable = 3UL;
00240 unsigned portLONG ulMemCheckTaskRunningCount;
00241 xTaskHandle xCreatedTask;
00242 portBASE_TYPE bSuicidalTask = 0;
00243
00244
00245 ( void ) pvParameters;
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 for( ;; )
00257 {
00258
00259 if( bSuicidalTask == 0 )
00260 {
00261 bSuicidalTask++;
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );
00272 }
00273
00274
00275
00276 xCreatedTask = mainNO_TASK;
00277
00278
00279
00280 ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE;
00281
00282 if( xTaskCreate( vMemCheckTask,
00283 ( signed portCHAR * ) "MEM_CHECK",
00284 configMINIMAL_STACK_SIZE,
00285 ( void * ) &ulMemCheckTaskRunningCount,
00286 tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS )
00287 {
00288
00289
00290
00291 prvIndicateError();
00292 }
00293
00294
00295 vTaskDelay( mainCHECK_PERIOD );
00296
00297
00298 if( xCreatedTask != mainNO_TASK )
00299 {
00300 vTaskDelete( xCreatedTask );
00301 }
00302
00303
00304
00305
00306 ulDummyVariable *= 3;
00307
00308
00309
00310 if( ( prvCheckOtherTasksAreStillRunning() != pdFALSE )
00311 || ( ulMemCheckTaskRunningCount == mainCOUNT_INITIAL_VALUE ) )
00312 {
00313
00314
00315
00316 prvIndicateError();
00317 }
00318 else
00319 {
00320
00321 vParTestToggleLED( mainCHECK_TASK_LED );
00322 }
00323 }
00324 }
00325
00326
00327
00331 static portBASE_TYPE prvCheckOtherTasksAreStillRunning( void )
00332 {
00333 static portBASE_TYPE xErrorHasOccurred = pdFALSE;
00334
00335 if( xAreComTestTasksStillRunning() != pdTRUE )
00336 {
00337 xErrorHasOccurred = pdTRUE;
00338 }
00339
00340 if( xArePollingQueuesStillRunning() != pdTRUE )
00341 {
00342 xErrorHasOccurred = pdTRUE;
00343 }
00344
00345 if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
00346 {
00347 xErrorHasOccurred = pdTRUE;
00348 }
00349
00350 if( xAreSemaphoreTasksStillRunning() != pdTRUE )
00351 {
00352 xErrorHasOccurred = pdTRUE;
00353 }
00354
00355 #if BOARD != EVK1101
00356 if( xAreBlockingQueuesStillRunning() != pdTRUE )
00357 {
00358 xErrorHasOccurred = pdTRUE;
00359 }
00360 #endif
00361
00362 if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
00363 {
00364 xErrorHasOccurred = pdTRUE;
00365 }
00366
00367 #if BOARD != EVK1101
00368 if( xAreMathsTaskStillRunning() != pdTRUE )
00369 {
00370 xErrorHasOccurred = pdTRUE;
00371 }
00372 #endif
00373
00374 if( xIsCreateTaskStillRunning() != pdTRUE )
00375 {
00376 xErrorHasOccurred = pdTRUE;
00377 }
00378
00379 return ( xErrorHasOccurred );
00380 }
00381
00382
00383
00391 static void vMemCheckTask( void *pvParameters )
00392 {
00393 unsigned portLONG *pulMemCheckTaskRunningCounter;
00394 void *pvMem1, *pvMem2, *pvMem3;
00395 static portLONG lErrorOccurred = pdFALSE;
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 pulMemCheckTaskRunningCounter = ( unsigned portLONG * ) pvParameters;
00409
00410 for( ;; )
00411 {
00412 if( lErrorOccurred == pdFALSE )
00413 {
00414
00415 ( *pulMemCheckTaskRunningCounter )++;
00416 }
00417 else
00418 {
00419
00420
00421 *pulMemCheckTaskRunningCounter = mainCOUNT_INITIAL_VALUE;
00422 }
00423
00424
00425
00426
00427
00428 vTaskSuspendAll();
00429 {
00430 pvMem1 = pvPortMalloc( mainMEM_CHECK_SIZE_1 );
00431
00432 if( pvMem1 == NULL )
00433 {
00434 lErrorOccurred = pdTRUE;
00435 }
00436 else
00437 {
00438 memset( pvMem1, 0xaa, mainMEM_CHECK_SIZE_1 );
00439 vPortFree( pvMem1 );
00440 }
00441 }
00442 xTaskResumeAll();
00443
00444
00445 vTaskSuspendAll();
00446 {
00447 pvMem2 = pvPortMalloc( mainMEM_CHECK_SIZE_2 );
00448
00449 if( pvMem2 == NULL )
00450 {
00451 lErrorOccurred = pdTRUE;
00452 }
00453 else
00454 {
00455 memset( pvMem2, 0xaa, mainMEM_CHECK_SIZE_2 );
00456 vPortFree( pvMem2 );
00457 }
00458 }
00459 xTaskResumeAll();
00460
00461
00462 vTaskSuspendAll();
00463 {
00464 pvMem3 = pvPortMalloc( mainMEM_CHECK_SIZE_3 );
00465 if( pvMem3 == NULL )
00466 {
00467 lErrorOccurred = pdTRUE;
00468 }
00469 else
00470 {
00471 memset( pvMem3, 0xaa, mainMEM_CHECK_SIZE_3 );
00472 vPortFree( pvMem3 );
00473 }
00474 }
00475 xTaskResumeAll();
00476 }
00477 }
00478
00479
00480 static void prvIndicateError( void )
00481 {
00482
00483
00484 vParTestSetLED(mainERROR_LED,pdTRUE);
00485
00486 #if BOARD == EVK1101 || BOARD == EVK1104 || BOARD == EVK1105
00487
00488 vParTestSetLED( 0, pdTRUE );
00489 vParTestSetLED( 1, pdTRUE );
00490 vParTestSetLED( 2, pdTRUE );
00491 vParTestSetLED( 3, pdTRUE );
00492 #endif
00493
00494 for(;;)
00495 {
00496 #if BOARD == EVK1100
00497 vParTestToggleLED( mainCHECK_TASK_LED );
00498 vTaskDelay( mainERROR_FLASH_RATE );
00499 #elif BOARD == EVK1101 || BOARD == EVK1104 || BOARD == EVK1105 || BOARD == UC3C_EK
00500 vParTestToggleLED( 0 );
00501 vParTestToggleLED( 1 );
00502 vParTestToggleLED( 2 );
00503 vParTestToggleLED( 3 );
00504 vTaskDelay( mainERROR_FLASH_RATE );
00505 #else
00506 #error You should define here the way of indicating an error on your board
00507 #endif
00508 }
00509 }