2 FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
\r
5 ***************************************************************************
\r
7 * FreeRTOS tutorial books are available in pdf and paperback. *
\r
8 * Complete, revised, and edited pdf reference manuals are also *
\r
11 * Purchasing FreeRTOS documentation will not only help you, by *
\r
12 * ensuring you get running as quickly as possible and with an *
\r
13 * in-depth knowledge of how to use FreeRTOS, it will also help *
\r
14 * the FreeRTOS project to continue with its mission of providing *
\r
15 * professional grade, cross platform, de facto standard solutions *
\r
16 * for microcontrollers - completely free of charge! *
\r
18 * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
\r
20 * Thank you for using FreeRTOS, and thank you for your support! *
\r
22 ***************************************************************************
\r
25 This file is part of the FreeRTOS distribution.
\r
27 FreeRTOS is free software; you can redistribute it and/or modify it under
\r
28 the terms of the GNU General Public License (version 2) as published by the
\r
29 Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
\r
30 >>>NOTE<<< The modification to the GPL is included to allow you to
\r
31 distribute a combined work that includes FreeRTOS without being obliged to
\r
32 provide the source code for proprietary components outside of the FreeRTOS
\r
33 kernel. FreeRTOS is distributed in the hope that it will be useful, but
\r
34 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
35 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
36 more details. You should have received a copy of the GNU General Public
\r
37 License and the FreeRTOS license exception along with FreeRTOS; if not it
\r
38 can be viewed here: http://www.freertos.org/a00114.html and also obtained
\r
39 by writing to Richard Barry, contact details for whom are available on the
\r
44 ***************************************************************************
\r
46 * Having a problem? Start by reading the FAQ "My application does *
\r
47 * not run, what could be wrong? *
\r
49 * http://www.FreeRTOS.org/FAQHelp.html *
\r
51 ***************************************************************************
\r
54 http://www.FreeRTOS.org - Documentation, training, latest information,
\r
55 license and contact details.
\r
57 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
\r
58 including FreeRTOS+Trace - an indispensable productivity tool.
\r
60 Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
\r
61 the code with commercial support, indemnification, and middleware, under
\r
62 the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
\r
63 provide a safety engineered and independently SIL3 certified version under
\r
64 the SafeRTOS brand: http://www.SafeRTOS.com.
\r
68 * Creates all the demo application tasks, then starts the scheduler.
\r
69 * In addition to the standard demo tasks, the following tasks and tests are
\r
70 * defined and/or created within this file:
\r
72 * "Check" task - This only executes every five seconds but has the highest
\r
73 * priority so is guaranteed to get processor time. Its main function is to
\r
74 * check that all the standard demo tasks are still operational. The check
\r
75 * task will write an error message to the console should an error be detected
\r
76 * within any of the demo tasks. The check task also toggles the LED defined
\r
77 * by mainCHECK_LED every 5 seconds while the system is error free, with the
\r
78 * toggle rate increasing to every 500ms should an error occur.
\r
80 * "Reg test" tasks - These fill the registers with known values, then check
\r
81 * that each register still contains its expected value. Each task uses
\r
82 * different values. The tasks run with very low priority so get preempted very
\r
83 * frequently. A register containing an unexpected value is indicative of an
\r
84 * error in the context switching mechanism.
\r
86 * See the online documentation for this demo for more information on interrupt
\r
90 /* Standard includes. */
\r
95 /* Scheduler includes. */
\r
96 #include "FreeRTOS.h"
\r
100 /* Demo application includes. */
\r
101 #include "partest.h"
\r
103 #include "blocktim.h"
\r
104 #include "semtest.h"
\r
105 #include "serial.h"
\r
106 #include "comtest.h"
\r
107 #include "GenQTest.h"
\r
109 #include "integer.h"
\r
111 #include "BlockQ.h"
\r
112 #include "dynamic.h"
\r
113 #include "countsem.h"
\r
114 #include "recmutex.h"
\r
117 /*-----------------------------------------------------------*/
\r
119 #error The batch file Demo\NiosII_CycloneIII_DBC3C40_GCC\CreateProjectDirectoryStructure.bat must be executed before the project is imported into the workspace. Failure to do this will result in the include paths stored in the project being deleted. Remove this line after CreateProjectDirectoryStructure.bat has been executed.
\r
121 /*-----------------------------------------------------------*/
\r
123 /* The rate at which the LED controlled by the 'check' task will toggle when no
\r
124 errors have been detected. */
\r
125 #define mainNO_ERROR_PERIOD ( 5000 )
\r
127 /* The rate at which the LED controlled by the 'check' task will toggle when an
\r
128 error has been detected. */
\r
129 #define mainERROR_PERIOD ( 500 )
\r
131 /* The LED toggled by the Check task. */
\r
132 #define mainCHECK_LED ( 7 )
\r
134 /* The first LED used by the ComTest tasks. One LED toggles each time a
\r
135 character is transmitted, and one each time a character is received and
\r
136 verified as being the expected character. */
\r
137 #define mainCOMTEST_LED ( 4 )
\r
139 /* Priority definitions for the tasks in the demo application. */
\r
140 #define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
\r
141 #define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
\r
142 #define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
\r
143 #define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
\r
144 #define mainQUEUE_BLOCK_PRIORITY ( tskIDLE_PRIORITY + 3 )
\r
145 #define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
\r
146 #define mainSEMAPHORE_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
\r
147 #define mainGENERIC_QUEUE_PRIORITY ( tskIDLE_PRIORITY )
\r
148 #define mainREG_TEST_PRIORITY ( tskIDLE_PRIORITY )
\r
151 #define mainDONT_WAIT ( 0 )
\r
153 /* The parameters passed to the reg test tasks. This is just done to check
\r
154 the parameter passing mechanism is working correctly. */
\r
155 #define mainREG_TEST_1_PARAMETER ( ( void * ) 0x12345678 )
\r
156 #define mainREG_TEST_2_PARAMETER ( ( void * ) 0x87654321 )
\r
158 /*-----------------------------------------------------------*/
\r
161 * Setup the processor ready for the demo.
\r
163 static void prvSetupHardware( void );
\r
166 * Execute all of the check functions to ensure the tests haven't failed.
\r
168 static void prvCheckTask( void *pvParameters );
\r
171 * The register test (or RegTest) tasks as described at the top of this file.
\r
173 static void prvFirstRegTestTask( void *pvParameters );
\r
174 static void prvSecondRegTestTask( void *pvParameters );
\r
176 /*-----------------------------------------------------------*/
\r
178 /* Counters that are incremented on each iteration of the RegTest tasks
\r
179 so long as no errors have been detected. */
\r
180 volatile unsigned long ulRegTest1Counter = 0UL, ulRegTest2Counter = 0UL;
\r
182 /*-----------------------------------------------------------*/
\r
185 * Create the demo tasks then start the scheduler.
\r
189 /* Configure any hardware required for this demo. */
\r
190 prvSetupHardware();
\r
192 /* Create all the other standard demo tasks. These serve no purpose other
\r
193 than to test the port and demonstrate the use of the FreeRTOS API. */
\r
194 vStartLEDFlashTasks( tskIDLE_PRIORITY );
\r
195 vStartIntegerMathTasks( mainGENERIC_QUEUE_PRIORITY );
\r
196 vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
\r
197 vStartBlockingQueueTasks( mainQUEUE_BLOCK_PRIORITY );
\r
198 vCreateBlockTimeTasks();
\r
199 vStartSemaphoreTasks( mainSEMAPHORE_TASK_PRIORITY );
\r
200 vStartDynamicPriorityTasks();
\r
201 vStartQueuePeekTasks();
\r
202 vStartGenericQueueTasks( mainGENERIC_QUEUE_PRIORITY );
\r
203 vStartCountingSemaphoreTasks();
\r
204 vStartRecursiveMutexTasks();
\r
205 vAltStartComTestTasks( mainCOM_TEST_PRIORITY, 0, mainCOMTEST_LED );
\r
207 /* prvCheckTask uses sprintf so requires more stack. */
\r
208 xTaskCreate( prvCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
\r
210 /* The RegTest tasks as described at the top of this file. */
\r
211 xTaskCreate( prvFirstRegTestTask, "Rreg1", configMINIMAL_STACK_SIZE, mainREG_TEST_1_PARAMETER, mainREG_TEST_PRIORITY, NULL );
\r
212 xTaskCreate( prvSecondRegTestTask, "Rreg2", configMINIMAL_STACK_SIZE, mainREG_TEST_2_PARAMETER, mainREG_TEST_PRIORITY, NULL );
\r
214 /* This task has to be created last as it keeps account of the number of tasks
\r
215 it expects to see running. */
\r
216 vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );
\r
218 /* Finally start the scheduler. */
\r
219 vTaskStartScheduler();
\r
221 /* Will only reach here if there is insufficient heap available to start
\r
225 /*-----------------------------------------------------------*/
\r
227 static void prvSetupHardware( void )
\r
229 /* Setup the digital IO for the LED's. */
\r
230 vParTestInitialise();
\r
232 /*-----------------------------------------------------------*/
\r
234 void vApplicationStackOverflowHook( void )
\r
236 /* Look at pxCurrentTCB to see which task overflowed its stack. */
\r
242 /*-----------------------------------------------------------*/
\r
244 void _general_exception_handler( unsigned long ulCause, unsigned long ulStatus )
\r
246 /* This overrides the definition provided by the kernel. Other exceptions
\r
247 should be handled here. */
\r
253 /*-----------------------------------------------------------*/
\r
255 static void prvCheckTask( void *pvParameters )
\r
257 portTickType xLastExecutionTime, ulTicksToWait = mainNO_ERROR_PERIOD;
\r
258 unsigned long ulLastRegTest1 = 0UL, ulLastRegTest2 = 0UL;
\r
259 const char * pcMessage;
\r
261 /* Initialise the variable used to control our iteration rate prior to
\r
263 xLastExecutionTime = xTaskGetTickCount();
\r
267 /* Wait until it is time to run the tests again. */
\r
268 vTaskDelayUntil( &xLastExecutionTime, ulTicksToWait );
\r
270 /* Have any of the standard demo tasks detected an error in their
\r
272 if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
\r
274 ulTicksToWait = mainERROR_PERIOD;
\r
275 pcMessage = "Error: Integer Maths.\n";
\r
277 else if( xAreGenericQueueTasksStillRunning() != pdTRUE )
\r
279 ulTicksToWait = mainERROR_PERIOD;
\r
280 pcMessage = "Error: GenQ.\n";
\r
282 else if( xAreBlockingQueuesStillRunning() != pdTRUE )
\r
284 ulTicksToWait = mainERROR_PERIOD;
\r
285 pcMessage = "Error: BlockQ.\n";
\r
287 else if( xArePollingQueuesStillRunning() != pdTRUE )
\r
289 ulTicksToWait = mainERROR_PERIOD;
\r
290 pcMessage = "Error: PollQ.\n";
\r
292 else if( xAreQueuePeekTasksStillRunning() != pdTRUE )
\r
294 ulTicksToWait = mainERROR_PERIOD;
\r
295 pcMessage = "Error: PeekQ.\n";
\r
297 else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
\r
299 ulTicksToWait = mainERROR_PERIOD;
\r
300 pcMessage = "Error: Block Time.\n";
\r
302 else if( xAreSemaphoreTasksStillRunning() != pdTRUE )
\r
304 ulTicksToWait = mainERROR_PERIOD;
\r
305 pcMessage = "Error: Semaphore Test.\n";
\r
307 else if( xAreComTestTasksStillRunning() != pdTRUE )
\r
309 ulTicksToWait = mainERROR_PERIOD;
\r
310 pcMessage = "Error: Comm Test.\n";
\r
312 else if( xIsCreateTaskStillRunning() != pdTRUE )
\r
314 ulTicksToWait = mainERROR_PERIOD;
\r
315 pcMessage = "Error: Suicidal Tasks.\n";
\r
317 else if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
\r
319 ulTicksToWait = mainERROR_PERIOD;
\r
320 pcMessage = "Error: Dynamic Priority.\n";
\r
322 else if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )
\r
324 ulTicksToWait = mainERROR_PERIOD;
\r
325 pcMessage = "Error: Count Semaphore.\n";
\r
327 else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
\r
329 ulTicksToWait = mainERROR_PERIOD;
\r
330 pcMessage = "Error: Recursive Mutex.\n";
\r
332 else if( ulLastRegTest1 == ulRegTest1Counter )
\r
334 /* ulRegTest1Counter is no longer being incremented, indicating
\r
335 that an error has been discovered in prvFirstRegTestTask(). */
\r
336 ulTicksToWait = mainERROR_PERIOD;
\r
337 pcMessage = "Error: Reg Test1.\n";
\r
339 else if( ulLastRegTest2 == ulRegTest2Counter )
\r
341 /* ulRegTest2Counter is no longer being incremented, indicating
\r
342 that an error has been discovered in prvSecondRegTestTask(). */
\r
343 ulTicksToWait = mainERROR_PERIOD;
\r
344 pcMessage = "Error: Reg Test2.\n";
\r
351 /* Remember the counter values this time around so a counter failing
\r
352 to be incremented correctly can be spotted. */
\r
353 ulLastRegTest1 = ulRegTest1Counter;
\r
354 ulLastRegTest2 = ulRegTest2Counter;
\r
356 /* Print out an error message if there is one. Mutual exclusion is
\r
357 not used as this is the only task accessing stdout. */
\r
358 if( pcMessage != NULL )
\r
360 printf( pcMessage );
\r
363 /* Provide visual feedback of the system status. If the LED is toggled
\r
364 every 5 seconds then no errors have been found. If the LED is toggled
\r
365 every 500ms then at least one error has been found. */
\r
366 vParTestToggleLED( mainCHECK_LED );
\r
369 /*-----------------------------------------------------------*/
\r
371 static void prvFirstRegTestTask( void *pvParameters )
\r
373 /* Check the parameters are passed in as expected. */
\r
374 if( pvParameters != mainREG_TEST_1_PARAMETER )
\r
376 /* Don't execute any further so an error is recognised by the check
\r
378 vTaskDelete( NULL );
\r
381 /* Fill registers with known values, then check that each register still
\r
382 contains its expected value. An incorrect value is indicative of an error
\r
383 in the context switching process.
\r
385 If no errors are found ulRegTest1Counter is incremented. The check task
\r
386 will recognise an error if ulRegTest1Counter stops being incremented.
\r
387 This task also performs a manual yield in the middle of its execution, just
\r
388 to increase the test coverage. */
\r
390 " .extern ulRegTest1Counter \n" \
\r
392 " addi r3, r0, 3 \n" \
\r
393 " addi r4, r0, 4 \n" \
\r
394 " addi r5, r0, 5 \n" \
\r
395 " addi r6, r0, 6 \n" \
\r
396 " addi r7, r0, 7 \n" \
\r
397 " addi r8, r0, 8 \n" \
\r
398 " addi r9, r0, 9 \n" \
\r
399 " addi r10, r0, 10 \n" \
\r
400 " addi r11, r0, 11 \n" \
\r
401 " addi r12, r0, 12 \n" \
\r
402 " addi r13, r0, 13 \n" \
\r
403 " addi r14, r0, 14 \n" \
\r
404 " addi r15, r0, 15 \n" \
\r
405 " addi r16, r0, 16 \n" \
\r
406 " addi r17, r0, 17 \n" \
\r
407 " addi r18, r0, 18 \n" \
\r
408 " addi r19, r0, 19 \n" \
\r
409 " addi r20, r0, 20 \n" \
\r
410 " addi r21, r0, 21 \n" \
\r
411 " addi r22, r0, 22 \n" \
\r
412 " addi r23, r0, 23 \n" \
\r
413 " addi r28, r0, 28 \n" \
\r
414 " addi r31, r0, 31 \n" \
\r
416 " addi r2, r0, 0 \n" \
\r
418 " bne r2, r0, RegTest1Error \n" \
\r
419 " addi r2, r0, 3 \n" \
\r
420 " bne r2, r3, RegTest1Error \n" \
\r
421 " addi r2, r0, 4 \n" \
\r
422 " bne r2, r4, RegTest1Error \n" \
\r
423 " addi r2, r0, 5 \n" \
\r
424 " bne r2, r5, RegTest1Error \n" \
\r
425 " addi r2, r0, 6 \n" \
\r
426 " bne r2, r6, RegTest1Error \n" \
\r
427 " addi r2, r0, 7 \n" \
\r
428 " bne r2, r7, RegTest1Error \n" \
\r
429 " addi r2, r0, 8 \n" \
\r
430 " bne r2, r8, RegTest1Error \n" \
\r
431 " addi r2, r0, 9 \n" \
\r
432 " bne r2, r9, RegTest1Error \n" \
\r
433 " addi r2, r0, 10 \n" \
\r
434 " bne r2, r10, RegTest1Error \n" \
\r
435 " addi r2, r0, 11 \n" \
\r
436 " bne r2, r11, RegTest1Error \n" \
\r
437 " addi r2, r0, 12 \n" \
\r
438 " bne r2, r12, RegTest1Error \n" \
\r
439 " addi r2, r0, 13 \n" \
\r
440 " bne r2, r13, RegTest1Error \n" \
\r
441 " addi r2, r0, 14 \n" \
\r
442 " bne r2, r14, RegTest1Error \n" \
\r
443 " addi r2, r0, 15 \n" \
\r
444 " bne r2, r15, RegTest1Error \n" \
\r
445 " addi r2, r0, 16 \n" \
\r
446 " bne r2, r16, RegTest1Error \n" \
\r
447 " addi r2, r0, 17 \n" \
\r
448 " bne r2, r17, RegTest1Error \n" \
\r
449 " addi r2, r0, 18 \n" \
\r
450 " bne r2, r18, RegTest1Error \n" \
\r
451 " addi r2, r0, 19 \n" \
\r
452 " bne r2, r19, RegTest1Error \n" \
\r
453 " addi r2, r0, 20 \n" \
\r
454 " bne r2, r20, RegTest1Error \n" \
\r
455 " addi r2, r0, 21 \n" \
\r
456 " bne r2, r21, RegTest1Error \n" \
\r
457 " addi r2, r0, 22 \n" \
\r
458 " bne r2, r22, RegTest1Error \n" \
\r
459 " addi r2, r0, 23 \n" \
\r
460 " bne r2, r23, RegTest1Error \n" \
\r
461 " addi r2, r0, 28 \n" \
\r
462 " bne r2, r28, RegTest1Error \n" \
\r
463 " addi r2, r0, 31 \n" \
\r
464 " bne r2, r31, RegTest1Error \n" \
\r
465 " ldw r2, %gprel(ulRegTest1Counter)(gp) \n" \
\r
466 " addi r2, r2, 1 \n" \
\r
467 " stw r2, %gprel(ulRegTest1Counter)(gp) \n" \
\r
468 " br RegTest1 \n" \
\r
469 "RegTest1Error: \n" \
\r
470 " br RegTest1Error \n"
\r
473 /*-----------------------------------------------------------*/
\r
475 static void prvSecondRegTestTask( void *pvParameters )
\r
477 /* Check the parameters are passed in as expected. */
\r
478 if( pvParameters != mainREG_TEST_2_PARAMETER )
\r
480 /* Don't execute any further so an error is recognised by the check
\r
482 vTaskDelete( NULL );
\r
485 /* Fill registers with known values, then check that each register still
\r
486 contains its expected value. An incorrect value is indicative of an error
\r
487 in the context switching process.
\r
489 If no errors are found ulRegTest2Counter is incremented. The check task
\r
490 will recognise an error if ulRegTest2Counter stops being incremented. */
\r
492 " .extern ulRegTest2Counter \n" \
\r
494 " addi r3, r0, 3 \n" \
\r
495 " addi r4, r0, 4 \n" \
\r
496 " addi r5, r0, 5 \n" \
\r
497 " addi r6, r0, 6 \n" \
\r
498 " addi r7, r0, 7 \n" \
\r
499 " addi r8, r0, 8 \n" \
\r
500 " addi r9, r0, 9 \n" \
\r
501 " addi r10, r0, 10 \n" \
\r
502 " addi r11, r0, 11 \n" \
\r
503 " addi r12, r0, 12 \n" \
\r
504 " addi r13, r0, 13 \n" \
\r
505 " addi r14, r0, 14 \n" \
\r
506 " addi r15, r0, 15 \n" \
\r
507 " addi r16, r0, 16 \n" \
\r
508 " addi r17, r0, 17 \n" \
\r
509 " addi r18, r0, 18 \n" \
\r
510 " addi r19, r0, 19 \n" \
\r
511 " addi r20, r0, 20 \n" \
\r
512 " addi r21, r0, 21 \n" \
\r
513 " addi r22, r0, 22 \n" \
\r
514 " addi r23, r0, 23 \n" \
\r
515 " addi r28, r0, 28 \n" \
\r
516 " addi r31, r0, 31 \n" \
\r
518 " addi r2, r0, 0 \n" \
\r
519 " bne r2, r0, RegTest2Error \n" \
\r
520 " addi r2, r0, 3 \n" \
\r
521 " bne r2, r3, RegTest2Error \n" \
\r
522 " addi r2, r0, 4 \n" \
\r
523 " bne r2, r4, RegTest2Error \n" \
\r
524 " addi r2, r0, 5 \n" \
\r
525 " bne r2, r5, RegTest2Error \n" \
\r
526 " addi r2, r0, 6 \n" \
\r
527 " bne r2, r6, RegTest2Error \n" \
\r
528 " addi r2, r0, 7 \n" \
\r
529 " bne r2, r7, RegTest2Error \n" \
\r
530 " addi r2, r0, 8 \n" \
\r
531 " bne r2, r8, RegTest2Error \n" \
\r
532 " addi r2, r0, 9 \n" \
\r
533 " bne r2, r9, RegTest2Error \n" \
\r
534 " addi r2, r0, 10 \n" \
\r
535 " bne r2, r10, RegTest2Error \n" \
\r
536 " addi r2, r0, 11 \n" \
\r
537 " bne r2, r11, RegTest2Error \n" \
\r
538 " addi r2, r0, 12 \n" \
\r
539 " bne r2, r12, RegTest2Error \n" \
\r
540 " addi r2, r0, 13 \n" \
\r
541 " bne r2, r13, RegTest2Error \n" \
\r
542 " addi r2, r0, 14 \n" \
\r
543 " bne r2, r14, RegTest2Error \n" \
\r
544 " addi r2, r0, 15 \n" \
\r
545 " bne r2, r15, RegTest2Error \n" \
\r
546 " addi r2, r0, 16 \n" \
\r
547 " bne r2, r16, RegTest2Error \n" \
\r
548 " addi r2, r0, 17 \n" \
\r
549 " bne r2, r17, RegTest2Error \n" \
\r
550 " addi r2, r0, 18 \n" \
\r
551 " bne r2, r18, RegTest2Error \n" \
\r
552 " addi r2, r0, 19 \n" \
\r
553 " bne r2, r19, RegTest2Error \n" \
\r
554 " addi r2, r0, 20 \n" \
\r
555 " bne r2, r20, RegTest2Error \n" \
\r
556 " addi r2, r0, 21 \n" \
\r
557 " bne r2, r21, RegTest2Error \n" \
\r
558 " addi r2, r0, 22 \n" \
\r
559 " bne r2, r22, RegTest2Error \n" \
\r
560 " addi r2, r0, 23 \n" \
\r
561 " bne r2, r23, RegTest2Error \n" \
\r
562 " addi r2, r0, 28 \n" \
\r
563 " bne r2, r28, RegTest2Error \n" \
\r
564 " addi r2, r0, 31 \n" \
\r
565 " bne r2, r31, RegTest2Error \n" \
\r
566 " ldw r2, %gprel(ulRegTest2Counter)(gp) \n" \
\r
567 " addi r2, r2, 1 \n" \
\r
568 " stw r2, %gprel(ulRegTest2Counter)(gp) \n" \
\r
569 " br RegTest2 \n" \
\r
570 "RegTest2Error: \n" \
\r
571 " br RegTest2Error \n"
\r
574 /*-----------------------------------------------------------*/
\r